From e263694eacb261f1c000157a1359830f755ace14 Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 11 Jul 2015 11:33:40 -0400 Subject: [PATCH] Rest of rename unique. Untested but asm looks ok. --- .../code/instructions/InvokeInterface.java | 13 ++++++++++++ .../code/instructions/InvokeSpecial.java | 13 ++++++++++++ .../code/instructions/InvokeStatic.java | 13 ++++++++++++ .../code/instructions/InvokeVirtual.java | 13 ++++++++++++ .../deob/deobfuscators/RenameUnique.java | 20 ++++++++++++------- 5 files changed, 65 insertions(+), 7 deletions(-) diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/InvokeInterface.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/InvokeInterface.java index c78cb7b809..b9c3c89525 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/InvokeInterface.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/InvokeInterface.java @@ -162,6 +162,19 @@ public class InvokeInterface extends Instruction implements InvokeInstruction { if (method.getClassEntry().getName().equals(cf.getName())) method = new InterfaceMethod(new Class(name), method.getNameAndType()); + + Signature signature = method.getNameAndType().getDescriptor(); + for (int i = 0; i < signature.size(); ++i) + { + info.sigterm.deob.signature.Type type = signature.getTypeOfArg(i); + + if (type.getType().equals("L" + cf.getName() + ";")) + signature.setTypeOfArg(i, new info.sigterm.deob.signature.Type("L" + name + ";", type.getArrayDims())); + } + + // rename return type + if (signature.getReturnValue().getType().equals("L" + cf.getName() + ";")) + signature.setTypeOfReturnValue(new info.sigterm.deob.signature.Type("L" + name + ";", signature.getReturnValue().getArrayDims())); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/InvokeSpecial.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/InvokeSpecial.java index 22fa9e8bd4..343899d854 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/InvokeSpecial.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/InvokeSpecial.java @@ -154,6 +154,19 @@ public class InvokeSpecial extends Instruction implements InvokeInstruction { if (method.getClassEntry().getName().equals(cf.getName())) method = new Method(new Class(name), method.getNameAndType()); + + Signature signature = method.getNameAndType().getDescriptor(); + for (int i = 0; i < signature.size(); ++i) + { + info.sigterm.deob.signature.Type type = signature.getTypeOfArg(i); + + if (type.getType().equals("L" + cf.getName() + ";")) + signature.setTypeOfArg(i, new info.sigterm.deob.signature.Type("L" + name + ";", type.getArrayDims())); + } + + // rename return type + if (signature.getReturnValue().getType().equals("L" + cf.getName() + ";")) + signature.setTypeOfReturnValue(new info.sigterm.deob.signature.Type("L" + name + ";", signature.getReturnValue().getArrayDims())); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/InvokeStatic.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/InvokeStatic.java index 6571d058fb..8ba636468c 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/InvokeStatic.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/InvokeStatic.java @@ -151,6 +151,19 @@ public class InvokeStatic extends Instruction implements InvokeInstruction { if (method.getClassEntry().getName().equals(cf.getName())) method = new Method(new Class(name), method.getNameAndType()); + + Signature signature = method.getNameAndType().getDescriptor(); + for (int i = 0; i < signature.size(); ++i) + { + info.sigterm.deob.signature.Type type = signature.getTypeOfArg(i); + + if (type.getType().equals("L" + cf.getName() + ";")) + signature.setTypeOfArg(i, new info.sigterm.deob.signature.Type("L" + name + ";", type.getArrayDims())); + } + + // rename return type + if (signature.getReturnValue().getType().equals("L" + cf.getName() + ";")) + signature.setTypeOfReturnValue(new info.sigterm.deob.signature.Type("L" + name + ";", signature.getReturnValue().getArrayDims())); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/InvokeVirtual.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/InvokeVirtual.java index 15b699d047..63dffe5144 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/InvokeVirtual.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/InvokeVirtual.java @@ -161,6 +161,19 @@ public class InvokeVirtual extends Instruction implements InvokeInstruction { if (method.getClassEntry().getName().equals(cf.getName())) method = new Method(new Class(name), method.getNameAndType()); + + Signature signature = method.getNameAndType().getDescriptor(); + for (int i = 0; i < signature.size(); ++i) + { + info.sigterm.deob.signature.Type type = signature.getTypeOfArg(i); + + if (type.getType().equals("L" + cf.getName() + ";")) + signature.setTypeOfArg(i, new info.sigterm.deob.signature.Type("L" + name + ";", type.getArrayDims())); + } + + // rename return type + if (signature.getReturnValue().getType().equals("L" + cf.getName() + ";")) + signature.setTypeOfReturnValue(new info.sigterm.deob.signature.Type("L" + name + ";", signature.getReturnValue().getArrayDims())); } @Override diff --git a/src/main/java/info/sigterm/deob/deobfuscators/RenameUnique.java b/src/main/java/info/sigterm/deob/deobfuscators/RenameUnique.java index 296e8e31a3..ce7cce12e3 100644 --- a/src/main/java/info/sigterm/deob/deobfuscators/RenameUnique.java +++ b/src/main/java/info/sigterm/deob/deobfuscators/RenameUnique.java @@ -141,7 +141,7 @@ public class RenameUnique implements Deobfuscator return list; } - private void renameMethod(ClassGroup group, Method m, String name) + private void renameMethod(ClassGroup group, List methods, String name) { for (ClassFile c : group.getClasses()) { @@ -151,12 +151,14 @@ public class RenameUnique implements Deobfuscator if (method.getCode() != null) { Instructions instructions = method.getCode().getInstructions(); - instructions.renameMethod(m, name); + for (Method m : methods) + instructions.renameMethod(m, name); } } } - m.setName(name); + for (Method m : methods) + m.setName(name); } @Override @@ -196,11 +198,15 @@ public class RenameUnique implements Deobfuscator List virtualMethods = getVirutalMethods(method); assert !virtualMethods.isEmpty(); - if (virtualMethods.size() != 1) - continue; // do next - renameMethod(group, method, "method" + i++); - ++methods; + String name; + if (virtualMethods.size() == 1) + name = "method" + i++; + else + name = "vmethod" + i++; + + renameMethod(group, virtualMethods, name); + methods += virtualMethods.size(); } System.out.println("Uniquely renamed " + classes + " classes, " + fields + " fields, and " + methods + " methods");