diff --git a/.classpath b/.classpath new file mode 100644 index 0000000000..8b3393b602 --- /dev/null +++ b/.classpath @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..f4217b01dd --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,12 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.7 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000000..14b697b7bb --- /dev/null +++ b/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/src/main/java/info/sigterm/deob/ClassFile.java b/src/main/java/info/sigterm/deob/ClassFile.java index 6b5857b7ae..2dc16ef1cf 100644 --- a/src/main/java/info/sigterm/deob/ClassFile.java +++ b/src/main/java/info/sigterm/deob/ClassFile.java @@ -5,6 +5,7 @@ import info.sigterm.deob.pool.Class; import info.sigterm.deob.pool.NameAndType; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; import java.util.ArrayList; @@ -54,6 +55,28 @@ public class ClassFile attributes = new Attributes(this); } + + public void write(DataOutputStream out) throws IOException + { + out.writeInt(0xcafebabe); + + out.writeShort(minor_version); + out.writeShort(major_version); + + pool.write(out); + + out.writeShort(access_flags); + out.writeShort(this_class); + out.writeShort(super_class); + + interfaces.write(out); + + fields.write(out); + + methods.write(out); + + attributes.write(out); + } public ClassGroup getGroup() { @@ -74,6 +97,11 @@ public class ClassFile { return fields; } + + public Methods getMethods() + { + return methods; + } public String getName() { @@ -144,6 +172,11 @@ public class ClassFile methods.buildInstructionGraph(); } + public void buildCallGraph() + { + methods.buildCallGraph(); + } + public boolean instanceOf(ClassFile other) { return this == other || interfaces.instanceOf(other) || (getParent() != null && getParent().instanceOf(other)); diff --git a/src/main/java/info/sigterm/deob/ClassGroup.java b/src/main/java/info/sigterm/deob/ClassGroup.java index a42a3db818..da121b88ec 100644 --- a/src/main/java/info/sigterm/deob/ClassGroup.java +++ b/src/main/java/info/sigterm/deob/ClassGroup.java @@ -3,6 +3,7 @@ package info.sigterm.deob; import java.io.DataInputStream; import java.io.IOException; import java.util.ArrayList; +import java.util.List; public class ClassGroup { @@ -18,6 +19,11 @@ public class ClassGroup classes.add(cf); return cf; } + + public List getClasses() + { + return classes; + } public ClassFile findClass(String name) { @@ -39,4 +45,10 @@ public class ClassGroup for (ClassFile c : classes) c.buildInstructionGraph(); } + + public void buildCallGraph() + { + for (ClassFile c : classes) + c.buildCallGraph(); + } } diff --git a/src/main/java/info/sigterm/deob/ConstantPool.java b/src/main/java/info/sigterm/deob/ConstantPool.java index d7a76bed02..304601964f 100644 --- a/src/main/java/info/sigterm/deob/ConstantPool.java +++ b/src/main/java/info/sigterm/deob/ConstantPool.java @@ -1,9 +1,12 @@ package info.sigterm.deob; +import info.sigterm.deob.attributes.code.instructions.Return; import info.sigterm.deob.pool.ConstantType; import info.sigterm.deob.pool.PoolEntry; +import info.sigterm.deob.pool.UTF8; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; import java.lang.reflect.Constructor; @@ -35,12 +38,7 @@ public class ConstantPool PoolEntry entry = con.newInstance(this); pool[i] = entry; - - for (int j = 1; j < entry.getSlots(); ++j) - { - pool[i + 1] = entry; - ++i; - } + i += entry.getSlots() - 1; } catch (Exception e) { @@ -48,6 +46,19 @@ public class ConstantPool } } } + + public void write(DataOutputStream out) throws IOException + { + out.writeShort(count); + for (int i = 1; i < count; ++i) + { + PoolEntry entry = pool[i]; + if (entry == null) + continue; + out.writeByte(entry.getType().getType()); + entry.write(out); + } + } public ClassFile getClassFile() { @@ -58,4 +69,22 @@ public class ConstantPool { return pool[index]; } + + public int findUTF8Index(String s) + { + for (int i = 1; i < count; ++i) + { + PoolEntry entry = pool[i]; + if (entry instanceof UTF8) + { + UTF8 u = (UTF8) entry; + if (s.equals(u.getValue())) + { + return i; + } + } + } + + return -1; + } } diff --git a/src/main/java/info/sigterm/deob/Deob.java b/src/main/java/info/sigterm/deob/Deob.java index 7f826bf760..e0456f572d 100644 --- a/src/main/java/info/sigterm/deob/Deob.java +++ b/src/main/java/info/sigterm/deob/Deob.java @@ -2,12 +2,17 @@ package info.sigterm.deob; import info.sigterm.deob.execution.Execution; +import java.io.ByteArrayOutputStream; import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; import java.util.jar.JarEntry; import java.util.jar.JarFile; +import java.util.jar.JarOutputStream; +import java.util.jar.Manifest; public class Deob { @@ -30,8 +35,27 @@ public class Deob group.buildClassGraph(); group.buildInstructionGraph(); + group.buildCallGraph(); - execute(group); + //checkCallGraph(group); + + //execute(group); + + JarOutputStream jout = new JarOutputStream(new FileOutputStream("d:/rs/07/adamout.jar"), new Manifest()); + + for (ClassFile cf : group.getClasses()) + { + JarEntry entry = new JarEntry(cf.getName() + ".class"); + jout.putNextEntry(entry); + + ByteArrayOutputStream bout = new ByteArrayOutputStream(); + cf.write(new DataOutputStream(bout)); + jout.write(bout.toByteArray()); + + jout.closeEntry(); + } + + jout.close(); } private static void execute(ClassGroup group) throws IOException @@ -42,4 +66,18 @@ public class Deob Execution e = new Execution(group); e.run(cf, method); } + + private static void checkCallGraph(ClassGroup group) + { + for (ClassFile cf : group.getClasses()) + { + for (Method m : cf.getMethods().getMethods()) + { + if (m.callsFrom.isEmpty()) + { + System.out.println(cf.getName() + " " + m.getName()); + } + } + } + } } diff --git a/src/main/java/info/sigterm/deob/Field.java b/src/main/java/info/sigterm/deob/Field.java index c08c75d664..cac2817514 100644 --- a/src/main/java/info/sigterm/deob/Field.java +++ b/src/main/java/info/sigterm/deob/Field.java @@ -5,6 +5,7 @@ import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.pool.UTF8; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; import java.util.ArrayList; @@ -40,6 +41,14 @@ public class Field descriptorIndex = is.readUnsignedShort(); attributes = new Attributes(this); } + + public void write(DataOutputStream out) throws IOException + { + out.writeShort(accessFlags); + out.writeShort(nameIndex); + out.writeShort(descriptorIndex); + attributes.write(out); + } public Fields getFields() { diff --git a/src/main/java/info/sigterm/deob/Fields.java b/src/main/java/info/sigterm/deob/Fields.java index 4e3d2afd8b..76e1b54900 100644 --- a/src/main/java/info/sigterm/deob/Fields.java +++ b/src/main/java/info/sigterm/deob/Fields.java @@ -3,6 +3,7 @@ package info.sigterm.deob; import info.sigterm.deob.pool.NameAndType; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class Fields @@ -24,6 +25,13 @@ public class Fields for (int i = 0; i < count; ++i) fields[i] = new Field(this); } + + public void write(DataOutputStream out) throws IOException + { + out.writeShort(count); + for (Field f : fields) + f.write(out); + } public ClassFile getClassFile() { diff --git a/src/main/java/info/sigterm/deob/Interfaces.java b/src/main/java/info/sigterm/deob/Interfaces.java index fda39e615e..d911fa870d 100644 --- a/src/main/java/info/sigterm/deob/Interfaces.java +++ b/src/main/java/info/sigterm/deob/Interfaces.java @@ -3,6 +3,7 @@ package info.sigterm.deob; import info.sigterm.deob.pool.Class; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class Interfaces @@ -25,6 +26,13 @@ public class Interfaces interfaces[i] = is.readUnsignedShort(); } + public void write(DataOutputStream out) throws IOException + { + out.writeShort(count); + for (int i : interfaces) + out.writeShort(i); + } + public boolean instanceOf(ClassFile cf) { for (int i : interfaces) diff --git a/src/main/java/info/sigterm/deob/Method.java b/src/main/java/info/sigterm/deob/Method.java index 7d1f1115f4..c9e06356ae 100644 --- a/src/main/java/info/sigterm/deob/Method.java +++ b/src/main/java/info/sigterm/deob/Method.java @@ -3,10 +3,15 @@ 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.code.Instruction; +import info.sigterm.deob.callgraph.Node; import info.sigterm.deob.pool.UTF8; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; public class Method { @@ -16,6 +21,8 @@ public class Method private int nameIndex; private int descriptorIndex; private Attributes attributes; + public List callsTo = new ArrayList<>(), + callsFrom = new ArrayList<>(); Method(Methods methods) throws IOException { @@ -28,6 +35,19 @@ public class Method descriptorIndex = is.readUnsignedShort(); attributes = new Attributes(this); } + + public void write(DataOutputStream out) throws IOException + { + out.writeShort(accessFlags); + out.writeShort(nameIndex); + out.writeShort(descriptorIndex); + attributes.write(out); + } + + protected void remove() + { + assert callsFrom.isEmpty(); + } public Methods getMethods() { @@ -58,4 +78,19 @@ public class Method if (code != null) code.buildInstructionGraph(); } + + public void buildCallGraph() + { + Code code = getCode(); + + if (code != null) + code.buildCallGraph(); + } + + public void addCallTo(Instruction ins, Method method) + { + Node node = new Node(this, method, ins); + callsTo.add(node); + method.callsFrom.add(node); + } } diff --git a/src/main/java/info/sigterm/deob/Methods.java b/src/main/java/info/sigterm/deob/Methods.java index b712e85f9a..5c3e31f0ec 100644 --- a/src/main/java/info/sigterm/deob/Methods.java +++ b/src/main/java/info/sigterm/deob/Methods.java @@ -3,14 +3,16 @@ package info.sigterm.deob; import info.sigterm.deob.pool.NameAndType; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; public class Methods { ClassFile classFile; - private int count; - private Method[] methods; + private List methods = new ArrayList<>(); Methods(ClassFile cf) throws IOException { @@ -18,11 +20,23 @@ public class Methods DataInputStream is = cf.getStream(); - count = is.readUnsignedShort(); - methods = new Method[count]; + int count = is.readUnsignedShort(); for (int i = 0; i < count; ++i) - methods[i] = new Method(this); + methods.add(new Method(this)); + } + + public void write(DataOutputStream out) throws IOException + { + out.writeShort(methods.size()); + for (Method m : methods) + m.write(out); + } + + public void removeMethod(Method m) + { + m.remove(); + methods.remove(methods); } public ClassFile getClassFile() @@ -30,6 +44,11 @@ public class Methods return classFile; } + public List getMethods() + { + return methods; + } + public Method findMethod(NameAndType nat) { for (Method m : methods) @@ -51,4 +70,10 @@ public class Methods for (Method m : methods) m.buildInstructionGraph(); } + + public void buildCallGraph() + { + for (Method m : methods) + m.buildCallGraph(); + } } diff --git a/src/main/java/info/sigterm/deob/attributes/Attribute.java b/src/main/java/info/sigterm/deob/attributes/Attribute.java index e9257db166..12303c4bbc 100644 --- a/src/main/java/info/sigterm/deob/attributes/Attribute.java +++ b/src/main/java/info/sigterm/deob/attributes/Attribute.java @@ -1,13 +1,16 @@ package info.sigterm.deob.attributes; +import java.io.ByteArrayOutputStream; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; -public class Attribute +public abstract class Attribute { private Attributes attributes; private AttributeType type; private int length; + public int nameIndex; Attribute(Attributes attr, AttributeType type) throws IOException { @@ -17,6 +20,18 @@ public class Attribute DataInputStream is = attr.getStream(); this.length = is.readInt(); } + + public void write(DataOutputStream out) throws IOException + { + ByteArrayOutputStream bout = new ByteArrayOutputStream(); + writeAttr(new DataOutputStream(bout)); + + byte[] b = bout.toByteArray(); + out.writeInt(b.length); + out.write(b); + } + + public abstract void writeAttr(DataOutputStream out) throws IOException; public Attributes getAttributes() { diff --git a/src/main/java/info/sigterm/deob/attributes/AttributeType.java b/src/main/java/info/sigterm/deob/attributes/AttributeType.java index bbbe0c7414..38db535d50 100644 --- a/src/main/java/info/sigterm/deob/attributes/AttributeType.java +++ b/src/main/java/info/sigterm/deob/attributes/AttributeType.java @@ -8,6 +8,7 @@ public enum AttributeType private String name; private Class clazz; + public int nameIndex; AttributeType(String name, Class clazz) { diff --git a/src/main/java/info/sigterm/deob/attributes/Attributes.java b/src/main/java/info/sigterm/deob/attributes/Attributes.java index d996e14c3e..580d3ccdce 100644 --- a/src/main/java/info/sigterm/deob/attributes/Attributes.java +++ b/src/main/java/info/sigterm/deob/attributes/Attributes.java @@ -6,6 +6,7 @@ import info.sigterm.deob.Method; import info.sigterm.deob.pool.UTF8; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; import java.lang.reflect.Constructor; @@ -99,6 +100,7 @@ public class Attributes { Constructor con = type.getAttributeClass().getConstructor(new Class[] { Attributes.class }); Attribute attr = con.newInstance(this); + attr.nameIndex = nameIndex; attributes[i] = attr; } @@ -108,4 +110,14 @@ public class Attributes } } } + + public void write(DataOutputStream out) throws IOException + { + out.writeShort(count); + for (Attribute a : attributes) + { + out.writeShort(a.nameIndex); + a.write(out); + } + } } diff --git a/src/main/java/info/sigterm/deob/attributes/Code.java b/src/main/java/info/sigterm/deob/attributes/Code.java index af3b55d7db..c1b4114348 100644 --- a/src/main/java/info/sigterm/deob/attributes/Code.java +++ b/src/main/java/info/sigterm/deob/attributes/Code.java @@ -4,6 +4,7 @@ import info.sigterm.deob.attributes.code.Exceptions; import info.sigterm.deob.attributes.code.Instructions; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class Code extends Attribute @@ -26,7 +27,7 @@ public class Code extends Attribute instructions = new Instructions(this); exceptions = new Exceptions(this); - attributes = new Attributes(this); + this.attributes = new Attributes(this); } public int getMaxStack() @@ -53,4 +54,20 @@ public class Code extends Attribute { instructions.buildInstructionGraph(); } + + public void buildCallGraph() + { + instructions.buildCallGraph(); + } + + @Override + public void writeAttr(DataOutputStream out) throws IOException + { + out.writeShort(maxStack); + out.writeShort(maxLocals); + + instructions.write(out); + exceptions.write(out); + attributes.write(out); + } } diff --git a/src/main/java/info/sigterm/deob/attributes/ConstantValue.java b/src/main/java/info/sigterm/deob/attributes/ConstantValue.java index 67a592bb11..7590903f45 100644 --- a/src/main/java/info/sigterm/deob/attributes/ConstantValue.java +++ b/src/main/java/info/sigterm/deob/attributes/ConstantValue.java @@ -3,22 +3,29 @@ package info.sigterm.deob.attributes; import info.sigterm.deob.pool.PoolEntry; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class ConstantValue extends Attribute { - private int constantVlaueIndex; + private int constantValueIndex; public ConstantValue(Attributes attributes) throws IOException { super(attributes, AttributeType.CONSTANT_VALUE); DataInputStream is = attributes.getStream(); - constantVlaueIndex = is.readUnsignedShort(); + constantValueIndex = is.readUnsignedShort(); } public PoolEntry getValue() { - return this.getAttributes().getClassFile().getPool().getEntry(constantVlaueIndex); + return this.getAttributes().getClassFile().getPool().getEntry(constantValueIndex); + } + + @Override + public void writeAttr(DataOutputStream out) throws IOException + { + out.writeShort(constantValueIndex); } } diff --git a/src/main/java/info/sigterm/deob/attributes/Unknown.java b/src/main/java/info/sigterm/deob/attributes/Unknown.java index 88528adb7f..8fe8201bc9 100644 --- a/src/main/java/info/sigterm/deob/attributes/Unknown.java +++ b/src/main/java/info/sigterm/deob/attributes/Unknown.java @@ -1,6 +1,7 @@ package info.sigterm.deob.attributes; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class Unknown extends Attribute @@ -29,4 +30,10 @@ public class Unknown extends Attribute assert read == len; } + + @Override + public void writeAttr(DataOutputStream out) throws IOException + { + out.write(data); + } } 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 7428888562..9f1c4c5e41 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/Exception.java +++ b/src/main/java/info/sigterm/deob/attributes/code/Exception.java @@ -3,6 +3,7 @@ package info.sigterm.deob.attributes.code; import info.sigterm.deob.ConstantPool; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class Exception @@ -26,6 +27,14 @@ public class Exception catchType = is.readUnsignedShort(); } + public void write(DataOutputStream out) throws IOException + { + out.writeShort(startPc); + out.writeShort(endPc); + out.writeShort(handlerPc); + out.writeShort(catchType); + } + public Exceptions getExceptions() { return exceptions; 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 66a025d116..92aba3dbf3 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/Exceptions.java +++ b/src/main/java/info/sigterm/deob/attributes/code/Exceptions.java @@ -4,6 +4,7 @@ import info.sigterm.deob.attributes.Code; import info.sigterm.deob.execution.ObjectInstance; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; @@ -25,6 +26,13 @@ public class Exceptions for (int i = 0; i < count; ++i) exceptions[i] = new Exception(this); } + + public void write(DataOutputStream out) throws IOException + { + out.writeShort(exceptions.length); + for (Exception e : exceptions) + e.write(out); + } public Code getCode() { 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 82ce6f3ecb..cd92755bbc 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/Instruction.java +++ b/src/main/java/info/sigterm/deob/attributes/code/Instruction.java @@ -2,6 +2,8 @@ package info.sigterm.deob.attributes.code; import info.sigterm.deob.execution.Frame; +import java.io.DataOutputStream; +import java.io.IOException; import java.util.ArrayList; public abstract class Instruction @@ -21,6 +23,11 @@ public abstract class Instruction this.type = type; this.pc = pc; } + + public void write(DataOutputStream out, int pc) throws IOException + { + out.writeByte(type.getCode()); + } public Instructions getInstructions() { @@ -59,6 +66,10 @@ public abstract class Instruction public void buildInstructionGraph() { } + + public void buildCallGraph() + { + } public abstract void execute(Frame e); } 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 52020a7b7e..1d19ffa23a 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/Instructions.java +++ b/src/main/java/info/sigterm/deob/attributes/code/Instructions.java @@ -2,15 +2,18 @@ package info.sigterm.deob.attributes.code; import info.sigterm.deob.attributes.Code; +import java.io.ByteArrayOutputStream; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; import java.lang.reflect.Constructor; import java.util.ArrayList; +import java.util.List; public class Instructions { private Code code; - private ArrayList instructions = new ArrayList(); + private List instructions = new ArrayList<>(); public Instructions(Code code) throws IOException { @@ -46,6 +49,21 @@ public class Instructions buildJumpGraph(); } + + public void write(DataOutputStream out) throws IOException + { + ByteArrayOutputStream b = new ByteArrayOutputStream(); + DataOutputStream o = new DataOutputStream(b); + int pc = 0; + for (Instruction i : instructions) + { + i.write(o, pc); + pc = o.size(); + } + byte[] ba = b.toByteArray(); + out.writeInt(ba.length); + out.write(ba); + } private void buildJumpGraph() { @@ -58,6 +76,12 @@ public class Instructions for (Instruction i : instructions) i.buildInstructionGraph(); } + + public void buildCallGraph() + { + for (Instruction i : instructions) + i.buildCallGraph(); + } public Code getCode() { diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/ALoad.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/ALoad.java index 5e3008ee7d..e02eb6b5ab 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/ALoad.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/ALoad.java @@ -6,6 +6,7 @@ import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class ALoad extends Instruction @@ -20,6 +21,13 @@ public class ALoad extends Instruction index = is.readByte(); length += 1; } + + @Override + public void write(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeByte(index); + } @Override public void execute(Frame frame) 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 535a27b49b..226352c38f 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 @@ -10,6 +10,7 @@ import info.sigterm.deob.execution.Frame; import info.sigterm.deob.pool.Class; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class ANewArray extends Instruction @@ -24,6 +25,13 @@ public class ANewArray extends Instruction index = is.readUnsignedShort(); length += 2; } + + @Override + public void write(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeShort(index); + } @Override public void execute(Frame frame) 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 cf7b1ceddc..af850320d9 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 @@ -6,6 +6,7 @@ import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class AStore extends Instruction @@ -20,6 +21,13 @@ public class AStore extends Instruction index = is.readByte(); length += 1; } + + @Override + public void write(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeByte(index); + } @Override public void execute(Frame frame) diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/BiPush.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/BiPush.java index 397c0ccffb..23abf5e537 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/BiPush.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/BiPush.java @@ -6,6 +6,7 @@ import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class BiPush extends Instruction @@ -20,6 +21,13 @@ public class BiPush extends Instruction b = is.readByte(); length += 1; } + + @Override + public void write(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeByte(b); + } @Override public void execute(Frame frame) 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 80792a9b3a..813c5951c4 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 @@ -10,6 +10,7 @@ import info.sigterm.deob.execution.ObjectInstance; import info.sigterm.deob.pool.Class; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class CheckCast extends Instruction @@ -24,6 +25,13 @@ public class CheckCast extends Instruction index = is.readUnsignedShort(); length += 2; } + + @Override + public void write(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeShort(index); + } @Override public void execute(Frame e) diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/DLoad.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/DLoad.java index e5caee4e94..d7ac978dd3 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/DLoad.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/DLoad.java @@ -6,6 +6,7 @@ import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class DLoad extends Instruction @@ -20,6 +21,13 @@ public class DLoad extends Instruction index = is.readByte(); length += 1; } + + @Override + public void write(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeByte(index); + } @Override public void execute(Frame frame) diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/DStore.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/DStore.java index cfd59499b2..ed156a3521 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/DStore.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/DStore.java @@ -6,6 +6,7 @@ import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class DStore extends Instruction @@ -20,6 +21,13 @@ public class DStore extends Instruction index = is.readByte(); length += 1; } + + @Override + public void write(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeByte(index); + } @Override public void execute(Frame frame) diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FLoad.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FLoad.java index cc387cf557..d1dbc79960 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FLoad.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FLoad.java @@ -6,6 +6,7 @@ import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class FLoad extends Instruction @@ -20,6 +21,13 @@ public class FLoad extends Instruction index = is.readByte(); length += 1; } + + @Override + public void write(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeByte(index); + } @Override public void execute(Frame frame) diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FStore.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FStore.java index 39c5208d50..d4c272c29d 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FStore.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FStore.java @@ -6,6 +6,7 @@ import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class FStore extends Instruction @@ -20,6 +21,13 @@ public class FStore extends Instruction index = is.readByte(); length += 1; } + + @Override + public void write(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeByte(index); + } @Override public void execute(Frame frame) 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 9db12acd18..dca6b9e00e 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 @@ -12,6 +12,7 @@ import info.sigterm.deob.pool.Field; import info.sigterm.deob.pool.NameAndType; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class GetField extends Instruction @@ -26,6 +27,13 @@ public class GetField extends Instruction index = is.readUnsignedShort(); length += 2; } + + @Override + public void write(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeShort(index); + } @Override public void execute(Frame frame) 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 1f509db38d..26d0103010 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 @@ -13,6 +13,7 @@ import info.sigterm.deob.pool.Field; import info.sigterm.deob.pool.NameAndType; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class GetStatic extends Instruction @@ -27,6 +28,13 @@ public class GetStatic extends Instruction index = is.readUnsignedShort(); length += 2; } + + @Override + public void write(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeShort(index); + } @Override public void execute(Frame frame) diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/Goto.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/Goto.java index a970fcded6..e098ed1d70 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/Goto.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/Goto.java @@ -6,6 +6,7 @@ import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class Goto extends Instruction @@ -20,6 +21,13 @@ public class Goto extends Instruction offset = is.readShort(); length += 2; } + + @Override + public void write(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeShort(offset); + } @Override public void buildJumpGraph() diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/GotoW.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/GotoW.java index 638a672560..220c382452 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/GotoW.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/GotoW.java @@ -6,6 +6,7 @@ import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class GotoW extends Instruction @@ -20,6 +21,13 @@ public class GotoW extends Instruction offset = is.readInt(); length += 4; } + + @Override + public void write(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeInt(offset); + } @Override public void buildJumpGraph() diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IInc.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IInc.java index 09adfe4a7f..e7bc03f3bd 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IInc.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IInc.java @@ -6,6 +6,7 @@ import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class IInc extends Instruction @@ -22,6 +23,14 @@ public class IInc extends Instruction inc = is.readByte(); length += 2; } + + @Override + public void write(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeByte(index); + out.writeByte(inc); + } @Override public void execute(Frame frame) diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/ILoad.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/ILoad.java index 36849b2038..614ac58742 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/ILoad.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/ILoad.java @@ -6,6 +6,7 @@ import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class ILoad extends Instruction @@ -20,6 +21,13 @@ public class ILoad extends Instruction index = is.readByte(); length += 1; } + + @Override + public void write(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeByte(index); + } @Override public void execute(Frame frame) diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IStore.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IStore.java index f263586b95..c3fd4ea135 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IStore.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IStore.java @@ -6,6 +6,7 @@ import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class IStore extends Instruction @@ -20,6 +21,13 @@ public class IStore extends Instruction index = is.readByte(); length += 1; } + + @Override + public void write(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeByte(index); + } @Override public void execute(Frame frame) diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/If.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/If.java index c1852346ec..72129e48f1 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/If.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/If.java @@ -7,6 +7,7 @@ import info.sigterm.deob.execution.Frame; import info.sigterm.deob.execution.Path; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class If extends Instruction @@ -21,6 +22,13 @@ public class If extends Instruction offset = is.readShort(); length += 2; } + + @Override + public void write(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeShort(offset); + } @Override public void buildJumpGraph() diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/If0.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/If0.java index 3ad221efcc..a5ce57e2b8 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/If0.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/If0.java @@ -7,6 +7,7 @@ import info.sigterm.deob.execution.Frame; import info.sigterm.deob.execution.Path; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class If0 extends Instruction @@ -21,6 +22,13 @@ public class If0 extends Instruction offset = is.readShort(); length += 2; } + + @Override + public void write(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeShort(offset); + } @Override public void buildJumpGraph() 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 39f8d3aed1..0fff49ace9 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 @@ -10,6 +10,7 @@ import info.sigterm.deob.execution.ObjectInstanceBase; import info.sigterm.deob.pool.Class; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class InstanceOf extends Instruction @@ -24,6 +25,13 @@ public class InstanceOf extends Instruction index = is.readUnsignedShort(); length += 2; } + + @Override + public void write(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeShort(index); + } @Override public void execute(Frame e) 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 a0572ed858..d6a205fc86 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 @@ -10,8 +10,10 @@ import info.sigterm.deob.execution.ClassInstance; import info.sigterm.deob.execution.Frame; import info.sigterm.deob.execution.ObjectInstance; import info.sigterm.deob.pool.InterfaceMethod; +import info.sigterm.deob.pool.NameAndType; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class InvokeInterface extends Instruction @@ -29,6 +31,36 @@ public class InvokeInterface extends Instruction is.skip(1); length += 4; } + + @Override + public void write(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeShort(index); + out.writeByte(count); + out.writeByte(0); + } + + @Override + public void buildCallGraph() + { + ClassFile thisClass = this.getInstructions().getCode().getAttributes().getClassFile(); + + ConstantPool pool = thisClass.getPool(); + InterfaceMethod method = (InterfaceMethod) pool.getEntry(index); + + info.sigterm.deob.pool.Class clazz = method.getClassEntry(); + NameAndType nat = method.getNameAndType(); + + info.sigterm.deob.Method thisMethod = this.getInstructions().getCode().getAttributes().getMethod(); + + ClassFile otherClass = this.getInstructions().getCode().getAttributes().getClassFile().getGroup().findClass(clazz.getName()); + if (otherClass == null) + return; + info.sigterm.deob.Method other = otherClass.findMethod(nat); + + thisMethod.addCallTo(this, other); + } @Override public void execute(Frame e) 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 20ce8162e4..2ddceae8d5 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 @@ -9,9 +9,11 @@ import info.sigterm.deob.execution.ClassInstance; import info.sigterm.deob.execution.Frame; import info.sigterm.deob.execution.ObjectInstance; import info.sigterm.deob.pool.Method; +import info.sigterm.deob.pool.NameAndType; import info.sigterm.deob.pool.PoolEntry; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class InvokeSpecial extends Instruction @@ -26,6 +28,35 @@ public class InvokeSpecial extends Instruction index = is.readUnsignedShort(); length += 2; } + + @Override + public void write(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeShort(index); + } + + @Override + public void buildCallGraph() + { + ClassFile thisClass = this.getInstructions().getCode().getAttributes().getClassFile(); + + ConstantPool pool = thisClass.getPool(); + Method method = (Method) pool.getEntry(index); + + info.sigterm.deob.pool.Class clazz = method.getClassEntry(); + NameAndType nat = method.getNameAndType(); + + info.sigterm.deob.Method thisMethod = this.getInstructions().getCode().getAttributes().getMethod(); + + ClassFile otherClass = this.getInstructions().getCode().getAttributes().getClassFile().getGroup().findClass(clazz.getName()); + if (otherClass == null) + return; + + info.sigterm.deob.Method other = otherClass.findMethod(nat); + + thisMethod.addCallTo(this, other); + } @Override public void execute(Frame e) 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 e47184b66f..0487f9728d 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 @@ -7,8 +7,10 @@ import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; import info.sigterm.deob.pool.Method; +import info.sigterm.deob.pool.NameAndType; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class InvokeStatic extends Instruction @@ -23,6 +25,35 @@ public class InvokeStatic extends Instruction index = is.readUnsignedShort(); length += 2; } + + @Override + public void write(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeShort(index); + } + + @Override + public void buildCallGraph() + { + ClassFile thisClass = this.getInstructions().getCode().getAttributes().getClassFile(); + + ConstantPool pool = thisClass.getPool(); + Method method = (Method) pool.getEntry(index); + + info.sigterm.deob.pool.Class clazz = method.getClassEntry(); + NameAndType nat = method.getNameAndType(); + + info.sigterm.deob.Method thisMethod = this.getInstructions().getCode().getAttributes().getMethod(); + + ClassFile otherClass = this.getInstructions().getCode().getAttributes().getClassFile().getGroup().findClass(clazz.getName()); + if (otherClass == null) + return; + + info.sigterm.deob.Method other = otherClass.findMethod(nat); + + thisMethod.addCallTo(this, other); + } @Override public void execute(Frame e) 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 037d187d60..2c17af404f 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 @@ -9,8 +9,10 @@ import info.sigterm.deob.execution.ClassInstance; import info.sigterm.deob.execution.Frame; import info.sigterm.deob.execution.ObjectInstance; import info.sigterm.deob.pool.Method; +import info.sigterm.deob.pool.NameAndType; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class InvokeVirtual extends Instruction @@ -25,6 +27,36 @@ public class InvokeVirtual extends Instruction index = is.readUnsignedShort(); length += 2; } + + @Override + public void write(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeShort(index); + } + + @Override + public void buildCallGraph() + { + ClassFile thisClass = this.getInstructions().getCode().getAttributes().getClassFile(); + + ConstantPool pool = thisClass.getPool(); + Method method = (Method) pool.getEntry(index); + + info.sigterm.deob.pool.Class clazz = method.getClassEntry(); + NameAndType nat = method.getNameAndType(); + + info.sigterm.deob.Method thisMethod = this.getInstructions().getCode().getAttributes().getMethod(); + + ClassFile otherClass = this.getInstructions().getCode().getAttributes().getClassFile().getGroup().findClass(clazz.getName()); + if (otherClass == null) + return; + info.sigterm.deob.Method other = otherClass.findMethod(nat); + if (other == null) + return; + + thisMethod.addCallTo(this, other); + } @Override public void execute(Frame e) diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LDC.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LDC.java index 66d14fc44a..ed75a5a8b1 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LDC.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LDC.java @@ -8,6 +8,7 @@ import info.sigterm.deob.execution.Frame; import info.sigterm.deob.pool.PoolEntry; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class LDC extends Instruction @@ -22,6 +23,13 @@ public class LDC extends Instruction index = is.readByte(); length += 1; } + + @Override + public void write(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeByte(index); + } @Override public void execute(Frame frame) diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LDC2_W.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LDC2_W.java index 7b02c2c0ba..6b0a9e124b 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LDC2_W.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LDC2_W.java @@ -8,6 +8,7 @@ import info.sigterm.deob.execution.Frame; import info.sigterm.deob.pool.PoolEntry; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class LDC2_W extends Instruction @@ -22,6 +23,13 @@ public class LDC2_W extends Instruction index = is.readUnsignedShort(); length += 2; } + + @Override + public void write(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeShort(index); + } @Override public void execute(Frame frame) diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LDC_W.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LDC_W.java index 6c740c3e9e..b56123f9da 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LDC_W.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LDC_W.java @@ -8,6 +8,7 @@ import info.sigterm.deob.execution.Frame; import info.sigterm.deob.pool.PoolEntry; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class LDC_W extends Instruction @@ -22,6 +23,13 @@ public class LDC_W extends Instruction index = is.readUnsignedShort(); length += 2; } + + @Override + public void write(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeShort(index); + } @Override public void execute(Frame frame) diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LLoad.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LLoad.java index a8e47fa233..658dc698d7 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LLoad.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LLoad.java @@ -6,6 +6,7 @@ import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class LLoad extends Instruction @@ -20,6 +21,13 @@ public class LLoad extends Instruction index = is.readByte(); length += 1; } + + @Override + public void write(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeByte(index); + } @Override public void execute(Frame frame) diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LStore.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LStore.java index 8c2a5c4f2f..4b523ecb12 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LStore.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LStore.java @@ -6,6 +6,7 @@ import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class LStore extends Instruction @@ -20,6 +21,13 @@ public class LStore extends Instruction index = is.readByte(); length += 1; } + + @Override + public void write(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeByte(index); + } @Override public void execute(Frame frame) diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LookupSwitch.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LookupSwitch.java index 9cfd3c4cc7..20b2e72b27 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LookupSwitch.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LookupSwitch.java @@ -7,6 +7,7 @@ import info.sigterm.deob.execution.Frame; import info.sigterm.deob.execution.Path; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class LookupSwitch extends Instruction @@ -40,6 +41,25 @@ public class LookupSwitch extends Instruction length += tableSkip + 8 + (count * 8); } + + @Override + public void write(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + + int tableSkip = 4 - (pc + 1) % 4; + if (tableSkip == 4) tableSkip = 0; + if (tableSkip > 0) out.write(new byte[tableSkip]); + + out.writeInt(def); + + out.writeInt(count); + for (int i = 0; i < count; ++i) + { + out.writeInt(match[i]); + out.writeInt(branch[i]); + } + } @Override public void buildJumpGraph() 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 7fbfdef923..2cc764b35f 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 @@ -9,6 +9,7 @@ import info.sigterm.deob.execution.Stack; import info.sigterm.deob.pool.Class; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class MultiANewArray extends Instruction @@ -26,6 +27,14 @@ public class MultiANewArray extends Instruction length += 3; } + @Override + public void write(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeShort(index); + out.writeByte(dimensions); + } + @Override public void execute(Frame e) { 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 2224119416..8a8ce5f5a7 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 @@ -10,6 +10,7 @@ import info.sigterm.deob.execution.ObjectInstance; import info.sigterm.deob.pool.Class; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class New extends Instruction @@ -24,6 +25,13 @@ public class New extends Instruction index = is.readUnsignedShort(); length += 2; } + + @Override + public void write(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeShort(index); + } @Override public void execute(Frame e) diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/NewArray.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/NewArray.java index 64f5215320..db9defee96 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/NewArray.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/NewArray.java @@ -6,6 +6,7 @@ import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class NewArray extends Instruction @@ -20,6 +21,13 @@ public class NewArray extends Instruction this.type = is.readUnsignedByte(); length += 1; } + + @Override + public void write(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeByte(type); + } @Override public void execute(Frame e) 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 651f444991..b2cd35926c 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 @@ -12,6 +12,7 @@ import info.sigterm.deob.pool.Field; import info.sigterm.deob.pool.NameAndType; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class PutField extends Instruction @@ -26,6 +27,13 @@ public class PutField extends Instruction index = is.readUnsignedShort(); length += 2; } + + @Override + public void write(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeShort(index); + } @Override public void execute(Frame e) 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 aa496a3079..b4792d47f2 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 @@ -13,6 +13,7 @@ import info.sigterm.deob.pool.Field; import info.sigterm.deob.pool.NameAndType; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class PutStatic extends Instruction @@ -27,6 +28,13 @@ public class PutStatic extends Instruction index = is.readUnsignedShort(); length += 2; } + + @Override + public void write(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeShort(index); + } @Override public void execute(Frame e) diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/SiPush.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/SiPush.java index 1d33ce6d12..c58dad7b7c 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/SiPush.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/SiPush.java @@ -6,6 +6,7 @@ import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class SiPush extends Instruction @@ -20,6 +21,13 @@ public class SiPush extends Instruction s = is.readShort(); length += 2; } + + @Override + public void write(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + out.writeShort(s); + } @Override public void execute(Frame frame) diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/TableSwitch.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/TableSwitch.java index 3f670cbfc4..e652051545 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/TableSwitch.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/TableSwitch.java @@ -7,6 +7,7 @@ import info.sigterm.deob.execution.Frame; import info.sigterm.deob.execution.Path; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class TableSwitch extends Instruction @@ -38,6 +39,23 @@ public class TableSwitch extends Instruction length += tableSkip + 12 + (count * 4); } + + @Override + public void write(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + + int tableSkip = 4 - (pc + 1) % 4; + if (tableSkip == 4) tableSkip = 0; + if (tableSkip > 0) out.write(new byte[tableSkip]); + + out.writeInt(def); + out.writeInt(low); + out.writeInt(high); + + for (int i = 0; i < high - low + 1; ++i) + out.writeInt(jumps[i]); + } @Override public void buildJumpGraph() diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/Wide.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/Wide.java index 2822f09713..d3f96ffd41 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/Wide.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/Wide.java @@ -6,6 +6,7 @@ import info.sigterm.deob.attributes.code.Instructions; import info.sigterm.deob.execution.Frame; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class Wide extends Instruction @@ -33,6 +34,22 @@ public class Wide extends Instruction length += 2; } } + + @Override + public void write(DataOutputStream out, int pc) throws IOException + { + super.write(out, pc); + + out.writeByte(opcode); + out.writeShort(index); + + InstructionType optype = InstructionType.findInstructionFromCode(opcode); + assert optype != null; + if (optype == InstructionType.IINC) + { + out.writeShort(value); + } + } @Override public void execute(Frame e) diff --git a/src/main/java/info/sigterm/deob/callgraph/Node.java b/src/main/java/info/sigterm/deob/callgraph/Node.java new file mode 100644 index 0000000000..28078db7ed --- /dev/null +++ b/src/main/java/info/sigterm/deob/callgraph/Node.java @@ -0,0 +1,17 @@ +package info.sigterm.deob.callgraph; + +import info.sigterm.deob.Method; +import info.sigterm.deob.attributes.code.Instruction; + +public class Node +{ + public Method from, to; + public Instruction ins; + + public Node(Method from, Method to, Instruction ins) + { + this.from = from; + this.to = to; + this.ins = ins; + } +} diff --git a/src/main/java/info/sigterm/deob/pool/Class.java b/src/main/java/info/sigterm/deob/pool/Class.java index f6c5b77f07..1f10a76cf3 100644 --- a/src/main/java/info/sigterm/deob/pool/Class.java +++ b/src/main/java/info/sigterm/deob/pool/Class.java @@ -3,6 +3,7 @@ package info.sigterm.deob.pool; import info.sigterm.deob.ConstantPool; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class Class extends PoolEntry @@ -22,4 +23,10 @@ public class Class extends PoolEntry UTF8 u = (UTF8) this.getPool().getEntry(index); return u.getValue(); } + + @Override + public void write(DataOutputStream out) throws IOException + { + out.writeShort(index); + } } diff --git a/src/main/java/info/sigterm/deob/pool/Double.java b/src/main/java/info/sigterm/deob/pool/Double.java index 3f28acbdce..3d99bb5540 100644 --- a/src/main/java/info/sigterm/deob/pool/Double.java +++ b/src/main/java/info/sigterm/deob/pool/Double.java @@ -3,6 +3,7 @@ package info.sigterm.deob.pool; import info.sigterm.deob.ConstantPool; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class Double extends PoolEntry @@ -29,4 +30,10 @@ public class Double extends PoolEntry { return value; } + + @Override + public void write(DataOutputStream out) throws IOException + { + out.writeDouble(value); + } } diff --git a/src/main/java/info/sigterm/deob/pool/Field.java b/src/main/java/info/sigterm/deob/pool/Field.java index 1b2798fc5e..96a6a55606 100644 --- a/src/main/java/info/sigterm/deob/pool/Field.java +++ b/src/main/java/info/sigterm/deob/pool/Field.java @@ -3,6 +3,7 @@ package info.sigterm.deob.pool; import info.sigterm.deob.ConstantPool; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class Field extends PoolEntry @@ -29,4 +30,11 @@ public class Field extends PoolEntry { return (NameAndType) this.getPool().getEntry(nameAndTypeIndex); } + + @Override + public void write(DataOutputStream out) throws IOException + { + out.writeShort(classIndex); + out.writeShort(nameAndTypeIndex); + } } diff --git a/src/main/java/info/sigterm/deob/pool/Float.java b/src/main/java/info/sigterm/deob/pool/Float.java index 5babbd7aa6..96d1d3dba6 100644 --- a/src/main/java/info/sigterm/deob/pool/Float.java +++ b/src/main/java/info/sigterm/deob/pool/Float.java @@ -3,6 +3,7 @@ package info.sigterm.deob.pool; import info.sigterm.deob.ConstantPool; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class Float extends PoolEntry @@ -23,4 +24,10 @@ public class Float extends PoolEntry { return value; } + + @Override + public void write(DataOutputStream out) throws IOException + { + out.writeFloat(value); + } } diff --git a/src/main/java/info/sigterm/deob/pool/Integer.java b/src/main/java/info/sigterm/deob/pool/Integer.java index da21faacba..ca779f7aaf 100644 --- a/src/main/java/info/sigterm/deob/pool/Integer.java +++ b/src/main/java/info/sigterm/deob/pool/Integer.java @@ -3,6 +3,7 @@ package info.sigterm.deob.pool; import info.sigterm.deob.ConstantPool; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class Integer extends PoolEntry @@ -23,4 +24,10 @@ public class Integer extends PoolEntry { return value; } + + @Override + public void write(DataOutputStream out) throws IOException + { + out.writeInt(value); + } } diff --git a/src/main/java/info/sigterm/deob/pool/InterfaceMethod.java b/src/main/java/info/sigterm/deob/pool/InterfaceMethod.java index 3dc478f134..25e28e9d1c 100644 --- a/src/main/java/info/sigterm/deob/pool/InterfaceMethod.java +++ b/src/main/java/info/sigterm/deob/pool/InterfaceMethod.java @@ -3,6 +3,7 @@ package info.sigterm.deob.pool; import info.sigterm.deob.ConstantPool; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class InterfaceMethod extends PoolEntry @@ -29,4 +30,11 @@ public class InterfaceMethod extends PoolEntry { return (NameAndType) this.getPool().getEntry(nameAndTypeIndex); } + + @Override + public void write(DataOutputStream out) throws IOException + { + out.writeShort(classIndex); + out.writeShort(nameAndTypeIndex); + } } diff --git a/src/main/java/info/sigterm/deob/pool/Long.java b/src/main/java/info/sigterm/deob/pool/Long.java index b715f84b0f..05e0da925e 100644 --- a/src/main/java/info/sigterm/deob/pool/Long.java +++ b/src/main/java/info/sigterm/deob/pool/Long.java @@ -3,6 +3,7 @@ package info.sigterm.deob.pool; import info.sigterm.deob.ConstantPool; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class Long extends PoolEntry @@ -29,4 +30,10 @@ public class Long extends PoolEntry { return value; } + + @Override + public void write(DataOutputStream out) throws IOException + { + out.writeLong(value); + } } diff --git a/src/main/java/info/sigterm/deob/pool/Method.java b/src/main/java/info/sigterm/deob/pool/Method.java index 5021157947..fa0df0bfc9 100644 --- a/src/main/java/info/sigterm/deob/pool/Method.java +++ b/src/main/java/info/sigterm/deob/pool/Method.java @@ -3,6 +3,7 @@ package info.sigterm.deob.pool; import info.sigterm.deob.ConstantPool; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class Method extends PoolEntry @@ -29,4 +30,11 @@ public class Method extends PoolEntry { return (NameAndType) this.getPool().getEntry(nameAndTypeIndex); } + + @Override + public void write(DataOutputStream out) throws IOException + { + out.writeShort(classIndex); + out.writeShort(nameAndTypeIndex); + } } diff --git a/src/main/java/info/sigterm/deob/pool/NameAndType.java b/src/main/java/info/sigterm/deob/pool/NameAndType.java index 0b663c8e1d..034514e6c7 100644 --- a/src/main/java/info/sigterm/deob/pool/NameAndType.java +++ b/src/main/java/info/sigterm/deob/pool/NameAndType.java @@ -3,6 +3,7 @@ package info.sigterm.deob.pool; import info.sigterm.deob.ConstantPool; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -87,4 +88,11 @@ public class NameAndType extends PoolEntry return true; return !methodRefType.endsWith(")V"); } + + @Override + public void write(DataOutputStream out) throws IOException + { + out.writeShort(nameIndex); + out.writeShort(descriptorIndex); + } } diff --git a/src/main/java/info/sigterm/deob/pool/PoolEntry.java b/src/main/java/info/sigterm/deob/pool/PoolEntry.java index 791d15bf3b..48169d61f2 100644 --- a/src/main/java/info/sigterm/deob/pool/PoolEntry.java +++ b/src/main/java/info/sigterm/deob/pool/PoolEntry.java @@ -1,5 +1,8 @@ package info.sigterm.deob.pool; +import java.io.DataOutputStream; +import java.io.IOException; + import info.sigterm.deob.ConstantPool; public abstract class PoolEntry @@ -12,11 +15,18 @@ public abstract class PoolEntry this.pool = pool; this.type = type; } + + public abstract void write(DataOutputStream out) throws IOException; public ConstantPool getPool() { return pool; } + + public ConstantType getType() + { + return type; + } public int getSlots() { diff --git a/src/main/java/info/sigterm/deob/pool/String.java b/src/main/java/info/sigterm/deob/pool/String.java index 825963943e..aae5c1ac8c 100644 --- a/src/main/java/info/sigterm/deob/pool/String.java +++ b/src/main/java/info/sigterm/deob/pool/String.java @@ -3,6 +3,7 @@ package info.sigterm.deob.pool; import info.sigterm.deob.ConstantPool; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class String extends PoolEntry @@ -23,4 +24,10 @@ public class String extends PoolEntry { return this.getPool().getEntry(stringIndex).getObject(); } + + @Override + public void write(DataOutputStream out) throws IOException + { + out.writeShort(stringIndex); + } } diff --git a/src/main/java/info/sigterm/deob/pool/UTF8.java b/src/main/java/info/sigterm/deob/pool/UTF8.java index 4bf3963bba..f2944fb420 100644 --- a/src/main/java/info/sigterm/deob/pool/UTF8.java +++ b/src/main/java/info/sigterm/deob/pool/UTF8.java @@ -3,6 +3,7 @@ package info.sigterm.deob.pool; import info.sigterm.deob.ConstantPool; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; public class UTF8 extends PoolEntry @@ -51,4 +52,14 @@ public class UTF8 extends PoolEntry { return sb.toString(); } + + @Override + public void write(DataOutputStream out) throws IOException + { + java.lang.String s = getValue(); + byte[] bytes = s.getBytes("UTF-8"); + + out.writeShort(bytes.length); + out.write(bytes); + } }