core: rename classes for case-insensitive systems (fix #24)
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user