From 5781f081526fc02c61f401ac37567b09063358cc Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 9 Jul 2015 20:56:44 -0400 Subject: [PATCH] Beginning work of rename unique, now renames classes --- .../java/info/sigterm/deob/ClassFile.java | 17 +++- src/main/java/info/sigterm/deob/Deob.java | 6 ++ .../java/info/sigterm/deob/Interfaces.java | 12 ++- src/main/java/info/sigterm/deob/Method.java | 72 ++------------ src/main/java/info/sigterm/deob/Methods.java | 1 - .../sigterm/deob/attributes/Exceptions.java | 14 +++ .../deob/attributes/code/Exception.java | 7 ++ .../deob/attributes/code/Exceptions.java | 7 ++ .../deob/attributes/code/Instruction.java | 5 + .../deob/attributes/code/Instructions.java | 7 ++ .../code/instructions/ANewArray.java | 8 ++ .../attributes/code/instructions/AStore.java | 2 + .../code/instructions/CheckCast.java | 8 ++ .../code/instructions/GetField.java | 9 ++ .../code/instructions/GetStatic.java | 6 ++ .../code/instructions/InstanceOf.java | 8 ++ .../code/instructions/InvokeInterface.java | 8 ++ .../code/instructions/InvokeSpecial.java | 8 ++ .../code/instructions/InvokeStatic.java | 8 ++ .../code/instructions/InvokeVirtual.java | 8 ++ .../code/instructions/MultiANewArray.java | 8 ++ .../attributes/code/instructions/New.java | 8 ++ .../code/instructions/PutField.java | 8 ++ .../code/instructions/PutStatic.java | 9 ++ .../deob/deobfuscators/RenameUnique.java | 94 +++++++++++++++++++ .../deob/deobfuscators/UnusedParameters.java | 2 +- .../java/info/sigterm/deob/pool/Class.java | 7 ++ .../java/info/sigterm/deob/pool/Field.java | 8 ++ .../sigterm/deob/signature/Signature.java | 10 ++ .../info/sigterm/deob/signature/Type.java | 21 ++++- 30 files changed, 321 insertions(+), 75 deletions(-) create mode 100644 src/main/java/info/sigterm/deob/deobfuscators/RenameUnique.java diff --git a/src/main/java/info/sigterm/deob/ClassFile.java b/src/main/java/info/sigterm/deob/ClassFile.java index 32995083d4..c02c916872 100644 --- a/src/main/java/info/sigterm/deob/ClassFile.java +++ b/src/main/java/info/sigterm/deob/ClassFile.java @@ -123,6 +123,21 @@ public class ClassFile { return name.getName(); } + + public void setName(String name) + { + this.name = new Class(name); + } + + public Class getParentClass() + { + return this.super_class; + } + + public void setParentClass(Class c) + { + super_class = c; + } public ClassFile getParent() { @@ -188,7 +203,7 @@ public class ClassFile parent.children.add(this); } - for (ClassFile i : interfaces.getInterfaces()) + for (ClassFile i : interfaces.getMyInterfaces()) { i.children.add(this); } diff --git a/src/main/java/info/sigterm/deob/Deob.java b/src/main/java/info/sigterm/deob/Deob.java index fe45732a20..219e364206 100644 --- a/src/main/java/info/sigterm/deob/Deob.java +++ b/src/main/java/info/sigterm/deob/Deob.java @@ -3,6 +3,7 @@ package info.sigterm.deob; import info.sigterm.deob.deobfuscators.IllegalStateExceptions; import info.sigterm.deob.deobfuscators.Jumps; import info.sigterm.deob.deobfuscators.ModularArithmeticDeobfuscation; +import info.sigterm.deob.deobfuscators.RenameUnique; import info.sigterm.deob.deobfuscators.RuntimeExceptions; import info.sigterm.deob.deobfuscators.UnusedBlocks; import info.sigterm.deob.deobfuscators.UnusedFields; @@ -42,6 +43,9 @@ public class Deob ClassGroup group = loadJar(args[0]); + new RenameUnique().run(group); + + /* // remove except RuntimeException new RuntimeExceptions().run(group); @@ -60,9 +64,11 @@ public class Deob // remove jump obfuscation new Jumps().run(group); + // remove unused fields new UnusedFields().run(group); //new ModularArithmeticDeobfuscation().run(group); + */ saveJar(group, args[1]); diff --git a/src/main/java/info/sigterm/deob/Interfaces.java b/src/main/java/info/sigterm/deob/Interfaces.java index dd2bd69bf1..9db18f5edc 100644 --- a/src/main/java/info/sigterm/deob/Interfaces.java +++ b/src/main/java/info/sigterm/deob/Interfaces.java @@ -26,7 +26,17 @@ public class Interfaces interfaces.add(c.getPool().getClass(is.readUnsignedShort())); } - public List getInterfaces() + public List getInterfaces() + { + return interfaces; + } + + public void setInterfaces(List interfaces) + { + this.interfaces = interfaces; + } + + public List getMyInterfaces() { List l = new ArrayList<>(); for (Class clazz : interfaces) diff --git a/src/main/java/info/sigterm/deob/Method.java b/src/main/java/info/sigterm/deob/Method.java index f6282dd0bf..aa9eb585d8 100644 --- a/src/main/java/info/sigterm/deob/Method.java +++ b/src/main/java/info/sigterm/deob/Method.java @@ -3,24 +3,17 @@ package info.sigterm.deob; import info.sigterm.deob.attributes.AttributeType; import info.sigterm.deob.attributes.Attributes; import info.sigterm.deob.attributes.Code; +import info.sigterm.deob.attributes.Exceptions; import info.sigterm.deob.attributes.code.Instruction; -import info.sigterm.deob.attributes.code.instruction.types.InvokeInstruction; import info.sigterm.deob.attributes.code.instruction.types.LVTInstruction; -import info.sigterm.deob.callgraph.Node; -import info.sigterm.deob.execution.Execution; -import info.sigterm.deob.execution.Frame; -import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.pool.NameAndType; -import info.sigterm.deob.pool.PoolEntry; import info.sigterm.deob.signature.Signature; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.util.ArrayList; -import java.util.HashSet; import java.util.List; -import java.util.Set; public class Method { @@ -55,11 +48,6 @@ public class Method out.writeShort(pool.makeUTF8(arguments.toString())); attributes.write(out); } - - protected void remove() - { - //assert callsFrom.isEmpty(); - } public Methods getMethods() { @@ -85,34 +73,16 @@ public class Method { return (accessFlags & ACC_STATIC) != 0; } + + public Exceptions getExceptions() + { + return (Exceptions) attributes.findType(AttributeType.EXCEPTIONS); + } public Code getCode() { return (Code) attributes.findType(AttributeType.CODE); } - - /* - public List getOverriddenMethods() - { - List m = new ArrayList(); - - ClassFile parent = methods.getClassFile().getParent(); - if (parent != null) - { - Method other = parent.getMethods().findMethod(getName(), getDescriptor()); - if (other != null) - m.add(other); - } - - for (ClassFile inter : methods.getClassFile().getInterfaces().getInterfaces()) - { - Method other = inter.getMethods().findMethod(getName(), getDescriptor()); - if (other != null) - m.add(other); - } - - return m; - }*/ public void buildInstructionGraph() { @@ -122,36 +92,6 @@ public class Method code.buildInstructionGraph(); } - /*public void clearCallGraph() - { - callsTo.clear(); - callsFrom.clear(); - }*/ - - /*public boolean isUsed() - { - if (!callsFrom.isEmpty()) - return true; - - for (Method sm : getOverriddenMethods()) - { - if (sm.isUsed()) - return true; - } - - return false; - }*/ - - /* - public void addCallTo(Instruction ins, Method method) - { - assert method != null; - Node node = new Node(this, method, ins); - callsTo.add(node); - method.callsFrom.add(node); - } - */ - @SuppressWarnings("unchecked") public List findLVTInstructionsForVariable(int index) { diff --git a/src/main/java/info/sigterm/deob/Methods.java b/src/main/java/info/sigterm/deob/Methods.java index b9f9856d32..bea54eab0c 100644 --- a/src/main/java/info/sigterm/deob/Methods.java +++ b/src/main/java/info/sigterm/deob/Methods.java @@ -36,7 +36,6 @@ public class Methods public void removeMethod(Method m) { - m.remove(); methods.remove(m); } diff --git a/src/main/java/info/sigterm/deob/attributes/Exceptions.java b/src/main/java/info/sigterm/deob/attributes/Exceptions.java index 3fefddfe3a..792ca33b21 100644 --- a/src/main/java/info/sigterm/deob/attributes/Exceptions.java +++ b/src/main/java/info/sigterm/deob/attributes/Exceptions.java @@ -1,5 +1,6 @@ package info.sigterm.deob.attributes; +import info.sigterm.deob.ClassFile; import info.sigterm.deob.pool.Class; import java.io.DataInputStream; @@ -33,4 +34,17 @@ public class Exceptions extends Attribute for (Class c : classes) out.writeShort(this.getAttributes().getClassFile().getPool().make(c)); } + + public void renameClass(ClassFile cf, String name) + { + for (Class c : classes) + { + if (c.getName().equals(cf.getName())) + { + int idx = classes.indexOf(c); + classes.remove(idx); + classes.add(idx, new Class(name)); + } + } + } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/Exception.java b/src/main/java/info/sigterm/deob/attributes/code/Exception.java index ee15dac05e..e729312356 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/Exception.java +++ b/src/main/java/info/sigterm/deob/attributes/code/Exception.java @@ -1,5 +1,6 @@ package info.sigterm.deob.attributes.code; +import info.sigterm.deob.ClassFile; import info.sigterm.deob.ConstantPool; import info.sigterm.deob.pool.Class; @@ -93,4 +94,10 @@ public class Exception { return catchType; } + + public void renameClass(ClassFile cf, String name) + { + if (catchType != null && cf.getName().equals(catchType.getName())) + catchType = new Class(name); + } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/Exceptions.java b/src/main/java/info/sigterm/deob/attributes/code/Exceptions.java index 807fde2e97..0716101903 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/Exceptions.java +++ b/src/main/java/info/sigterm/deob/attributes/code/Exceptions.java @@ -1,5 +1,6 @@ package info.sigterm.deob.attributes.code; +import info.sigterm.deob.ClassFile; import info.sigterm.deob.attributes.Code; import java.io.DataInputStream; @@ -47,4 +48,10 @@ public class Exceptions { return exceptions; } + + public void renameClass(ClassFile cf, String name) + { + for (Exception e : exceptions) + e.renameClass(cf, name); + } } \ No newline at end of file diff --git a/src/main/java/info/sigterm/deob/attributes/code/Instruction.java b/src/main/java/info/sigterm/deob/attributes/code/Instruction.java index c52c091707..dd872c60f1 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/Instruction.java +++ b/src/main/java/info/sigterm/deob/attributes/code/Instruction.java @@ -1,5 +1,6 @@ package info.sigterm.deob.attributes.code; +import info.sigterm.deob.ClassFile; import info.sigterm.deob.ConstantPool; import info.sigterm.deob.execution.Frame; @@ -206,4 +207,8 @@ public abstract class Instruction public void replace(Instruction oldi, Instruction newi) { } + + public void renameClass(ClassFile cf, String name) + { + } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/Instructions.java b/src/main/java/info/sigterm/deob/attributes/code/Instructions.java index 709c806320..cf2396cae7 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/Instructions.java +++ b/src/main/java/info/sigterm/deob/attributes/code/Instructions.java @@ -1,5 +1,6 @@ package info.sigterm.deob.attributes.code; +import info.sigterm.deob.ClassFile; import info.sigterm.deob.attributes.Code; import info.sigterm.deob.attributes.code.instruction.types.JumpingInstruction; import info.sigterm.deob.attributes.code.instructions.LDC; @@ -196,4 +197,10 @@ public class Instructions return i; return null; } + + public void renameClass(ClassFile cf, String name) + { + for (Instruction i : instructions) + i.renameClass(cf, name); + } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/ANewArray.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/ANewArray.java index 6a2bb248b7..06646121cd 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/ANewArray.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/ANewArray.java @@ -1,5 +1,6 @@ package info.sigterm.deob.attributes.code.instructions; +import info.sigterm.deob.ClassFile; import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; @@ -53,4 +54,11 @@ public class ANewArray extends Instruction frame.addInstructionContext(ins); } + + @Override + public void renameClass(ClassFile cf, String name) + { + if (clazz.getName().equals(cf.getName())) + clazz = new Class(name); + } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/AStore.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/AStore.java index 7d519581c8..788db0a6cf 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/AStore.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/AStore.java @@ -1,5 +1,6 @@ package info.sigterm.deob.attributes.code.instructions; +import info.sigterm.deob.ClassFile; import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; @@ -11,6 +12,7 @@ import info.sigterm.deob.execution.Stack; import info.sigterm.deob.execution.StackContext; import info.sigterm.deob.execution.VariableContext; import info.sigterm.deob.execution.Variables; +import info.sigterm.deob.pool.Class; import java.io.DataInputStream; import java.io.DataOutputStream; diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/CheckCast.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/CheckCast.java index ca7748f5c6..e0361bcf99 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/CheckCast.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/CheckCast.java @@ -1,5 +1,6 @@ package info.sigterm.deob.attributes.code.instructions; +import info.sigterm.deob.ClassFile; import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; @@ -69,4 +70,11 @@ public class CheckCast extends Instruction } } } + + @Override + public void renameClass(ClassFile cf, String name) + { + if (clazz.getName().equals(cf.getName())) + clazz = new Class(name); + } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/GetField.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/GetField.java index 802ed26c68..cd0643bb6f 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/GetField.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/GetField.java @@ -1,5 +1,6 @@ package info.sigterm.deob.attributes.code.instructions; +import info.sigterm.deob.ClassFile; import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; @@ -9,6 +10,7 @@ import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; import info.sigterm.deob.execution.StackContext; import info.sigterm.deob.execution.Type; +import info.sigterm.deob.pool.Class; import info.sigterm.deob.pool.Field; import java.io.DataInputStream; @@ -57,4 +59,11 @@ public class GetField extends Instruction implements GetFieldInstruction { return field; } + + @Override + public void renameClass(ClassFile cf, String name) + { + if (field.getClassEntry().getName().equals(cf.getName())) + field = new Field(new Class(name), field.getNameAndType()); + } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/GetStatic.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/GetStatic.java index a7d35d32f2..37974f9c1f 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/GetStatic.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/GetStatic.java @@ -74,4 +74,10 @@ public class GetStatic extends Instruction implements GetFieldInstruction return field; } + @Override + public void renameClass(ClassFile cf, String name) + { + if (field.getClassEntry().getName().equals(cf.getName())) + field = new Field(new Class(name), field.getNameAndType()); + } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/InstanceOf.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/InstanceOf.java index f7dbb764aa..d6f2398291 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/InstanceOf.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/InstanceOf.java @@ -1,5 +1,6 @@ package info.sigterm.deob.attributes.code.instructions; +import info.sigterm.deob.ClassFile; import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; @@ -49,4 +50,11 @@ public class InstanceOf extends Instruction frame.addInstructionContext(ins); } + + @Override + public void renameClass(ClassFile cf, String name) + { + if (clazz.getName().equals(cf.getName())) + clazz = new Class(name); + } } 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 1c11774fc0..bd7af501a2 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 @@ -11,6 +11,7 @@ import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; import info.sigterm.deob.execution.StackContext; import info.sigterm.deob.execution.Type; +import info.sigterm.deob.pool.Class; import info.sigterm.deob.pool.InterfaceMethod; import info.sigterm.deob.pool.NameAndType; import info.sigterm.deob.pool.PoolEntry; @@ -155,4 +156,11 @@ public class InvokeInterface extends Instruction implements InvokeInstruction { return method; } + + @Override + public void renameClass(ClassFile cf, String name) + { + if (method.getClassEntry().getName().equals(cf.getName())) + method = new InterfaceMethod(new Class(name), method.getNameAndType()); + } } 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 4475227bcc..068c8e7ae2 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 @@ -11,6 +11,7 @@ import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; import info.sigterm.deob.execution.StackContext; import info.sigterm.deob.execution.Type; +import info.sigterm.deob.pool.Class; import info.sigterm.deob.pool.Method; import info.sigterm.deob.pool.NameAndType; import info.sigterm.deob.pool.PoolEntry; @@ -147,4 +148,11 @@ public class InvokeSpecial extends Instruction implements InvokeInstruction { return method; } + + @Override + public void renameClass(ClassFile cf, String name) + { + if (method.getClassEntry().getName().equals(cf.getName())) + method = new Method(new Class(name), method.getNameAndType()); + } } 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 678d803a79..bb45bbcd24 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 @@ -11,6 +11,7 @@ import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; import info.sigterm.deob.execution.StackContext; import info.sigterm.deob.execution.Type; +import info.sigterm.deob.pool.Class; import info.sigterm.deob.pool.Method; import info.sigterm.deob.pool.NameAndType; import info.sigterm.deob.pool.PoolEntry; @@ -144,4 +145,11 @@ public class InvokeStatic extends Instruction implements InvokeInstruction { return method; } + + @Override + public void renameClass(ClassFile cf, String name) + { + if (method.getClassEntry().getName().equals(cf.getName())) + method = new Method(new Class(name), method.getNameAndType()); + } } 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 0478ae7ee7..ba645f08fa 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 @@ -11,6 +11,7 @@ import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; import info.sigterm.deob.execution.StackContext; import info.sigterm.deob.execution.Type; +import info.sigterm.deob.pool.Class; import info.sigterm.deob.pool.Method; import info.sigterm.deob.pool.NameAndType; import info.sigterm.deob.pool.PoolEntry; @@ -154,4 +155,11 @@ public class InvokeVirtual extends Instruction implements InvokeInstruction { return method; } + + @Override + public void renameClass(ClassFile cf, String name) + { + if (method.getClassEntry().getName().equals(cf.getName())) + method = new Method(new Class(name), method.getNameAndType()); + } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/MultiANewArray.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/MultiANewArray.java index dbac3869c6..d18303405b 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/MultiANewArray.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/MultiANewArray.java @@ -1,5 +1,6 @@ package info.sigterm.deob.attributes.code.instructions; +import info.sigterm.deob.ClassFile; import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; @@ -57,4 +58,11 @@ public class MultiANewArray extends Instruction frame.addInstructionContext(ins); } + + @Override + public void renameClass(ClassFile cf, String name) + { + if (clazz.getName().equals(cf.getName())) + clazz = new Class(name); + } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/New.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/New.java index 51152c6dfc..4c120de7d6 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/New.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/New.java @@ -1,5 +1,6 @@ package info.sigterm.deob.attributes.code.instructions; +import info.sigterm.deob.ClassFile; import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; @@ -52,4 +53,11 @@ public class New extends Instruction { return clazz; } + + @Override + public void renameClass(ClassFile cf, String name) + { + if (clazz.getName().equals(cf.getName())) + clazz = new Class(name); + } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/PutField.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/PutField.java index bd3934b99f..3b24b0fe13 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/PutField.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/PutField.java @@ -1,5 +1,6 @@ package info.sigterm.deob.attributes.code.instructions; +import info.sigterm.deob.ClassFile; import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; @@ -8,6 +9,7 @@ import info.sigterm.deob.execution.Frame; import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.pool.Class; import info.sigterm.deob.pool.Field; import java.io.DataInputStream; @@ -53,4 +55,10 @@ public class PutField extends Instruction implements SetFieldInstruction return field; } + @Override + public void renameClass(ClassFile cf, String name) + { + if (field.getClassEntry().getName().equals(cf.getName())) + field = new Field(new Class(name), field.getNameAndType()); + } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/PutStatic.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/PutStatic.java index b93ba98bc6..ae99bc3f87 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/PutStatic.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/PutStatic.java @@ -1,5 +1,6 @@ package info.sigterm.deob.attributes.code.instructions; +import info.sigterm.deob.ClassFile; import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; @@ -8,6 +9,7 @@ import info.sigterm.deob.execution.Frame; import info.sigterm.deob.execution.InstructionContext; import info.sigterm.deob.execution.Stack; import info.sigterm.deob.execution.StackContext; +import info.sigterm.deob.pool.Class; import info.sigterm.deob.pool.Field; import java.io.DataInputStream; @@ -51,4 +53,11 @@ public class PutStatic extends Instruction implements SetFieldInstruction { return field; } + + @Override + public void renameClass(ClassFile cf, String name) + { + if (field.getClassEntry().getName().equals(cf.getName())) + field = new Field(new Class(name), field.getNameAndType()); + } } diff --git a/src/main/java/info/sigterm/deob/deobfuscators/RenameUnique.java b/src/main/java/info/sigterm/deob/deobfuscators/RenameUnique.java new file mode 100644 index 0000000000..aea813fa0a --- /dev/null +++ b/src/main/java/info/sigterm/deob/deobfuscators/RenameUnique.java @@ -0,0 +1,94 @@ +package info.sigterm.deob.deobfuscators; + +import java.util.List; + +import info.sigterm.deob.ClassFile; +import info.sigterm.deob.ClassGroup; +import info.sigterm.deob.Interfaces; +import info.sigterm.deob.Method; +import info.sigterm.deob.attributes.code.Exceptions; +import info.sigterm.deob.attributes.code.Instructions; +import info.sigterm.deob.pool.Class; +import info.sigterm.deob.signature.Signature; +import info.sigterm.deob.signature.Type; + +public class RenameUnique +{ + private void renameClass(ClassFile on, ClassFile old, String name) + { + if (on.getParentClass().getName().equals(old.getName())) + on.setParentClass(new Class(name)); + + Interfaces interfaces = on.getInterfaces(); + List interfaceList = interfaces.getInterfaces(); + for (Class inter : interfaceList) + if (inter.getName().equals(old.getName())) + { + int idx = interfaceList.indexOf(inter); + interfaceList.remove(idx); + interfaceList.add(idx, new Class(name)); + break; + } + } + + private void renameClass(ClassGroup group, ClassFile cf, String name) + { + for (ClassFile c : group.getClasses()) + { + // rename on child interfaces and classes + renameClass(c, cf, name); + + for (Method method : c.getMethods().getMethods()) + { + // rename on instructions. this includes method calls and field accesses. + if (method.getCode() != null) + { + Instructions instructions = method.getCode().getInstructions(); + instructions.renameClass(cf, name); + + // rename on exception handlers + Exceptions exceptions = method.getCode().getExceptions(); + exceptions.renameClass(cf, name); + } + + // rename on parameters + Signature signature = method.getDescriptor(); + for (int i = 0; i < signature.size(); ++i) + { + Type type = signature.getTypeOfArg(i); + + if (type.getType().equals("L" + cf.getName() + ";")) + signature.setTypeOfArg(i, new Type("L" + name + ";", type.getArrayDims())); + } + + // rename return type + if (signature.getReturnValue().getType().equals("L" + cf.getName() + ";")) + signature.setTypeOfReturnValue(new Type("L" + name + ";", signature.getReturnValue().getArrayDims())); + + // rename on exceptions thrown + if (method.getExceptions() != null) + method.getExceptions().renameClass(cf, name); + } + } + + cf.setName(name); + } + + public void run(ClassGroup group) + { + group.buildClassGraph(); + + int i = 0; + for (ClassFile cf : group.getClasses()) + { + if (cf.getName().length() > 2) + continue; + + renameClass(group, cf, "class" + i++); + + // rename method + + // rename fields + } + } +} diff --git a/src/main/java/info/sigterm/deob/deobfuscators/UnusedParameters.java b/src/main/java/info/sigterm/deob/deobfuscators/UnusedParameters.java index e9984cedea..ea2c16749f 100644 --- a/src/main/java/info/sigterm/deob/deobfuscators/UnusedParameters.java +++ b/src/main/java/info/sigterm/deob/deobfuscators/UnusedParameters.java @@ -41,7 +41,7 @@ public class UnusedParameters list.addAll(findDependentMethods(nat, visited, group, cf.getParent())); // search interfaces - for (ClassFile inter : cf.getInterfaces().getInterfaces()) + for (ClassFile inter : cf.getInterfaces().getMyInterfaces()) list.addAll(findDependentMethods(nat, visited, group, inter)); // search children diff --git a/src/main/java/info/sigterm/deob/pool/Class.java b/src/main/java/info/sigterm/deob/pool/Class.java index 2439c52ef8..4cb3bdddef 100644 --- a/src/main/java/info/sigterm/deob/pool/Class.java +++ b/src/main/java/info/sigterm/deob/pool/Class.java @@ -20,6 +20,13 @@ public class Class extends PoolEntry index = is.readUnsignedShort(); } + public Class(java.lang.String name) + { + super(ConstantType.CLASS); + + this.name = name; + } + @Override public void resolve(ConstantPool pool) { diff --git a/src/main/java/info/sigterm/deob/pool/Field.java b/src/main/java/info/sigterm/deob/pool/Field.java index 7617cc372d..cfcd37a95f 100644 --- a/src/main/java/info/sigterm/deob/pool/Field.java +++ b/src/main/java/info/sigterm/deob/pool/Field.java @@ -22,6 +22,14 @@ public class Field extends PoolEntry natIndex = is.readUnsignedShort(); } + public Field(Class clazz, NameAndType nat) + { + super(ConstantType.FIELDREF); + + this.clazz = clazz; + this.nat = nat; + } + @Override public void resolve(ConstantPool pool) { diff --git a/src/main/java/info/sigterm/deob/signature/Signature.java b/src/main/java/info/sigterm/deob/signature/Signature.java index 18ce0dbe0d..24d6bc6c74 100644 --- a/src/main/java/info/sigterm/deob/signature/Signature.java +++ b/src/main/java/info/sigterm/deob/signature/Signature.java @@ -74,8 +74,18 @@ public class Signature return arguments.get(i); } + public void setTypeOfArg(int i, Type type) + { + arguments.set(i, type); + } + public Type getReturnValue() { return rv; } + + public void setTypeOfReturnValue(Type type) + { + rv = type; + } } diff --git a/src/main/java/info/sigterm/deob/signature/Type.java b/src/main/java/info/sigterm/deob/signature/Type.java index 82ecd72af9..3cfb2cd8e2 100644 --- a/src/main/java/info/sigterm/deob/signature/Type.java +++ b/src/main/java/info/sigterm/deob/signature/Type.java @@ -16,11 +16,26 @@ public class Type type = str; } + public Type(String type, int dimms) + { + this.type = type; + this.arrayDimms = dimms; + } + public String getType() { return type; } + public String getFullType() + { + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < arrayDimms; ++i) + sb.append('['); + sb.append(type); + return sb.toString(); + } + public int getArrayDims() { return arrayDimms; @@ -49,10 +64,6 @@ public class Type @Override public String toString() { - StringBuffer sb = new StringBuffer(); - for (int i = 0; i < arrayDimms; ++i) - sb.append('['); - sb.append(type); - return sb.toString(); + return getFullType(); } }