diff --git a/src/main/java/info/sigterm/deob/ClassFile.java b/src/main/java/info/sigterm/deob/ClassFile.java index 228dc5b080..6b5857b7ae 100644 --- a/src/main/java/info/sigterm/deob/ClassFile.java +++ b/src/main/java/info/sigterm/deob/ClassFile.java @@ -115,6 +115,19 @@ public class ClassFile return null; } + + public Method findMethod(String name) + { + Method m = methods.findMethod(name); + if (m != null) + return m; + + ClassFile parent = getParent(); + if (parent != null) + return parent.findMethod(name); + + return null; + } public void buildClassGraph() { diff --git a/src/main/java/info/sigterm/deob/Deob.java b/src/main/java/info/sigterm/deob/Deob.java index 880ed810c7..441ce73600 100644 --- a/src/main/java/info/sigterm/deob/Deob.java +++ b/src/main/java/info/sigterm/deob/Deob.java @@ -1,5 +1,7 @@ package info.sigterm.deob; +import info.sigterm.deob.execution.Execution; + import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; @@ -24,8 +26,20 @@ public class Deob InputStream is = jar.getInputStream(entry); group.addClass(entry.getName(), new DataInputStream(is)); } + jar.close(); group.buildClassGraph(); group.buildInstructionGraph(); + + execute(group); + } + + private static void execute(ClassGroup group) throws IOException + { + ClassFile cf = group.findClass("client"); + Method method = cf.findMethod("init"); + + Execution e = new Execution(group); + e.run(cf, method); } } diff --git a/src/main/java/info/sigterm/deob/Methods.java b/src/main/java/info/sigterm/deob/Methods.java index a43a600020..b712e85f9a 100644 --- a/src/main/java/info/sigterm/deob/Methods.java +++ b/src/main/java/info/sigterm/deob/Methods.java @@ -37,6 +37,14 @@ public class Methods return m; return null; } + + public Method findMethod(String name) + { + for (Method m : methods) + if (m.getName().equals(name)) + return m; + return null; + } public void buildInstructionGraph() { diff --git a/src/main/java/info/sigterm/deob/attributes/Code.java b/src/main/java/info/sigterm/deob/attributes/Code.java index b3fc346d3f..d6fc7114cc 100644 --- a/src/main/java/info/sigterm/deob/attributes/Code.java +++ b/src/main/java/info/sigterm/deob/attributes/Code.java @@ -31,7 +31,7 @@ public class Code extends Attribute public int getMaxStack() { - return getMaxStack(); + return maxStack; } public int getMaxLocals() diff --git a/src/main/java/info/sigterm/deob/attributes/code/InstructionType.java b/src/main/java/info/sigterm/deob/attributes/code/InstructionType.java index 207a628ae4..7c5be9dc4c 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/InstructionType.java +++ b/src/main/java/info/sigterm/deob/attributes/code/InstructionType.java @@ -174,12 +174,12 @@ public enum InstructionType GOTO(0xa7, "goto", Goto.class), TABLESWITCH(0xaa, "tableswitch", TableSwitch.class), LOOKUPSWITCH(0xab, "lookupswitch", LookupSwitch.class), - IRETURN(0xac, "ireturn", Instruction.class), - LRETURN(0xad, "lreturn", Instruction.class), - FRETURN(0xae, "freturn", Instruction.class), - DRETURN(0xaf, "dreturn", Instruction.class), - ARETURN(0xb0, "areturn", Instruction.class), - RETURN(0xb1, "return", Instruction.class), + IRETURN(0xac, "ireturn", Return.class), + LRETURN(0xad, "lreturn", Return.class), + FRETURN(0xae, "freturn", Return.class), + DRETURN(0xaf, "dreturn", Return.class), + ARETURN(0xb0, "areturn", Return.class), + RETURN(0xb1, "return", VReturn.class), GETSTATIC(0xb2, "getstatic", GetStatic.class), PUTSTATIC(0xb3, "putstatic", PutStatic.class), GETFIELD(0xb4, "getfield", GetField.class), @@ -192,7 +192,7 @@ public enum InstructionType NEWARRAY(0xbc, "newarray", NewArray.class), ANEWARRAY(0xbd, "anewarray", ANewArray.class), ARRAYLENGTH(0xbe, "arraylength", ArrayLength.class), - ATHROW(0xbf, "athrow", Instruction.class), + ATHROW(0xbf, "athrow", AThrow.class), CHECKCAST(0xc0, "checkcast", CheckCast.class), INSTANCEOf(0xc1, "instanceof", InstanceOf.class), MONITORENTER(0xc2, "monitorenter", MonitorEnter.class), diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/AALoad.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/AALoad.java index ba4827782b..7b2546d12c 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/AALoad.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/AALoad.java @@ -22,6 +22,6 @@ public class AALoad extends Instruction int index = (int) stack.pop(); ArrayInstance array = (ArrayInstance) stack.pop(); - stack.push(array.get(index)); + stack.push(this, array.get(index)); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/AConstNull.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/AConstNull.java index 6dd3ad7919..980bafe1b6 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/AConstNull.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/AConstNull.java @@ -19,6 +19,6 @@ public class AConstNull extends Instruction public void execute(Frame frame) { Stack stack = frame.getStack(); - stack.push(null); + stack.push(this, null); } } 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 26837692bd..5e3008ee7d 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 @@ -25,6 +25,6 @@ public class ALoad extends Instruction public void execute(Frame frame) { Object obj = frame.getVariables().get(index); - frame.getStack().push(obj); + frame.getStack().push(this, obj); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/ALoad_0.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/ALoad_0.java index 402281f388..4fc5bbbfd6 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/ALoad_0.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/ALoad_0.java @@ -19,6 +19,6 @@ public class ALoad_0 extends Instruction { Object obj = frame.getVariables().get(0); assert obj != null; - frame.getStack().push(obj); + frame.getStack().push(this, obj); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/ALoad_1.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/ALoad_1.java index 13035d91fa..165aeb76e1 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/ALoad_1.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/ALoad_1.java @@ -18,7 +18,6 @@ public class ALoad_1 extends Instruction public void execute(Frame frame) { Object obj = frame.getVariables().get(1); - assert obj != null; - frame.getStack().push(obj); + frame.getStack().push(this, obj); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/ALoad_2.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/ALoad_2.java index ea78d1df55..8d2847d129 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/ALoad_2.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/ALoad_2.java @@ -18,7 +18,6 @@ public class ALoad_2 extends Instruction public void execute(Frame frame) { Object obj = frame.getVariables().get(2); - assert obj != null; - frame.getStack().push(obj); + frame.getStack().push(this, obj); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/ALoad_3.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/ALoad_3.java index fe87fcef9e..0a6932165d 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/ALoad_3.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/ALoad_3.java @@ -19,6 +19,6 @@ public class ALoad_3 extends Instruction { Object obj = frame.getVariables().get(3); assert obj != null; - frame.getStack().push(obj); + frame.getStack().push(this, obj); } } 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 d87ff05596..535a27b49b 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 @@ -36,13 +36,13 @@ public class ANewArray extends Instruction ClassFile cf = thisClass.getGroup().findClass(clazz.getName()); if (cf == null) { - frame.getStack().push(null); + frame.getStack().push(this, null); return; } ClassInstance type = frame.getPath().getClassInstance(cf); ArrayInstance array = frame.getPath().createArray(type, count); - frame.getStack().push(array); + frame.getStack().push(this, array); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/AStore_1.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/AStore_1.java index f6765778ec..ae0ad6b66e 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/AStore_1.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/AStore_1.java @@ -18,7 +18,6 @@ public class AStore_1 extends Instruction public void execute(Frame frame) { Object obj = frame.getStack().pop(); - assert obj != null; frame.getVariables().set(1, obj); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/AStore_2.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/AStore_2.java index 4af29a6cdd..5fe5ded856 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/AStore_2.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/AStore_2.java @@ -18,7 +18,6 @@ public class AStore_2 extends Instruction public void execute(Frame frame) { Object obj = frame.getStack().pop(); - assert obj != null; frame.getVariables().set(2, obj); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/AThrow.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/AThrow.java new file mode 100644 index 0000000000..729844364f --- /dev/null +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/AThrow.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 info.sigterm.deob.execution.Frame; +import info.sigterm.deob.execution.ObjectInstance; + +import java.io.IOException; + +public class AThrow extends Instruction +{ + public AThrow(Instructions instructions, InstructionType type, int pc) throws IOException + { + super(instructions, type, pc); + } + + @Override + public void execute(Frame e) + { + ObjectInstance exception = (ObjectInstance) e.getStack().pop(); + e.getPath().throwException(exception); + } +} diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/ArrayLength.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/ArrayLength.java index e0f5b41405..6f73a0073c 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/ArrayLength.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/ArrayLength.java @@ -3,6 +3,7 @@ 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 info.sigterm.deob.execution.ArrayInstance; import info.sigterm.deob.execution.Frame; import java.io.IOException; @@ -17,7 +18,7 @@ public class ArrayLength extends Instruction @Override public void execute(Frame frame) { - Object[] array = (Object[]) frame.getStack().pop(); - frame.getStack().push(array.length); + ArrayInstance array = (ArrayInstance) frame.getStack().pop(); + frame.getStack().push(this, array.getLength()); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/BALoad.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/BALoad.java index b490dcdb56..0f93468bb3 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/BALoad.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/BALoad.java @@ -21,6 +21,6 @@ public class BALoad extends Instruction int index = (int) stack.pop(); boolean[] array = (boolean[]) stack.pop(); - stack.push(array[index]); + stack.push(this, array[index]); } } 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 86db5328bc..397c0ccffb 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 @@ -24,6 +24,6 @@ public class BiPush extends Instruction @Override public void execute(Frame frame) { - frame.getStack().push((int) b); + frame.getStack().push(this, (int) b); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/CALoad.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/CALoad.java index d231efc9cb..d1aa988d37 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/CALoad.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/CALoad.java @@ -21,6 +21,6 @@ public class CALoad extends Instruction int index = (int) stack.pop(); char[] array = (char[]) stack.pop(); - stack.push(array[index]); + stack.push(this, array[index]); } } 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 13bd1b281f..80792a9b3a 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 @@ -36,7 +36,7 @@ public class CheckCast extends Instruction ObjectInstance obj = (ObjectInstance) e.getStack().pop(); if (obj == null) { - e.getStack().push(null); + e.getStack().push(this, null); return; } @@ -48,7 +48,7 @@ public class CheckCast extends Instruction // XXX throw } - e.getStack().push(obj); + e.getStack().push(this, obj); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/D2F.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/D2F.java index 98ef2ce1e7..44c5f7b7bf 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/D2F.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/D2F.java @@ -24,6 +24,6 @@ public class D2F extends Instruction assert obj instanceof Double; Double d = (Double) obj; - stack.push(d.floatValue()); + stack.push(this, d.floatValue()); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/D2I.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/D2I.java index 8105a3e0b5..21e83b59b5 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/D2I.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/D2I.java @@ -24,6 +24,6 @@ public class D2I extends Instruction assert obj instanceof Double; Double d = (Double) obj; - stack.push(d.intValue()); + stack.push(this, d.intValue()); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/D2L.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/D2L.java index d0723a88e8..a812b09a2e 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/D2L.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/D2L.java @@ -24,6 +24,6 @@ public class D2L extends Instruction assert obj instanceof Double; Double d = (Double) obj; - stack.push(d.longValue()); + stack.push(this, d.longValue()); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/DALoad.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/DALoad.java index 177ab6d3c9..8a46a15f08 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/DALoad.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/DALoad.java @@ -21,6 +21,6 @@ public class DALoad extends Instruction int index = (int) stack.pop(); double[] array = (double[]) stack.pop(); - stack.push(array[index]); + stack.push(this, array[index]); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/DAdd.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/DAdd.java index fea8061e0c..c4d9b2b8df 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/DAdd.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/DAdd.java @@ -21,6 +21,6 @@ public class DAdd extends Instruction Double two = (Double) stack.pop(); Double one = (Double) stack.pop(); - stack.push(one + two); + stack.push(this, one + two); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/DCmpG.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/DCmpG.java index 89b010eb7d..e41ef4ff31 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/DCmpG.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/DCmpG.java @@ -24,12 +24,12 @@ public class DCmpG extends Instruction Double two = (Double) stack.pop(); if (one.isNaN() || two.isNaN()) - stack.push(1); + stack.push(this, 1); else if (one > two) - stack.push(1); + stack.push(this, 1); else if (one < two) - stack.push(-1); + stack.push(this, -1); else - stack.push(0); + stack.push(this, 0); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/DCmpL.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/DCmpL.java index b4fdbfa74e..7fe8e03929 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/DCmpL.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/DCmpL.java @@ -24,12 +24,12 @@ public class DCmpL extends Instruction Double two = (Double) stack.pop(); if (one.isNaN() || two.isNaN()) - stack.push(-1); + stack.push(this, -1); else if (one > two) - stack.push(1); + stack.push(this, 1); else if (one < two) - stack.push(-1); + stack.push(this, -1); else - stack.push(0); + stack.push(this, 0); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/DConst_0.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/DConst_0.java index 122dbd2836..5a786d38c8 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/DConst_0.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/DConst_0.java @@ -19,6 +19,6 @@ public class DConst_0 extends Instruction public void execute(Frame frame) { Stack stack = frame.getStack(); - stack.push(0d); + stack.push(this, 0d); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/DConst_1.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/DConst_1.java index b06ed70e74..f3400c58d3 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/DConst_1.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/DConst_1.java @@ -19,6 +19,6 @@ public class DConst_1 extends Instruction public void execute(Frame frame) { Stack stack = frame.getStack(); - stack.push(1d); + stack.push(this, 1d); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/DDiv.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/DDiv.java index 7f05ea96e6..9c5bd1aacf 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/DDiv.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/DDiv.java @@ -21,6 +21,6 @@ public class DDiv extends Instruction Double two = (Double) stack.pop(); Double one = (Double) stack.pop(); - stack.push(one / two); + stack.push(this, one / two); } } 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 26ab2181c1..e5caee4e94 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 @@ -25,6 +25,6 @@ public class DLoad extends Instruction public void execute(Frame frame) { double d = (double) frame.getVariables().get(index); - frame.getStack().push(d); + frame.getStack().push(this, d); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/DLoad_0.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/DLoad_0.java index cc6cd27e3e..e04ea1e493 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/DLoad_0.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/DLoad_0.java @@ -19,6 +19,6 @@ public class DLoad_0 extends Instruction { Object obj = frame.getVariables().get(0); assert obj instanceof Double; - frame.getStack().push(obj); + frame.getStack().push(this, obj); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/DLoad_1.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/DLoad_1.java index 97f703532a..61707c595d 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/DLoad_1.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/DLoad_1.java @@ -19,6 +19,6 @@ public class DLoad_1 extends Instruction { Object obj = frame.getVariables().get(1); assert obj instanceof Double; - frame.getStack().push(obj); + frame.getStack().push(this, obj); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/DLoad_2.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/DLoad_2.java index b29a5b6f00..1d6d92dce5 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/DLoad_2.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/DLoad_2.java @@ -19,6 +19,6 @@ public class DLoad_2 extends Instruction { Object obj = frame.getVariables().get(2); assert obj instanceof Double; - frame.getStack().push(obj); + frame.getStack().push(this, obj); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/DLoad_3.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/DLoad_3.java index 250d8bd09b..fea5da2498 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/DLoad_3.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/DLoad_3.java @@ -19,6 +19,6 @@ public class DLoad_3 extends Instruction { Object obj = frame.getVariables().get(3); assert obj instanceof Double; - frame.getStack().push(obj); + frame.getStack().push(this, obj); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/DMul.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/DMul.java index 026681f355..12368bbb1c 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/DMul.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/DMul.java @@ -21,6 +21,6 @@ public class DMul extends Instruction Double two = (Double) stack.pop(); Double one = (Double) stack.pop(); - stack.push(one * two); + stack.push(this, one * two); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/DNeg.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/DNeg.java index 9c84dcfad9..712e127878 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/DNeg.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/DNeg.java @@ -19,6 +19,6 @@ public class DNeg extends Instruction Stack stack = frame.getStack(); Double value = (Double) stack.pop(); - stack.push(-value); + stack.push(this, -value); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/DRem.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/DRem.java index 738ad6e969..215dc088f1 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/DRem.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/DRem.java @@ -21,6 +21,6 @@ public class DRem extends Instruction Double two = (Double) stack.pop(); Double one = (Double) stack.pop(); - stack.push(one % two); + stack.push(this, one % two); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/DSub.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/DSub.java index 0d2f95b1be..491e0b7858 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/DSub.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/DSub.java @@ -21,6 +21,6 @@ public class DSub extends Instruction Double two = (Double) stack.pop(); Double one = (Double) stack.pop(); - stack.push(one - two); + stack.push(this, one - two); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup.java index b5a23fbaf1..499e91df73 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup.java @@ -18,7 +18,7 @@ public class Dup extends Instruction public void execute(Frame frame) { Object obj = frame.getStack().pop(); - frame.getStack().push(obj); - frame.getStack().push(obj); + frame.getStack().push(this, obj); + frame.getStack().push(this, obj); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup2.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup2.java index f43d7d0e05..b81fb5f9b9 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup2.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup2.java @@ -26,11 +26,11 @@ public class Dup2 extends Instruction two = stack.pop(); if (!(one instanceof Double) && !(one instanceof Long)) - stack.push(two); - stack.push(one); + stack.push(this, two); + stack.push(this, one); if (!(one instanceof Double) && !(one instanceof Long)) - stack.push(two); - stack.push(one); + stack.push(this, two); + stack.push(this, one); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup2_X1.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup2_X1.java index 7be328fa28..8aa0ce15c1 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup2_X1.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup2_X1.java @@ -27,13 +27,13 @@ public class Dup2_X1 extends Instruction Object three = stack.pop(); if (!(one instanceof Double) && !(one instanceof Long)) - stack.push(two); - stack.push(one); + stack.push(this, two); + stack.push(this, one); - stack.push(three); + stack.push(this, three); if (!(one instanceof Double) && !(one instanceof Long)) - stack.push(two); - stack.push(one); + stack.push(this, two); + stack.push(this, one); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup2_X2.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup2_X2.java index bc8ecf3dd7..68f99b608b 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup2_X2.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup2_X2.java @@ -30,15 +30,15 @@ public class Dup2_X2 extends Instruction four = stack.pop(); if (!(one instanceof Double) && !(one instanceof Long)) - stack.push(two); - stack.push(one); + stack.push(this, two); + stack.push(this, one); if (!(three instanceof Double) && !(three instanceof Long)) - stack.push(four); - stack.push(three); + stack.push(this, four); + stack.push(this, three); if (!(one instanceof Double) && !(one instanceof Long)) - stack.push(two); - stack.push(one); + stack.push(this, two); + stack.push(this, one); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup_X1.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup_X1.java index 9169bddcdd..19f44834f8 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup_X1.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup_X1.java @@ -23,8 +23,8 @@ public class Dup_X1 extends Instruction Object one = stack.pop(); Object two = stack.pop(); - stack.push(one); - stack.push(two); - stack.push(one); + stack.push(this, one); + stack.push(this, two); + stack.push(this, one); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup_X2.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup_X2.java index f67fbbe9f9..4a8b89b136 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup_X2.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/Dup_X2.java @@ -26,10 +26,10 @@ public class Dup_X2 extends Instruction if (!(two instanceof Double) && !(two instanceof Long)) three = stack.pop(); - stack.push(one); + stack.push(this, one); if (!(two instanceof Double) && !(two instanceof Long)) - stack.push(three); - stack.push(two); - stack.push(one); + stack.push(this, three); + stack.push(this, two); + stack.push(this, one); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/F2D.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/F2D.java index b7a7d8fff4..70db4e93a7 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/F2D.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/F2D.java @@ -24,6 +24,6 @@ public class F2D extends Instruction assert obj instanceof Float; Float f = (Float) obj; - stack.push(f.doubleValue()); + stack.push(this, f.doubleValue()); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/F2I.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/F2I.java index 069a470052..2c72a1e15f 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/F2I.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/F2I.java @@ -24,6 +24,6 @@ public class F2I extends Instruction assert obj instanceof Float; Float f = (Float) obj; - stack.push(f.intValue()); + stack.push(this, f.intValue()); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/F2L.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/F2L.java index 6364163821..b2b02450dd 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/F2L.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/F2L.java @@ -24,6 +24,6 @@ public class F2L extends Instruction assert obj instanceof Float; Float f = (Float) obj; - stack.push(f.longValue()); + stack.push(this, f.longValue()); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FALoad.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FALoad.java index 2577eec574..8e6d875052 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FALoad.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FALoad.java @@ -21,6 +21,6 @@ public class FALoad extends Instruction int index = (int) stack.pop(); float[] array = (float[]) stack.pop(); - stack.push(array[index]); + stack.push(this, array[index]); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FAdd.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FAdd.java index 40b3141f48..385b9007ea 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FAdd.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FAdd.java @@ -21,6 +21,6 @@ public class FAdd extends Instruction Float one = (Float) stack.pop(); Float two = (Float) stack.pop(); - stack.push(one + two); + stack.push(this, one + two); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FCmpG.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FCmpG.java index 1080ba29c8..8c5671633f 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FCmpG.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FCmpG.java @@ -24,12 +24,12 @@ public class FCmpG extends Instruction Float two = (Float) stack.pop(); if (one.isNaN() || two.isNaN()) - stack.push(1); + stack.push(this, 1); else if (one > two) - stack.push(1); + stack.push(this, 1); else if (one < two) - stack.push(-1); + stack.push(this, -1); else - stack.push(0); + stack.push(this, 0); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FCmpL.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FCmpL.java index d01ec62a15..8d3f90c067 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FCmpL.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FCmpL.java @@ -24,12 +24,12 @@ public class FCmpL extends Instruction Float two = (Float) stack.pop(); if (one.isNaN() || two.isNaN()) - stack.push(-1); + stack.push(this, -1); else if (one > two) - stack.push(1); + stack.push(this, 1); else if (one < two) - stack.push(-1); + stack.push(this, -1); else - stack.push(0); + stack.push(this, 0); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FConst_0.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FConst_0.java index eac08c898c..00f00a7b19 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FConst_0.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FConst_0.java @@ -19,6 +19,6 @@ public class FConst_0 extends Instruction public void execute(Frame frame) { Stack stack = frame.getStack(); - stack.push(0f); + stack.push(this, 0f); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FConst_1.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FConst_1.java index cd6b70416f..0d31ca5b47 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FConst_1.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FConst_1.java @@ -19,6 +19,6 @@ public class FConst_1 extends Instruction public void execute(Frame frame) { Stack stack = frame.getStack(); - stack.push(1f); + stack.push(this, 1f); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FConst_2.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FConst_2.java index fbf1a4429e..b291d1e65c 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FConst_2.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FConst_2.java @@ -19,6 +19,6 @@ public class FConst_2 extends Instruction public void execute(Frame frame) { Stack stack = frame.getStack(); - stack.push(2f); + stack.push(this, 2f); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FDiv.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FDiv.java index 9b306c9ebb..04bfe5cba7 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FDiv.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FDiv.java @@ -21,6 +21,6 @@ public class FDiv extends Instruction Float two = (Float) stack.pop(); Float one = (Float) stack.pop(); - stack.push(one / two); + stack.push(this, one / two); } } 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 ad367bb3fd..cc387cf557 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 @@ -25,6 +25,6 @@ public class FLoad extends Instruction public void execute(Frame frame) { float f = (float) frame.getVariables().get(index); - frame.getStack().push(f); + frame.getStack().push(this, f); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FLoad_0.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FLoad_0.java index 4b527864df..f18ce0caaf 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FLoad_0.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FLoad_0.java @@ -19,6 +19,6 @@ public class FLoad_0 extends Instruction { Object obj = frame.getVariables().get(0); assert obj instanceof Float; - frame.getStack().push(obj); + frame.getStack().push(this, obj); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FLoad_1.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FLoad_1.java index 522a664b3e..ec7948ac72 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FLoad_1.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FLoad_1.java @@ -19,6 +19,6 @@ public class FLoad_1 extends Instruction { Object obj = frame.getVariables().get(1); assert obj instanceof Float; - frame.getStack().push(obj); + frame.getStack().push(this, obj); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FLoad_2.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FLoad_2.java index bd2488fb15..10c82978fa 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FLoad_2.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FLoad_2.java @@ -19,6 +19,6 @@ public class FLoad_2 extends Instruction { Object obj = frame.getVariables().get(2); assert obj instanceof Float; - frame.getStack().push(obj); + frame.getStack().push(this, obj); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FLoad_3.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FLoad_3.java index 7f790f2bad..667bf80f48 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FLoad_3.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FLoad_3.java @@ -19,6 +19,6 @@ public class FLoad_3 extends Instruction { Object obj = frame.getVariables().get(3); assert obj instanceof Float; - frame.getStack().push(obj); + frame.getStack().push(this, obj); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FMul.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FMul.java index 7e866eddd5..3a517325a0 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FMul.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FMul.java @@ -21,6 +21,6 @@ public class FMul extends Instruction Float two = (Float) stack.pop(); Float one = (Float) stack.pop(); - stack.push(one * two); + stack.push(this, one * two); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FNeg.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FNeg.java index f27e248bdf..a219631f17 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FNeg.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FNeg.java @@ -19,6 +19,6 @@ public class FNeg extends Instruction Stack stack = frame.getStack(); Float value = (Float) stack.pop(); - stack.push(-value); + stack.push(this, -value); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FRem.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FRem.java index 30b7150a2a..4cbf30d7ee 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FRem.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FRem.java @@ -21,6 +21,6 @@ public class FRem extends Instruction Float two = (Float) stack.pop(); Float one = (Float) stack.pop(); - stack.push(one % two); + stack.push(this, one % two); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/FSub.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/FSub.java index 1904b97327..c0147e004a 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/FSub.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/FSub.java @@ -21,6 +21,6 @@ public class FSub extends Instruction Float two = (Float) stack.pop(); Float one = (Float) stack.pop(); - stack.push(one - two); + stack.push(this, one - two); } } 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 28db1e9f7d..9db12acd18 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 @@ -39,7 +39,13 @@ public class GetField extends Instruction NameAndType nat = entry.getNameAndType(); + if (object == null) + { + frame.getStack().push(this, null); + return; + } + FieldInstance field = object.getField(nat); - frame.getStack().push(field.getValue()); + frame.getStack().push(this, field.getValue()); } } 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 be60145718..1f509db38d 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 @@ -43,7 +43,7 @@ public class GetStatic extends Instruction if (cf == null) { Object ovalue = nat.getStackObject(); - frame.getStack().push(ovalue); + frame.getStack().push(this, ovalue); return; } @@ -51,7 +51,7 @@ public class GetStatic extends Instruction StaticFieldInstance fi = ci.findStaticField(nat); Object ovalue = fi.getValue(); - frame.getStack().push(ovalue); + frame.getStack().push(this, ovalue); } @Override diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/I2B.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/I2B.java index 894e846c95..75d59d7d96 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/I2B.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/I2B.java @@ -24,6 +24,6 @@ public class I2B extends Instruction assert obj instanceof Integer; Integer i = (Integer) obj; - stack.push(i.byteValue()); + stack.push(this, i.byteValue()); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/I2C.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/I2C.java index 1ae57856f4..a404730501 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/I2C.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/I2C.java @@ -24,6 +24,6 @@ public class I2C extends Instruction assert obj instanceof Integer; Integer i = (Integer) obj; - stack.push((char) i.intValue()); + stack.push(this, (char) i.intValue()); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/I2D.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/I2D.java index 080d350675..eac4d08899 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/I2D.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/I2D.java @@ -24,6 +24,6 @@ public class I2D extends Instruction assert obj instanceof Integer; Integer i = (Integer) obj; - stack.push(i.doubleValue()); + stack.push(this, i.doubleValue()); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/I2F.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/I2F.java index c39e13d59e..b6f6aef43d 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/I2F.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/I2F.java @@ -24,6 +24,6 @@ public class I2F extends Instruction assert obj instanceof Integer; Integer i = (Integer) obj; - stack.push(i.floatValue()); + stack.push(this, i.floatValue()); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/I2L.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/I2L.java index df2d1b3707..13d6e0dce6 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/I2L.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/I2L.java @@ -24,6 +24,6 @@ public class I2L extends Instruction assert obj instanceof Integer; Integer i = (Integer) obj; - stack.push(i.longValue()); + stack.push(this, i.longValue()); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/I2S.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/I2S.java index f256a86b1a..cc9ac80c41 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/I2S.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/I2S.java @@ -24,6 +24,6 @@ public class I2S extends Instruction assert obj instanceof Integer; Integer i = (Integer) obj; - stack.push(i.shortValue()); + stack.push(this, i.shortValue()); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IALoad.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IALoad.java index c6634a8035..bdba713969 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IALoad.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IALoad.java @@ -21,6 +21,6 @@ public class IALoad extends Instruction int index = (int) stack.pop(); int[] array = (int[]) stack.pop(); - stack.push(array[index]); + stack.push(this, array[index]); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IAdd.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IAdd.java index 69f1327626..8d82fc389e 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IAdd.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IAdd.java @@ -21,6 +21,6 @@ public class IAdd extends Instruction Integer two = (Integer) stack.pop(); Integer one = (Integer) stack.pop(); - stack.push(one + two); + stack.push(this, one + two); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IAnd.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IAnd.java index a4b64fb29f..bdaef725b4 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IAnd.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IAnd.java @@ -20,6 +20,6 @@ public class IAnd extends Instruction Integer two = (Integer) stack.pop(); Integer one = (Integer) stack.pop(); - stack.push(one & two); + stack.push(this, one & two); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_0.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_0.java index c4b45af100..f690dee01d 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_0.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_0.java @@ -19,6 +19,6 @@ public class IConst_0 extends Instruction public void execute(Frame frame) { Stack stack = frame.getStack(); - stack.push(0); + stack.push(this, 0); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_1.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_1.java index 2730c61aff..0eb5ae94d8 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_1.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_1.java @@ -19,6 +19,6 @@ public class IConst_1 extends Instruction public void execute(Frame frame) { Stack stack = frame.getStack(); - stack.push(1); + stack.push(this, 1); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_2.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_2.java index 2f7a917784..6747f44871 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_2.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_2.java @@ -19,6 +19,6 @@ public class IConst_2 extends Instruction public void execute(Frame frame) { Stack stack = frame.getStack(); - stack.push(2); + stack.push(this, 2); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_3.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_3.java index 138a0546c5..221e0157b7 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_3.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_3.java @@ -19,6 +19,6 @@ public class IConst_3 extends Instruction public void execute(Frame frame) { Stack stack = frame.getStack(); - stack.push(3); + stack.push(this, 3); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_4.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_4.java index 005e3e5429..6a633f3df5 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_4.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_4.java @@ -19,6 +19,6 @@ public class IConst_4 extends Instruction public void execute(Frame frame) { Stack stack = frame.getStack(); - stack.push(4); + stack.push(this, 4); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_5.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_5.java index 606e46afca..df593db939 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_5.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_5.java @@ -19,6 +19,6 @@ public class IConst_5 extends Instruction public void execute(Frame frame) { Stack stack = frame.getStack(); - stack.push(5); + stack.push(this, 5); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_M1.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_M1.java index 2a1b6fcd90..4d9726624f 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_M1.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IConst_M1.java @@ -19,6 +19,6 @@ public class IConst_M1 extends Instruction public void execute(Frame frame) { Stack stack = frame.getStack(); - stack.push(-1); + stack.push(this, -1); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IDiv.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IDiv.java index c33bebdc44..0db9872cb6 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IDiv.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IDiv.java @@ -21,6 +21,6 @@ public class IDiv extends Instruction Double two = (Double) stack.pop(); Double one = (Double) stack.pop(); - stack.push(one / two); + stack.push(this, one / two); } } 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 c445e458cc..5944ff6c6c 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 @@ -25,6 +25,6 @@ public class ILoad extends Instruction public void execute(Frame frame) { int i = (int) frame.getVariables().get(index); - frame.getStack().push(i); + frame.getStack().push(this, i); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/ILoad_0.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/ILoad_0.java index 1d807a9bfd..2c5b4f912d 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/ILoad_0.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/ILoad_0.java @@ -19,6 +19,6 @@ public class ILoad_0 extends Instruction { Object obj = frame.getVariables().get(0); assert obj instanceof Integer; - frame.getStack().push(obj); + frame.getStack().push(this, obj); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/ILoad_1.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/ILoad_1.java index ae2db8ef51..63d1096ee0 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/ILoad_1.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/ILoad_1.java @@ -19,6 +19,6 @@ public class ILoad_1 extends Instruction { Object obj = frame.getVariables().get(1); assert obj instanceof Integer; - frame.getStack().push(obj); + frame.getStack().push(this, obj); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/ILoad_2.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/ILoad_2.java index e2b75cc980..51dfdd7122 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/ILoad_2.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/ILoad_2.java @@ -19,6 +19,6 @@ public class ILoad_2 extends Instruction { Object obj = frame.getVariables().get(2); assert obj instanceof Integer; - frame.getStack().push(obj); + frame.getStack().push(this, obj); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/ILoad_3.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/ILoad_3.java index 24f761ce8b..a5188f3e07 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/ILoad_3.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/ILoad_3.java @@ -19,6 +19,6 @@ public class ILoad_3 extends Instruction { Object obj = frame.getVariables().get(3); assert obj instanceof Integer; - frame.getStack().push(obj); + frame.getStack().push(this, obj); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IMul.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IMul.java index 2f3730fdc9..c641f32063 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IMul.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IMul.java @@ -21,6 +21,6 @@ public class IMul extends Instruction Integer two = (Integer) stack.pop(); Integer one = (Integer) stack.pop(); - stack.push(one * two); + stack.push(this, one * two); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/INeg.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/INeg.java index 4d8c6e9b2d..073b30cf91 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/INeg.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/INeg.java @@ -19,6 +19,6 @@ public class INeg extends Instruction Stack stack = frame.getStack(); Integer value = (Integer) stack.pop(); - stack.push(-value); + stack.push(this, -value); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IOr.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IOr.java index aa0540c533..63313c2ea9 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IOr.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IOr.java @@ -20,6 +20,6 @@ public class IOr extends Instruction Integer two = (Integer) stack.pop(); Integer one = (Integer) stack.pop(); - stack.push(one | two); + stack.push(this, one | two); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IRem.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IRem.java index 60ab180998..0f2e970e16 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IRem.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IRem.java @@ -21,6 +21,6 @@ public class IRem extends Instruction Integer two = (Integer) stack.pop(); Integer one = (Integer) stack.pop(); - stack.push(one % two); + stack.push(this, one % two); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IShL.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IShL.java index c07811af45..ff6ae96e68 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IShL.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IShL.java @@ -20,6 +20,6 @@ public class IShL extends Instruction Integer two = (Integer) stack.pop(); Integer one = (Integer) stack.pop(); - stack.push(one << (two & 0x1F)); + stack.push(this, one << (two & 0x1F)); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IShR.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IShR.java index 626047214a..7671e2563c 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IShR.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IShR.java @@ -20,6 +20,6 @@ public class IShR extends Instruction Integer two = (Integer) stack.pop(); Integer one = (Integer) stack.pop(); - stack.push(one >> (two & 0x1F)); + stack.push(this, one >> (two & 0x1F)); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/ISub.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/ISub.java index 1f6166c7dd..b9b2feb6ed 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/ISub.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/ISub.java @@ -21,6 +21,6 @@ public class ISub extends Instruction Integer two = (Integer) stack.pop(); Integer one = (Integer) stack.pop(); - stack.push(one - two); + stack.push(this, one - two); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IUShR.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IUShR.java index 5f12ab9351..4988219352 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IUShR.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IUShR.java @@ -20,6 +20,6 @@ public class IUShR extends Instruction Integer two = (Integer) stack.pop(); Integer one = (Integer) stack.pop(); - stack.push(one >>> (two & 0x1F)); + stack.push(this, one >>> (two & 0x1F)); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/IXor.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/IXor.java index bba109e45b..e29e7553cb 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/IXor.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/IXor.java @@ -20,6 +20,6 @@ public class IXor extends Instruction Integer two = (Integer) stack.pop(); Integer one = (Integer) stack.pop(); - stack.push(one ^ two); + stack.push(this, one ^ two); } } 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 e087f34ce3..39f8d3aed1 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 @@ -36,13 +36,13 @@ public class InstanceOf extends Instruction ObjectInstanceBase obj = (ObjectInstanceBase) e.getStack().pop(); if (obj == null) { - e.getStack().push(0); + e.getStack().push(this, 0); return; } ClassFile otherClass = thisClass.getGroup().findClass(clazz.getName()); boolean instanceOf = obj.getType().getClassFile().instanceOf(otherClass); - e.getStack().push(instanceOf ? 1 : 0); + e.getStack().push(this, instanceOf ? 1 : 0); } } 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 a3c8a3e873..e03e4e012f 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 @@ -1,8 +1,14 @@ package info.sigterm.deob.attributes.code.instructions; +import info.sigterm.deob.ClassFile; +import info.sigterm.deob.ConstantPool; import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; +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 java.io.DataInputStream; import java.io.IOException; @@ -20,4 +26,25 @@ public class InvokeSpecial extends Instruction length += 2; } + @Override + public void execute(Frame e) + { + ClassFile thisClass = this.getInstructions().getCode().getAttributes().getClassFile(); + + ConstantPool pool = thisClass.getPool(); + Method method = (Method) pool.getEntry(index); + int count = method.getNameAndType().getNumberOfArgs(); + + ObjectInstance object = (ObjectInstance) e.getStack().pop(); + ClassInstance objectType = object.getType(); + + Object[] args = new Object[count + 1]; + args[0] = object; + for (int i = 1; i < count + 1; ++i) + args[i] = e.getStack().pop(); + + info.sigterm.deob.Method meth = objectType.getClassFile().findMethod(method.getNameAndType()); + e.getPath().invoke(meth, args); + } + } 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 231bfd51a0..9c4826f120 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 @@ -1,8 +1,12 @@ package info.sigterm.deob.attributes.code.instructions; +import info.sigterm.deob.ClassFile; +import info.sigterm.deob.ConstantPool; import info.sigterm.deob.attributes.code.Instruction; 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 java.io.DataInputStream; import java.io.IOException; @@ -19,4 +23,24 @@ public class InvokeStatic extends Instruction index = is.readUnsignedShort(); length += 2; } + + @Override + public void execute(Frame e) + { + 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(); + + ClassFile otherClass = thisClass.getGroup().findClass(clazz.getName()); + int count = method.getNameAndType().getNumberOfArgs(); + + Object[] args = new Object[count]; + for (int i = count - 1; i >= 0; --i) + args[i] = e.getStack().pop(); + + info.sigterm.deob.Method meth = otherClass.findMethod(method.getNameAndType()); + e.getPath().invoke(meth, args); + } } 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 d7be48945c..7ae4248dc8 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 @@ -1,8 +1,14 @@ package info.sigterm.deob.attributes.code.instructions; +import info.sigterm.deob.ClassFile; +import info.sigterm.deob.ConstantPool; import info.sigterm.deob.attributes.code.Instruction; import info.sigterm.deob.attributes.code.InstructionType; import info.sigterm.deob.attributes.code.Instructions; +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 java.io.DataInputStream; import java.io.IOException; @@ -20,4 +26,40 @@ public class InvokeVirtual extends Instruction length += 2; } + @Override + public void execute(Frame e) + { + ClassFile thisClass = this.getInstructions().getCode().getAttributes().getClassFile(); + + ConstantPool pool = thisClass.getPool(); + Method method = (Method) pool.getEntry(index); + int count = method.getNameAndType().getNumberOfArgs(); + + Object[] args = new Object[count + 1]; + for (int i = count; i > 0; --i) + args[i] = e.getStack().pop(); + + ObjectInstance object = (ObjectInstance) e.getStack().pop(); + if (object == null) + { + System.out.println("Invoke on a null object"); + e.getStack().push(this, null); + return; + } + + ClassInstance objectType = object.getType(); + + args[0] = object; + + info.sigterm.deob.Method meth = objectType.getClassFile().findMethod(method.getNameAndType()); + if (meth == null) + { + System.out.println("Unknown method " + method.getNameAndType().getName() + " " + method.getNameAndType().getDescriptor() + " in " + objectType.getClassFile().getName()); + e.getStack().push(this, null); + //meth.getDescriptor() + return; + } + e.getPath().invoke(meth, args); + } + } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/L2D.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/L2D.java index 1229e49368..5af98b43f6 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/L2D.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/L2D.java @@ -24,6 +24,6 @@ public class L2D extends Instruction assert obj instanceof Long; Long l = (Long) obj; - stack.push(l.doubleValue()); + stack.push(this, l.doubleValue()); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/L2F.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/L2F.java index 42a9f56a88..a4f6fa7944 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/L2F.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/L2F.java @@ -24,6 +24,6 @@ public class L2F extends Instruction assert obj instanceof Long; Long l = (Long) obj; - stack.push(l.floatValue()); + stack.push(this, l.floatValue()); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/L2I.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/L2I.java index d411599bb8..7b8d55c42c 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/L2I.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/L2I.java @@ -24,6 +24,6 @@ public class L2I extends Instruction assert obj instanceof Long; Long l = (Long) obj; - stack.push(l.intValue()); + stack.push(this, l.intValue()); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LALoad.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LALoad.java index 6f134fdb80..eb0d000878 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LALoad.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LALoad.java @@ -21,6 +21,6 @@ public class LALoad extends Instruction int index = (int) stack.pop(); long[] array = (long[]) stack.pop(); - stack.push(array[index]); + stack.push(this, array[index]); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LAdd.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LAdd.java index f6ccf13b69..1953f5fadd 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LAdd.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LAdd.java @@ -21,6 +21,6 @@ public class LAdd extends Instruction Long two = (Long) stack.pop(); Long one = (Long) stack.pop(); - stack.push(one + two); + stack.push(this, one + two); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LAnd.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LAnd.java index aa95a148a1..48f0cc6f13 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LAnd.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LAnd.java @@ -20,6 +20,6 @@ public class LAnd extends Instruction Long two = (Long) stack.pop(); Long one = (Long) stack.pop(); - stack.push(one & two); + stack.push(this, one & two); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LCmp.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LCmp.java index 07f36519ee..a751bde523 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LCmp.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LCmp.java @@ -24,10 +24,10 @@ public class LCmp extends Instruction Long two = (Long) stack.pop(); if (one > two) - stack.push(1); + stack.push(this, 1); else if (one < two) - stack.push(-1); + stack.push(this, -1); else - stack.push(0); + stack.push(this, 0); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LConst_0.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LConst_0.java index 6c5f92a80c..e1e7d71fff 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LConst_0.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LConst_0.java @@ -19,6 +19,6 @@ public class LConst_0 extends Instruction public void execute(Frame frame) { Stack stack = frame.getStack(); - stack.push(0L); + stack.push(this, 0L); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LConst_1.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LConst_1.java index c7da5fa845..e40bdd7cfb 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LConst_1.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LConst_1.java @@ -19,6 +19,6 @@ public class LConst_1 extends Instruction public void execute(Frame frame) { Stack stack = frame.getStack(); - stack.push(1L); + stack.push(this, 1L); } } 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 bbac3784c0..66d14fc44a 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 @@ -28,6 +28,6 @@ public class LDC extends Instruction { ClassFile thisClass = this.getInstructions().getCode().getAttributes().getClassFile(); PoolEntry entry = thisClass.getPool().getEntry(index); - frame.getStack().push(entry.getObject()); + frame.getStack().push(this, entry.getObject()); } } 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 1ef01bb9d1..7b02c2c0ba 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 @@ -28,6 +28,6 @@ public class LDC2_W extends Instruction { ClassFile thisClass = this.getInstructions().getCode().getAttributes().getClassFile(); PoolEntry entry = thisClass.getPool().getEntry(index); - frame.getStack().push(entry.getObject()); + frame.getStack().push(this, entry.getObject()); } } 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 ea8314425a..3d31f863d4 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 @@ -28,6 +28,6 @@ public class LDC_W extends Instruction { ClassFile thisClass = this.getInstructions().getCode().getAttributes().getClassFile(); PoolEntry entry = thisClass.getPool().getEntry(index); - frame.getStack().push(entry.getObject()); + frame.getStack().push(this, entry.getObject()); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LDiv.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LDiv.java index 09ea46109f..c462a0dfd6 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LDiv.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LDiv.java @@ -21,6 +21,6 @@ public class LDiv extends Instruction Long two = (Long) stack.pop(); Long one = (Long) stack.pop(); - stack.push(one / two); + stack.push(this, one / two); } } 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 6e27895b29..a8e47fa233 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 @@ -25,6 +25,6 @@ public class LLoad extends Instruction public void execute(Frame frame) { long l = (long) frame.getVariables().get(index); - frame.getStack().push(l); + frame.getStack().push(this, l); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LLoad_0.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LLoad_0.java index 36dd7eabfd..d77f4095c7 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LLoad_0.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LLoad_0.java @@ -19,6 +19,6 @@ public class LLoad_0 extends Instruction { Object obj = frame.getVariables().get(1); assert obj instanceof Long; - frame.getStack().push(obj); + frame.getStack().push(this, obj); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LLoad_1.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LLoad_1.java index 32f566ddb5..91fff05793 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LLoad_1.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LLoad_1.java @@ -19,6 +19,6 @@ public class LLoad_1 extends Instruction { Object obj = frame.getVariables().get(1); assert obj instanceof Long; - frame.getStack().push(obj); + frame.getStack().push(this, obj); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LLoad_2.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LLoad_2.java index f98a7762b4..c1429cdeb8 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LLoad_2.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LLoad_2.java @@ -19,6 +19,6 @@ public class LLoad_2 extends Instruction { Object obj = frame.getVariables().get(2); assert obj instanceof Long; - frame.getStack().push(obj); + frame.getStack().push(this, obj); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LLoad_3.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LLoad_3.java index 2c9bb6f8b3..ff1b5373f1 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LLoad_3.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LLoad_3.java @@ -19,6 +19,6 @@ public class LLoad_3 extends Instruction { Object obj = frame.getVariables().get(3); assert obj instanceof Long; - frame.getStack().push(obj); + frame.getStack().push(this, obj); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LMul.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LMul.java index a90ada0e9e..dcc9415857 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LMul.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LMul.java @@ -21,6 +21,6 @@ public class LMul extends Instruction Long two = (Long) stack.pop(); Long one = (Long) stack.pop(); - stack.push(one * two); + stack.push(this, one * two); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LNeg.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LNeg.java index 28621f594a..aad3cf2b8e 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LNeg.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LNeg.java @@ -19,6 +19,6 @@ public class LNeg extends Instruction Stack stack = frame.getStack(); Long value = (Long) stack.pop(); - stack.push(-value); + stack.push(this, -value); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LOr.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LOr.java index dbb1520ea3..53c53235eb 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LOr.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LOr.java @@ -20,6 +20,6 @@ public class LOr extends Instruction Long two = (Long) stack.pop(); Long one = (Long) stack.pop(); - stack.push(one | two); + stack.push(this, one | two); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LRem.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LRem.java index f4a129d3c9..ea0f5e3c23 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LRem.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LRem.java @@ -21,6 +21,6 @@ public class LRem extends Instruction Long two = (Long) stack.pop(); Long one = (Long) stack.pop(); - stack.push(one % two); + stack.push(this, one % two); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LShL.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LShL.java index cf7c8e4f79..9b31b44598 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LShL.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LShL.java @@ -20,6 +20,6 @@ public class LShL extends Instruction Long two = (Long) stack.pop(); Long one = (Long) stack.pop(); - stack.push(one << (two & 0x3F)); + stack.push(this, one << (two & 0x3F)); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LShR.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LShR.java index 8bfdf0bcdf..0aa6d76599 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LShR.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LShR.java @@ -20,6 +20,6 @@ public class LShR extends Instruction Long two = (Long) stack.pop(); Long one = (Long) stack.pop(); - stack.push(one >> (two & 0x3F)); + stack.push(this, one >> (two & 0x3F)); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LSub.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LSub.java index 67a335ac95..b57f4c7863 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LSub.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LSub.java @@ -21,6 +21,6 @@ public class LSub extends Instruction Long two = (Long) stack.pop(); Long one = (Long) stack.pop(); - stack.push(one - two); + stack.push(this, one - two); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LUShR.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LUShR.java index 646ab8da87..53c3022864 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LUShR.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LUShR.java @@ -20,6 +20,6 @@ public class LUShR extends Instruction Long two = (Long) stack.pop(); Long one = (Long) stack.pop(); - stack.push(one >>> (two & 0x3F)); + stack.push(this, one >>> (two & 0x3F)); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/LXor.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LXor.java index 63378d2af1..d14eb42f22 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/LXor.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/LXor.java @@ -20,6 +20,6 @@ public class LXor extends Instruction Long two = (Long) stack.pop(); Long one = (Long) stack.pop(); - stack.push(one ^ two); + stack.push(this, one ^ two); } } 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 1847e06d5c..7cb5867c15 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 @@ -3,6 +3,7 @@ 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 info.sigterm.deob.execution.Frame; import java.io.DataInputStream; import java.io.IOException; @@ -10,6 +11,7 @@ import java.io.IOException; public class LookupSwitch extends Instruction { private int def; + private int count; private int[] match; private int[] branch; @@ -25,7 +27,7 @@ public class LookupSwitch extends Instruction def = is.readInt(); - int count = is.readInt(); + count = is.readInt(); match = new int[count]; branch = new int[count]; @@ -45,4 +47,19 @@ public class LookupSwitch extends Instruction this.addJump(i); this.addJump(def); } + + @Override + public void execute(Frame e) + { + int key = (int) e.getStack().pop(); + + for (int i = 0; i < count; ++i) + if (match[i] == key) + { + e.jump(branch[i]); + return; + } + + e.jump(def); + } } 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 0e0d5c9b6d..2224119416 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 @@ -33,12 +33,12 @@ public class New extends Instruction ClassFile cf = thisClass.getGroup().findClass(clazz.getName()); if (cf == null) { - e.getStack().push(null); + e.getStack().push(this, null); return; } ClassInstance type = e.getPath().getClassInstance(cf); ObjectInstance obj = e.getPath().createObject(type); - e.getStack().push(obj); + e.getStack().push(this, obj); } } 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 1f37e672d3..64f5215320 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 @@ -29,28 +29,28 @@ public class NewArray extends Instruction switch (type) { case 4: - e.getStack().push(new boolean[count]); + e.getStack().push(this, new boolean[count]); break; case 5: - e.getStack().push(new char[count]); + e.getStack().push(this, new char[count]); break; case 6: - e.getStack().push(new float[count]); + e.getStack().push(this, new float[count]); break; case 7: - e.getStack().push(new double[count]); + e.getStack().push(this, new double[count]); break; case 8: - e.getStack().push(new byte[count]); + e.getStack().push(this, new byte[count]); break; case 9: - e.getStack().push(new short[count]); + e.getStack().push(this, new short[count]); break; case 10: - e.getStack().push(new int[count]); + e.getStack().push(this, new int[count]); break; case 11: - e.getStack().push(new long[count]); + e.getStack().push(this, new long[count]); break; } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/Return.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/Return.java new file mode 100644 index 0000000000..4163b87d7b --- /dev/null +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/Return.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 info.sigterm.deob.execution.Frame; + +import java.io.IOException; + +public class Return extends Instruction +{ + public Return(Instructions instructions, InstructionType type, int pc) throws IOException + { + super(instructions, type, pc); + } + + @Override + public void execute(Frame e) + { + // XXX exceptions? + Object ret = e.getStack().pop(); + e.getPath().returnFrame(this, ret); + } +} diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/SALoad.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/SALoad.java index 2ff5d980b9..97ec3b6929 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/SALoad.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/SALoad.java @@ -21,6 +21,6 @@ public class SALoad extends Instruction int index = (int) stack.pop(); short[] array = (short[]) stack.pop(); - stack.push(array[index]); + stack.push(this, array[index]); } } 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 1a0adfdb2c..1d33ce6d12 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 @@ -24,6 +24,6 @@ public class SiPush extends Instruction @Override public void execute(Frame frame) { - frame.getStack().push(s); + frame.getStack().push(this, s); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/Swap.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/Swap.java index 7c7cf17f96..600e507c7e 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/Swap.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/Swap.java @@ -21,7 +21,7 @@ public class Swap extends Instruction Object one = stack.pop(); Object two = stack.pop(); - stack.push(one); - stack.push(two); + stack.push(this, one); + stack.push(this, two); } } 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 d85be78b3a..857a3ac1dc 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 @@ -3,6 +3,7 @@ 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 info.sigterm.deob.execution.Frame; import java.io.DataInputStream; import java.io.IOException; @@ -10,6 +11,8 @@ import java.io.IOException; public class TableSwitch extends Instruction { private int def; + private int low; + private int high; private int[] jumps; public TableSwitch(Instructions instructions, InstructionType type, int pc) throws IOException @@ -23,9 +26,8 @@ public class TableSwitch extends Instruction if (tableSkip > 0) is.skip(tableSkip); def = is.readInt(); - - int low = is.readInt(); - int high = is.readInt(); + low = is.readInt(); + high = is.readInt(); int count = high - low + 1; jumps = new int[count]; @@ -43,4 +45,15 @@ public class TableSwitch extends Instruction this.addJump(i); this.addJump(def); } + + @Override + public void execute(Frame e) + { + int index = (int) e.getStack().pop(); + + if (index < low || index > high) + e.jump(def); + else + e.jump(jumps[index - low]); + } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/VReturn.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/VReturn.java new file mode 100644 index 0000000000..6ad23d4b53 --- /dev/null +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/VReturn.java @@ -0,0 +1,23 @@ +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 info.sigterm.deob.execution.Frame; + +import java.io.IOException; + +public class VReturn extends Instruction +{ + public VReturn(Instructions instructions, InstructionType type, int pc) throws IOException + { + super(instructions, type, pc); + } + + @Override + public void execute(Frame e) + { + // XXX exceptions? + e.getPath().returnFrame(); + } +} 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 cfc4a95e38..2822f09713 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 @@ -3,6 +3,7 @@ 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 info.sigterm.deob.execution.Frame; import java.io.DataInputStream; import java.io.IOException; @@ -33,4 +34,10 @@ public class Wide extends Instruction } } + @Override + public void execute(Frame e) + { + throw new UnsupportedOperationException("wide not supported"); + } + } diff --git a/src/main/java/info/sigterm/deob/execution/ArrayInstance.java b/src/main/java/info/sigterm/deob/execution/ArrayInstance.java index 3b052ed496..4e0976b318 100644 --- a/src/main/java/info/sigterm/deob/execution/ArrayInstance.java +++ b/src/main/java/info/sigterm/deob/execution/ArrayInstance.java @@ -20,4 +20,9 @@ public class ArrayInstance extends ObjectInstanceBase { return array[idx]; } + + public int getLength() + { + return array.length; + } } diff --git a/src/main/java/info/sigterm/deob/execution/Execution.java b/src/main/java/info/sigterm/deob/execution/Execution.java index 0b48433619..bd5eb3e05f 100644 --- a/src/main/java/info/sigterm/deob/execution/Execution.java +++ b/src/main/java/info/sigterm/deob/execution/Execution.java @@ -1,5 +1,6 @@ package info.sigterm.deob.execution; +import info.sigterm.deob.ClassFile; import info.sigterm.deob.ClassGroup; import info.sigterm.deob.Method; @@ -15,10 +16,13 @@ public class Execution this.group = group; } - public void run(Method method, Object... args) + public void run(ClassFile cf, Method method, Object... args) { Path p = new Path(this); - p.invoke(method, args); + ClassInstance instance = p.getClassInstance(cf); + ObjectInstance object = p.createObject(instance); + + p.invoke(method, object); } public void addPath(Path p) diff --git a/src/main/java/info/sigterm/deob/execution/Frame.java b/src/main/java/info/sigterm/deob/execution/Frame.java index 7bf3380824..80ef267ce3 100644 --- a/src/main/java/info/sigterm/deob/execution/Frame.java +++ b/src/main/java/info/sigterm/deob/execution/Frame.java @@ -9,7 +9,7 @@ public class Frame { private Path path; private Method method; - private boolean executing = true; + boolean executing = true; private int pc; private Stack stack; private Variables variables; @@ -48,7 +48,16 @@ public class Frame int oldPc = pc; Instruction i = ins.findInstruction(pc); - i.execute(this); + + try + { + i.execute(this); + } + catch (Throwable ex) + { + System.err.println("Error executing instruction in " + method.getName() + " " + method.getDescriptor() + " in class " + method.getMethods().getClassFile().getName() + " at pc " + pc); + throw ex; + } if (oldPc == pc) { diff --git a/src/main/java/info/sigterm/deob/execution/Path.java b/src/main/java/info/sigterm/deob/execution/Path.java index d3c63c2a85..11a13d4bff 100644 --- a/src/main/java/info/sigterm/deob/execution/Path.java +++ b/src/main/java/info/sigterm/deob/execution/Path.java @@ -2,6 +2,7 @@ package info.sigterm.deob.execution; import info.sigterm.deob.ClassFile; import info.sigterm.deob.Method; +import info.sigterm.deob.attributes.code.Instruction; import java.util.ArrayList; @@ -72,7 +73,7 @@ public class Path return other; } - public void invoke(Method method, Object[] args) + public void invoke(Method method, Object... args) { Frame f = new Frame(this, method); Variables vars = f.getVariables(); @@ -81,4 +82,24 @@ public class Path frames.push(f); f.execute(); } + + public void returnFrame(Instruction i, Object value) + { + returnFrame(); + Frame prevFrame = getCurrentFrame(); + + prevFrame.getStack().push(i, value); + } + + public void returnFrame() + { + Frame currentFrame = frames.pop(); + currentFrame.executing = false; + } + + public void throwException(ObjectInstance exception) + { + System.out.println("throw " + exception); + //XXX + } } diff --git a/src/main/java/info/sigterm/deob/execution/Stack.java b/src/main/java/info/sigterm/deob/execution/Stack.java index 6482a3d510..ed7f61bb2c 100644 --- a/src/main/java/info/sigterm/deob/execution/Stack.java +++ b/src/main/java/info/sigterm/deob/execution/Stack.java @@ -1,21 +1,28 @@ package info.sigterm.deob.execution; +import info.sigterm.deob.attributes.code.Instruction; + public class Stack { private int size; private Object[] stack; + private Instruction[] ins; public Stack(int sz) { stack = new Object[sz]; + ins = new Instruction[sz]; } - public void push(Object obj) + public void push(Instruction i, Object obj) { if (size == stack.length) throw new RuntimeException("Stack overflow"); - stack[size++] = obj; + stack[size] = obj; + ins[size] = i; + + ++size; } public Object pop() diff --git a/src/main/java/info/sigterm/deob/execution/StaticFieldInstance.java b/src/main/java/info/sigterm/deob/execution/StaticFieldInstance.java index fec46d08fa..74f4ad7832 100644 --- a/src/main/java/info/sigterm/deob/execution/StaticFieldInstance.java +++ b/src/main/java/info/sigterm/deob/execution/StaticFieldInstance.java @@ -13,7 +13,8 @@ public class StaticFieldInstance { this.clazz = clazz; this.field = field; - this.value = value.getValue().getObject(); + if (value != null) + this.value = value.getValue().getObject(); } public Field getField() diff --git a/src/main/java/info/sigterm/deob/pool/Method.java b/src/main/java/info/sigterm/deob/pool/Method.java index 802591863b..5021157947 100644 --- a/src/main/java/info/sigterm/deob/pool/Method.java +++ b/src/main/java/info/sigterm/deob/pool/Method.java @@ -19,4 +19,14 @@ public class Method extends PoolEntry classIndex = is.readUnsignedShort(); nameAndTypeIndex = is.readUnsignedShort(); } + + public Class getClassEntry() + { + return (Class) this.getPool().getEntry(classIndex); + } + + public NameAndType getNameAndType() + { + return (NameAndType) this.getPool().getEntry(nameAndTypeIndex); + } } diff --git a/src/main/java/info/sigterm/deob/pool/NameAndType.java b/src/main/java/info/sigterm/deob/pool/NameAndType.java index 11df00377f..051ce976f9 100644 --- a/src/main/java/info/sigterm/deob/pool/NameAndType.java +++ b/src/main/java/info/sigterm/deob/pool/NameAndType.java @@ -4,6 +4,8 @@ import info.sigterm.deob.ConstantPool; import java.io.DataInputStream; import java.io.IOException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public class NameAndType extends PoolEntry { @@ -57,4 +59,24 @@ public class NameAndType extends PoolEntry return null; } } + + private static Pattern allParamsPattern = Pattern.compile("(\\(.*?\\))"); + private static Pattern paramsPattern = Pattern.compile("(\\[?)(B|C|Z|S|I|J|F|D|(:?L[^;]+;))"); + + public int getNumberOfArgs() + { + java.lang.String methodRefType = this.getDescriptor(); + Matcher m = allParamsPattern.matcher(methodRefType); + if (!m.find()) + throw new IllegalArgumentException("Method signature does not contain parameters"); + + java.lang.String paramsDescriptor = m.group(1); + Matcher mParam = paramsPattern.matcher(paramsDescriptor); + + int count = 0; + while (mParam.find()) + count++; + + return count; + } }