Commit 051bb63a authored by Skylot's avatar Skylot

core: rename classes for case-insensitive systems (fix #24)

parent e4f4de6c
...@@ -198,9 +198,16 @@ public class Deobfuscator { ...@@ -198,9 +198,16 @@ public class Deobfuscator {
return; return;
} }
if (shouldRename(classInfo.getShortName())) { if (shouldRename(classInfo.getShortName())) {
alias = makeClsAlias(cls); makeClsAlias(cls);
clsMap.put(classInfo, new DeobfClsInfo(this, cls, pkg, alias)); }
}
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) { private String makeClsAlias(ClassNode cls) {
...@@ -217,8 +224,13 @@ public class Deobfuscator { ...@@ -217,8 +224,13 @@ public class Deobfuscator {
return name; return name;
} }
} }
String clsName = cls.getClassInfo().getShortName(); ClassInfo classInfo = cls.getClassInfo();
return String.format("C%04d%s", clsIndex++, makeName(clsName)); 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 @Nullable
......
...@@ -19,8 +19,12 @@ import java.io.File; ...@@ -19,8 +19,12 @@ import java.io.File;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
import org.apache.commons.io.IOCase;
public class RenameVisitor extends AbstractVisitor { public class RenameVisitor extends AbstractVisitor {
private static final boolean CASE_SENSITIVE_FS = IOCase.SYSTEM.isCaseSensitive();
private Deobfuscator deobfuscator; private Deobfuscator deobfuscator;
@Override @Override
...@@ -30,12 +34,9 @@ public class RenameVisitor extends AbstractVisitor { ...@@ -30,12 +34,9 @@ public class RenameVisitor extends AbstractVisitor {
deobfuscator = new Deobfuscator(args, root.getDexNodes(), deobfMapFile); deobfuscator = new Deobfuscator(args, root.getDexNodes(), deobfMapFile);
boolean deobfuscationOn = args.isDeobfuscationOn(); boolean deobfuscationOn = args.isDeobfuscationOn();
if (deobfuscationOn) { if (deobfuscationOn) {
// TODO: check classes for case sensitive names (issue #24)
deobfuscator.execute(); deobfuscator.execute();
} }
for (ClassNode classNode : root.getClasses(true)) { checkClasses(root);
checkClassName(classNode);
}
} }
@Override @Override
...@@ -48,6 +49,23 @@ public class RenameVisitor extends AbstractVisitor { ...@@ -48,6 +49,23 @@ public class RenameVisitor extends AbstractVisitor {
return false; return false;
} }
private void checkClasses(RootNode root) {
Set<String> clsNames = new HashSet<String>();
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) { private void checkClassName(ClassNode cls) {
ClassInfo classInfo = cls.getClassInfo(); ClassInfo classInfo = cls.getClassInfo();
String clsName = classInfo.getAlias().getShortName(); String clsName = classInfo.getAlias().getShortName();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment