From cec4f0ac59d4dbe61fda1de88daf09b3b9a372a6 Mon Sep 17 00:00:00 2001 From: Adam Date: Mon, 26 Jan 2015 02:25:42 -0500 Subject: [PATCH] getObject on String should really just return the string --- .../info/sigterm/deob/attributes/code/Instruction.java | 5 +++++ .../deob/attributes/code/instructions/AAStore.java | 2 +- .../attributes/code/instructions/InvokeStatic.java | 7 +++++++ .../deob/attributes/code/instructions/LDC_W.java | 10 ++++++++++ src/main/java/info/sigterm/deob/execution/Frame.java | 4 ++++ src/main/java/info/sigterm/deob/pool/String.java | 2 +- src/main/java/info/sigterm/deob/pool/UTF8.java | 6 ++++++ 7 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/main/java/info/sigterm/deob/attributes/code/Instruction.java b/src/main/java/info/sigterm/deob/attributes/code/Instruction.java index c59f541d20..12020bc335 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/Instruction.java +++ b/src/main/java/info/sigterm/deob/attributes/code/Instruction.java @@ -36,6 +36,11 @@ public abstract class Instruction { return length; } + + public String getDesc(Frame frame) + { + return null; + } protected void addJump(int offset) { diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/AAStore.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/AAStore.java index 27bf671df4..1ef8809557 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/AAStore.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/AAStore.java @@ -20,7 +20,7 @@ public class AAStore extends Instruction { Stack stack = frame.getStack(); - ObjectInstance value = (ObjectInstance) stack.pop(); + ObjectInstance value = (ObjectInstance) stack.pop(); // Strings are objects too, so this cast fails int index = (int) stack.pop(); ArrayInstance array = (ArrayInstance) stack.pop(); 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 9c4826f120..efeea58879 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 @@ -40,6 +40,13 @@ public class InvokeStatic extends Instruction for (int i = count - 1; i >= 0; --i) args[i] = e.getStack().pop(); + if (otherClass == null) + { + System.out.println("invokestatic for nonexistant class " + clazz.getName()); + e.getStack().push(this, null); + return; + } + 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/LDC_W.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/LDC_W.java index 3d31f863d4..6c740c3e9e 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 @@ -30,4 +30,14 @@ public class LDC_W extends Instruction PoolEntry entry = thisClass.getPool().getEntry(index); frame.getStack().push(this, entry.getObject()); } + + + @Override + public String getDesc(Frame frame) + { + ClassFile thisClass = this.getInstructions().getCode().getAttributes().getClassFile(); + PoolEntry entry = thisClass.getPool().getEntry(index); + + return "ldc_w " + entry.getObject(); + } } diff --git a/src/main/java/info/sigterm/deob/execution/Frame.java b/src/main/java/info/sigterm/deob/execution/Frame.java index 80ef267ce3..1dee9cfca8 100644 --- a/src/main/java/info/sigterm/deob/execution/Frame.java +++ b/src/main/java/info/sigterm/deob/execution/Frame.java @@ -49,6 +49,10 @@ public class Frame Instruction i = ins.findInstruction(pc); + String desc = i.getDesc(this); + if (desc != null) + System.out.println(desc); + try { i.execute(this); diff --git a/src/main/java/info/sigterm/deob/pool/String.java b/src/main/java/info/sigterm/deob/pool/String.java index 45400adef9..825963943e 100644 --- a/src/main/java/info/sigterm/deob/pool/String.java +++ b/src/main/java/info/sigterm/deob/pool/String.java @@ -21,6 +21,6 @@ public class String extends PoolEntry @Override public Object getObject() { - return stringIndex; + return this.getPool().getEntry(stringIndex).getObject(); } } diff --git a/src/main/java/info/sigterm/deob/pool/UTF8.java b/src/main/java/info/sigterm/deob/pool/UTF8.java index fafbe17525..4bf3963bba 100644 --- a/src/main/java/info/sigterm/deob/pool/UTF8.java +++ b/src/main/java/info/sigterm/deob/pool/UTF8.java @@ -42,6 +42,12 @@ public class UTF8 extends PoolEntry } public java.lang.String getValue() + { + return (java.lang.String) getObject(); + } + + @Override + public Object getObject() { return sb.toString(); }