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 {
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) {
......@@ -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
......
......@@ -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<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) {
ClassInfo classInfo = cls.getClassInfo();
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