diff --git a/src/main/java/info/sigterm/deob/ClassFile.java b/src/main/java/info/sigterm/deob/ClassFile.java index 69111d76cb..54d124bb8d 100644 --- a/src/main/java/info/sigterm/deob/ClassFile.java +++ b/src/main/java/info/sigterm/deob/ClassFile.java @@ -1,10 +1,20 @@ package info.sigterm.deob; +import info.sigterm.deob.pool.Class; +import info.sigterm.deob.pool.UTF8; + import java.io.DataInputStream; import java.io.IOException; +import java.util.ArrayList; public class ClassFile { + private ClassGroup group; + private DataInputStream is; + + private ClassFile parent; // super class + private ArrayList children = new ArrayList(); // classes which inherit from this + private int magic; private short minor_version; private short major_version; @@ -17,10 +27,9 @@ public class ClassFile private Methods methods; private Attributes attributes; - private DataInputStream is; - - public ClassFile(DataInputStream is) throws IOException + public ClassFile(ClassGroup group, DataInputStream is) throws IOException { + this.group = group; this.is = is; magic = is.readInt(); @@ -54,4 +63,28 @@ public class ClassFile { return pool; } + + public String getName() + { + Class entry = (Class) pool.getEntry(this_class); + UTF8 className = (UTF8) pool.getEntry(entry.getIndex()); + return className.getValue(); + } + + public void buildClassGraph() + { + Class entry = (Class) pool.getEntry(super_class); + UTF8 className = (UTF8) pool.getEntry(entry.getIndex()); + String superName = className.getValue(); + + ClassFile other = group.findClass(superName); + if (other == null) + return; // inherits from a class not in my group + + assert other != null; + assert other != this; + + this.parent = other; + parent.children.add(this); + } } diff --git a/src/main/java/info/sigterm/deob/ClassGroup.java b/src/main/java/info/sigterm/deob/ClassGroup.java new file mode 100644 index 0000000000..3e58224307 --- /dev/null +++ b/src/main/java/info/sigterm/deob/ClassGroup.java @@ -0,0 +1,35 @@ +package info.sigterm.deob; + +import java.io.DataInputStream; +import java.io.IOException; +import java.util.ArrayList; + +public class ClassGroup +{ + private ArrayList classes = new ArrayList(); + + public ClassGroup() + { + } + + public ClassFile addClass(String name, DataInputStream is) throws IOException + { + ClassFile cf = new ClassFile(this, is); + classes.add(cf); + return cf; + } + + public ClassFile findClass(String name) + { + for (ClassFile c : classes) + if (c.getName().equals(name)) + return c; + return null; + } + + public void buildClassGraph() + { + for (ClassFile c : classes) + c.buildClassGraph(); + } +} diff --git a/src/main/java/info/sigterm/deob/Deob.java b/src/main/java/info/sigterm/deob/Deob.java index 8cc92c66ac..5323b02b44 100644 --- a/src/main/java/info/sigterm/deob/Deob.java +++ b/src/main/java/info/sigterm/deob/Deob.java @@ -11,6 +11,8 @@ public class Deob { public static void main(String[] args) throws IOException { + ClassGroup group = new ClassGroup(); + JarFile jar = new JarFile(args[0]); for (Enumeration it = jar.entries(); it.hasMoreElements();) { @@ -20,7 +22,9 @@ public class Deob continue; InputStream is = jar.getInputStream(entry); - ClassFile c = new ClassFile(new DataInputStream(is)); + group.addClass(entry.getName(), new DataInputStream(is)); } + + group.buildClassGraph(); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/InvokeDynamic.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/InvokeDynamic.java new file mode 100644 index 0000000000..1395e9a44b --- /dev/null +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/InvokeDynamic.java @@ -0,0 +1,24 @@ +package info.sigterm.deob.attributes.code.instructions; + +import info.sigterm.deob.attributes.code.Instruction; +import info.sigterm.deob.attributes.code.InstructionType; +import info.sigterm.deob.attributes.code.Instructions; + +import java.io.DataInputStream; +import java.io.IOException; + +public class InvokeDynamic extends Instruction +{ + private int index; + + public InvokeDynamic(Instructions instructions, InstructionType type, int pc) throws IOException + { + super(instructions, type, pc); + + DataInputStream is = instructions.getCode().getAttributes().getStream(); + index = is.readUnsignedShort(); + is.skip(2); + length += 4; + } + +} diff --git a/src/main/java/info/sigterm/deob/pool/Class.java b/src/main/java/info/sigterm/deob/pool/Class.java index 4bbddb2615..a6ad6d0b20 100644 --- a/src/main/java/info/sigterm/deob/pool/Class.java +++ b/src/main/java/info/sigterm/deob/pool/Class.java @@ -16,4 +16,9 @@ public class Class extends PoolEntry DataInputStream is = pool.getClassFile().getStream(); index = is.readUnsignedShort(); } + + public int getIndex() + { + return index; + } }