diff --git a/jadx-core/src/main/java/jadx/core/deobf/Deobfuscator.java b/jadx-core/src/main/java/jadx/core/deobf/Deobfuscator.java index eafa334401e..56a355697b0 100644 --- a/jadx-core/src/main/java/jadx/core/deobf/Deobfuscator.java +++ b/jadx-core/src/main/java/jadx/core/deobf/Deobfuscator.java @@ -346,7 +346,7 @@ private void preProcessClass(ClassNode cls) { ClassInfo classInfo = cls.getClassInfo(); String pkgFullName = classInfo.getPackage(); PackageNode pkg = getPackageNode(pkgFullName, true); - doPkg(pkg, pkgFullName); + processPackageFull(pkg, pkgFullName); String alias = deobfPresets.getForCls(classInfo); if (alias != null) { @@ -372,6 +372,24 @@ public String getClsAlias(ClassNode cls) { return makeClsAlias(cls); } + public String getPkgAlias(ClassNode cls) { + ClassInfo classInfo = cls.getClassInfo(); + PackageNode pkg = null; + DeobfClsInfo deobfClsInfo = clsMap.get(classInfo); + if (deobfClsInfo != null) { + pkg = deobfClsInfo.getPkg(); + } else { + String fullPkgName = classInfo.getPackage(); + pkg = getPackageNode(fullPkgName, true); + processPackageFull(pkg, fullPkgName); + } + if (pkg.hasAnyAlias()) { + return pkg.getFullAlias(); + } else { + return pkg.getFullName(); + } + } + private String makeClsAlias(ClassNode cls) { ClassInfo classInfo = cls.getClassInfo(); String alias = null; @@ -472,7 +490,7 @@ public String makeMethodAlias(MethodNode mth) { return alias; } - private void doPkg(PackageNode pkg, String fullName) { + private void processPackageFull(PackageNode pkg, String fullName) { if (pkgSet.contains(fullName)) { return; } @@ -482,15 +500,19 @@ private void doPkg(PackageNode pkg, String fullName) { PackageNode parentPkg = pkg.getParentPackage(); while (!parentPkg.getName().isEmpty()) { if (!parentPkg.hasAlias()) { - doPkg(parentPkg, parentPkg.getFullName()); + processPackageFull(parentPkg, parentPkg.getFullName()); } parentPkg = parentPkg.getParentPackage(); } - String pkgName = pkg.getName(); - if (!pkg.hasAlias() && shouldRename(pkgName)) { - String pkgAlias = String.format("p%03d%s", pkgIndex++, prepareNamePart(pkgName)); - pkg.setAlias(pkgAlias); + if (!pkg.hasAlias()) { + String pkgName = pkg.getName(); + if ((args.isDeobfuscationOn() && shouldRename(pkgName)) + || (args.isRenameValid() && !NameMapper.isValidIdentifier(pkgName)) + || (args.isRenamePrintable() && !NameMapper.isAllCharsPrintable(pkgName))) { + String pkgAlias = String.format("p%03d%s", pkgIndex++, prepareNamePart(pkg.getName())); + pkg.setAlias(pkgAlias); + } } } diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/RenameVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/RenameVisitor.java index 9f2ca19b059..ce441834ec1 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/RenameVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/RenameVisitor.java @@ -95,25 +95,37 @@ private static void checkClassName(Deobfuscator deobfuscator, ClassNode cls, Jad classInfo.changeShortName(newShortName); cls.addAttr(new RenameReasonAttr(cls).append("invalid class name")); } - if (args.isRenameValid()) { - if (classInfo.isInner()) { - ClassInfo parentClass = classInfo.getParentClass(); - while (parentClass != null) { - if (parentClass.getAliasShortName().equals(clsName)) { - String clsAlias = deobfuscator.getClsAlias(cls); - classInfo.changeShortName(clsAlias); - cls.addAttr(new RenameReasonAttr(cls).append("collision with other inner class name")); - break; - } - parentClass = parentClass.getParentClass(); - } - } else { - if (classInfo.getAliasPkg().isEmpty()) { - classInfo.changePkg(Consts.DEFAULT_PACKAGE_NAME); - cls.addAttr(new RenameReasonAttr(cls).append("default package")); + if (classInfo.isInner() && args.isRenameValid()) { + // check inner classes names + ClassInfo parentClass = classInfo.getParentClass(); + while (parentClass != null) { + if (parentClass.getAliasShortName().equals(clsName)) { + String clsAlias = deobfuscator.getClsAlias(cls); + classInfo.changeShortName(clsAlias); + cls.addAttr(new RenameReasonAttr(cls).append("collision with other inner class name")); + break; } + parentClass = parentClass.getParentClass(); } } + checkPackage(deobfuscator, cls, classInfo, args); + } + + private static void checkPackage(Deobfuscator deobfuscator, ClassNode cls, ClassInfo classInfo, JadxArgs args) { + if (classInfo.isInner()) { + return; + } + String aliasPkg = classInfo.getAliasPkg(); + if (args.isRenameValid() && aliasPkg.isEmpty()) { + classInfo.changePkg(Consts.DEFAULT_PACKAGE_NAME); + cls.addAttr(new RenameReasonAttr(cls).append("default package")); + return; + } + String fullPkgAlias = deobfuscator.getPkgAlias(cls); + if (!fullPkgAlias.equals(aliasPkg)) { + classInfo.changePkg(fullPkgAlias); + cls.addAttr(new RenameReasonAttr(cls).append("invalid package")); + } } @Nullable diff --git a/jadx-core/src/main/java/jadx/core/utils/CodeGenUtils.java b/jadx-core/src/main/java/jadx/core/utils/CodeGenUtils.java index 8aa639872af..a16501079a1 100644 --- a/jadx-core/src/main/java/jadx/core/utils/CodeGenUtils.java +++ b/jadx-core/src/main/java/jadx/core/utils/CodeGenUtils.java @@ -22,7 +22,7 @@ public static void addRenamedComment(CodeWriter code, AttrNode node, String orig code.startLine("/* renamed from: ").add(origName); RenameReasonAttr renameReasonAttr = node.get(AType.RENAME_REASON); if (renameReasonAttr != null) { - code.add(" reason: "); + code.add(" reason: "); code.add(renameReasonAttr.getDescription()); } code.add(" */"); diff --git a/jadx-core/src/test/java/jadx/tests/integration/names/TestReservedPackageNames.java b/jadx-core/src/test/java/jadx/tests/integration/names/TestReservedPackageNames.java new file mode 100644 index 00000000000..db0d0504949 --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/names/TestReservedPackageNames.java @@ -0,0 +1,59 @@ +package jadx.tests.integration.names; + +import java.util.List; + +import org.junit.jupiter.api.Test; + +import jadx.core.dex.nodes.ClassNode; +import jadx.tests.api.SmaliTest; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.not; + +public class TestReservedPackageNames extends SmaliTest { + + // @formatter:off + /* + package do.if; + + public class A {} + */ + // @formatter:on + + @Test + public void test() { + List clsList = loadFromSmaliFiles(); + for (ClassNode cls : clsList) { + String code = cls.getCode().toString(); + assertThat(code, not(containsString("package do.if;"))); + } + } + + @Test + public void testDeobf() { + enableDeobfuscation(); + List clsList = loadFromSmaliFiles(); + for (ClassNode cls : clsList) { + String code = cls.getCode().toString(); + assertThat(code, not(containsString("package do.if;"))); + } + } + + @Test + public void testRenameDisabled() { + args.setRenameCaseSensitive(false); + args.setRenameValid(false); + args.setRenamePrintable(false); + + disableCompilation(); + + List clsList = loadFromSmaliFiles(); + for (ClassNode cls : clsList) { + String code = cls.getCode().toString(); + if (cls.getShortName().equals("A")) { + assertThat(code, containsString("package do.if;")); + } + } + } +} diff --git a/jadx-core/src/test/smali/names/TestReservedPackageNames/a.smali b/jadx-core/src/test/smali/names/TestReservedPackageNames/a.smali new file mode 100644 index 00000000000..83c3180ad67 --- /dev/null +++ b/jadx-core/src/test/smali/names/TestReservedPackageNames/a.smali @@ -0,0 +1,2 @@ +.class public Ldo/if/A; +.super Ljava/lang/Object;