From 051bb63a81f8809c587d6a7d82ed2c4a16bdaa9c Mon Sep 17 00:00:00 2001 From: Skylot Date: Sat, 4 Apr 2015 20:56:15 +0300 Subject: [PATCH] core: rename classes for case-insensitive systems (fix #24) --- .../java/jadx/core/deobf/Deobfuscator.java | 20 +++++++++++--- .../jadx/core/dex/visitors/RenameVisitor.java | 26 ++++++++++++++++--- 2 files changed, 38 insertions(+), 8 deletions(-) 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 90a5f4c9b..207b6c720 100644 --- a/jadx-core/src/main/java/jadx/core/deobf/Deobfuscator.java +++ b/jadx-core/src/main/java/jadx/core/deobf/Deobfuscator.java @@ -198,11 +198,18 @@ public class Deobfuscator { return; } if (shouldRename(classInfo.getShortName())) { - alias = makeClsAlias(cls); - clsMap.put(classInfo, new DeobfClsInfo(this, cls, pkg, alias)); + makeClsAlias(cls); } } + public String getClsAlias(ClassNode cls) { + DeobfClsInfo deobfClsInfo = clsMap.get(cls.getClassInfo()); + if (deobfClsInfo != null) { + return deobfClsInfo.getAlias(); + } + return makeClsAlias(cls); + } + private String makeClsAlias(ClassNode cls) { SourceFileAttr sourceFileAttr = cls.get(AType.SOURCE_FILE); if (sourceFileAttr != null) { @@ -217,8 +224,13 @@ public class Deobfuscator { return name; } } - String clsName = cls.getClassInfo().getShortName(); - return String.format("C%04d%s", clsIndex++, makeName(clsName)); + ClassInfo classInfo = cls.getClassInfo(); + String clsName = classInfo.getShortName(); + String alias = String.format("C%04d%s", clsIndex++, makeName(clsName)); + + PackageNode pkg = getPackageNode(classInfo.getPackage(), true); + clsMap.put(classInfo, new DeobfClsInfo(this, cls, pkg, alias)); + return alias; } @Nullable 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 000746566..feaf8affb 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 @@ -19,8 +19,12 @@ import java.io.File; import java.util.HashSet; import java.util.Set; +import org.apache.commons.io.IOCase; + public class RenameVisitor extends AbstractVisitor { + private static final boolean CASE_SENSITIVE_FS = IOCase.SYSTEM.isCaseSensitive(); + private Deobfuscator deobfuscator; @Override @@ -30,12 +34,9 @@ public class RenameVisitor extends AbstractVisitor { deobfuscator = new Deobfuscator(args, root.getDexNodes(), deobfMapFile); boolean deobfuscationOn = args.isDeobfuscationOn(); if (deobfuscationOn) { - // TODO: check classes for case sensitive names (issue #24) deobfuscator.execute(); } - for (ClassNode classNode : root.getClasses(true)) { - checkClassName(classNode); - } + checkClasses(root); } @Override @@ -48,6 +49,23 @@ public class RenameVisitor extends AbstractVisitor { return false; } + private void checkClasses(RootNode root) { + Set clsNames = new HashSet(); + for (ClassNode cls : root.getClasses(true)) { + checkClassName(cls); + if (!CASE_SENSITIVE_FS) { + ClassInfo classInfo = cls.getClassInfo(); + String clsFileName = classInfo.getAlias().getFullPath(); + if (!clsNames.add(clsFileName.toLowerCase())) { + String newShortName = deobfuscator.getClsAlias(cls); + String newFullName = classInfo.makeFullClsName(newShortName, true); + classInfo.rename(cls.dex(), newFullName); + clsNames.add(classInfo.getAlias().getFullPath().toLowerCase()); + } + } + } + } + private void checkClassName(ClassNode cls) { ClassInfo classInfo = cls.getClassInfo(); String clsName = classInfo.getAlias().getShortName();