diff --git a/src/main/java/info/sigterm/deob/ClassFile.java b/src/main/java/info/sigterm/deob/ClassFile.java index 54d124bb8d..971ecb2cf5 100644 --- a/src/main/java/info/sigterm/deob/ClassFile.java +++ b/src/main/java/info/sigterm/deob/ClassFile.java @@ -1,5 +1,6 @@ package info.sigterm.deob; +import info.sigterm.deob.attributes.Attributes; import info.sigterm.deob.pool.Class; import info.sigterm.deob.pool.UTF8; @@ -81,7 +82,6 @@ public class ClassFile if (other == null) return; // inherits from a class not in my group - assert other != null; assert other != this; this.parent = other; diff --git a/src/main/java/info/sigterm/deob/Field.java b/src/main/java/info/sigterm/deob/Field.java index abcfe78f65..87e27ee7be 100644 --- a/src/main/java/info/sigterm/deob/Field.java +++ b/src/main/java/info/sigterm/deob/Field.java @@ -1,9 +1,11 @@ package info.sigterm.deob; +import info.sigterm.deob.attributes.Attributes; + import java.io.DataInputStream; import java.io.IOException; -class Field +public class Field { private Fields fields; diff --git a/src/main/java/info/sigterm/deob/Method.java b/src/main/java/info/sigterm/deob/Method.java index 0fde3853bf..ec86718936 100644 --- a/src/main/java/info/sigterm/deob/Method.java +++ b/src/main/java/info/sigterm/deob/Method.java @@ -1,9 +1,13 @@ package info.sigterm.deob; +import info.sigterm.deob.attributes.AttributeType; +import info.sigterm.deob.attributes.Attributes; +import info.sigterm.deob.attributes.Code; + import java.io.DataInputStream; import java.io.IOException; -class Method +public class Method { private Methods methods; @@ -28,4 +32,9 @@ class Method { return methods; } + + public Code getCode() + { + return (Code) attributes.findType(AttributeType.CODE); + } } diff --git a/src/main/java/info/sigterm/deob/attributes/Attribute.java b/src/main/java/info/sigterm/deob/attributes/Attribute.java index 76922506eb..e9257db166 100644 --- a/src/main/java/info/sigterm/deob/attributes/Attribute.java +++ b/src/main/java/info/sigterm/deob/attributes/Attribute.java @@ -1,7 +1,5 @@ package info.sigterm.deob.attributes; -import info.sigterm.deob.Attributes; - import java.io.DataInputStream; import java.io.IOException; @@ -25,6 +23,11 @@ public class Attribute return attributes; } + public AttributeType getType() + { + return type; + } + public int getLength() { return length; diff --git a/src/main/java/info/sigterm/deob/Attributes.java b/src/main/java/info/sigterm/deob/attributes/Attributes.java similarity index 77% rename from src/main/java/info/sigterm/deob/Attributes.java rename to src/main/java/info/sigterm/deob/attributes/Attributes.java index 5e34bbba53..f5def18e04 100644 --- a/src/main/java/info/sigterm/deob/Attributes.java +++ b/src/main/java/info/sigterm/deob/attributes/Attributes.java @@ -1,8 +1,8 @@ -package info.sigterm.deob; +package info.sigterm.deob.attributes; -import info.sigterm.deob.attributes.Attribute; -import info.sigterm.deob.attributes.AttributeType; -import info.sigterm.deob.attributes.Code; +import info.sigterm.deob.ClassFile; +import info.sigterm.deob.Field; +import info.sigterm.deob.Method; import info.sigterm.deob.pool.UTF8; import java.io.DataInputStream; @@ -19,21 +19,21 @@ public class Attributes private int count; private Attribute[] attributes; - Attributes(ClassFile cf) throws IOException + public Attributes(ClassFile cf) throws IOException { classFile = cf; load(); } - Attributes(Field f) throws IOException + public Attributes(Field f) throws IOException { field = f; load(); } - Attributes(Method m) throws IOException + public Attributes(Method m) throws IOException { method = m; @@ -47,6 +47,14 @@ public class Attributes load(); } + public Attribute findType(AttributeType type) + { + for (Attribute a : attributes) + if (a.getType() == type) + return a; + return null; + } + public ClassFile getClassFile() { if (classFile != null) diff --git a/src/main/java/info/sigterm/deob/attributes/Code.java b/src/main/java/info/sigterm/deob/attributes/Code.java index 9701320bbc..38d8628797 100644 --- a/src/main/java/info/sigterm/deob/attributes/Code.java +++ b/src/main/java/info/sigterm/deob/attributes/Code.java @@ -1,6 +1,5 @@ package info.sigterm.deob.attributes; -import info.sigterm.deob.Attributes; import info.sigterm.deob.attributes.code.Exceptions; import info.sigterm.deob.attributes.code.Instructions; @@ -29,4 +28,14 @@ public class Code extends Attribute exceptions = new Exceptions(this); attributes = new Attributes(this); } + + public int getMaxStack() + { + return getMaxStack(); + } + + public int getMaxLocals() + { + return maxLocals; + } } diff --git a/src/main/java/info/sigterm/deob/attributes/ConstantValue.java b/src/main/java/info/sigterm/deob/attributes/ConstantValue.java index 4c90a265e9..e2cbea2271 100644 --- a/src/main/java/info/sigterm/deob/attributes/ConstantValue.java +++ b/src/main/java/info/sigterm/deob/attributes/ConstantValue.java @@ -1,7 +1,5 @@ package info.sigterm.deob.attributes; -import info.sigterm.deob.Attributes; - import java.io.DataInputStream; import java.io.IOException; diff --git a/src/main/java/info/sigterm/deob/attributes/Unknown.java b/src/main/java/info/sigterm/deob/attributes/Unknown.java index a01243bede..88528adb7f 100644 --- a/src/main/java/info/sigterm/deob/attributes/Unknown.java +++ b/src/main/java/info/sigterm/deob/attributes/Unknown.java @@ -1,7 +1,5 @@ package info.sigterm.deob.attributes; -import info.sigterm.deob.Attributes; - import java.io.DataInputStream; import java.io.IOException; 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 ba7b399bd1..a0c47255d1 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,7 @@ package info.sigterm.deob.attributes.code; +import info.sigterm.deob.execution.Execution; + import java.util.ArrayList; public class Instruction @@ -43,4 +45,8 @@ public class Instruction public void buildJumpGraph() { } + + public void execute(Execution 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 0e0f1b4ca9..231bfd51a0 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 @@ -19,5 +19,4 @@ public class InvokeStatic extends Instruction index = is.readUnsignedShort(); length += 2; } - } diff --git a/src/main/java/info/sigterm/deob/execution/Execution.java b/src/main/java/info/sigterm/deob/execution/Execution.java new file mode 100644 index 0000000000..79527d5866 --- /dev/null +++ b/src/main/java/info/sigterm/deob/execution/Execution.java @@ -0,0 +1,19 @@ +package info.sigterm.deob.execution; + +import info.sigterm.deob.ClassGroup; +import info.sigterm.deob.pool.Method; + +public class Execution +{ + private ClassGroup group; + private java.util.Stack frames = new java.util.Stack(); + + public Execution(ClassGroup group) + { + this.group = group; + } + + public void run(Method method, Object... args) + { + } +} diff --git a/src/main/java/info/sigterm/deob/execution/Frame.java b/src/main/java/info/sigterm/deob/execution/Frame.java new file mode 100644 index 0000000000..5a96c404a7 --- /dev/null +++ b/src/main/java/info/sigterm/deob/execution/Frame.java @@ -0,0 +1,23 @@ +package info.sigterm.deob.execution; + +import info.sigterm.deob.Method; +import info.sigterm.deob.attributes.Code; + +public class Frame +{ + private Execution execution; + private Method method; + private Stack stack; + private Variables variables; + + public Frame(Execution execution, Method method) + { + Code code = method.getCode(); + + this.execution = execution; + this.method = method; + + stack = new Stack(code.getMaxStack()); + variables = new Variables(code.getMaxLocals()); + } +} diff --git a/src/main/java/info/sigterm/deob/execution/Stack.java b/src/main/java/info/sigterm/deob/execution/Stack.java new file mode 100644 index 0000000000..6482a3d510 --- /dev/null +++ b/src/main/java/info/sigterm/deob/execution/Stack.java @@ -0,0 +1,28 @@ +package info.sigterm.deob.execution; + +public class Stack +{ + private int size; + private Object[] stack; + + public Stack(int sz) + { + stack = new Object[sz]; + } + + public void push(Object obj) + { + if (size == stack.length) + throw new RuntimeException("Stack overflow"); + + stack[size++] = obj; + } + + public Object pop() + { + if (size <= 0) + throw new RuntimeException("Stack underflow"); + + return stack[--size]; + } +} diff --git a/src/main/java/info/sigterm/deob/execution/Variables.java b/src/main/java/info/sigterm/deob/execution/Variables.java new file mode 100644 index 0000000000..634d953f96 --- /dev/null +++ b/src/main/java/info/sigterm/deob/execution/Variables.java @@ -0,0 +1,11 @@ +package info.sigterm.deob.execution; + +public class Variables +{ + private Object variables; + + public Variables(int sz) + { + variables = new Object[sz]; + } +}