From 463b6df138877f4b731e5578d301211f4f487a35 Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 5 Dec 2014 17:18:16 -0500 Subject: [PATCH] Array stuff needs more thinking. --- .../java/info/sigterm/deob/ClassGroup.java | 1 + .../info/sigterm/deob/attributes/Code.java | 16 -------------- .../code/instructions/MultiANewArray.java | 21 ++++++++++++++++++- .../attributes/code/instructions/New.java | 21 +++++++++++++++++++ 4 files changed, 42 insertions(+), 17 deletions(-) diff --git a/src/main/java/info/sigterm/deob/ClassGroup.java b/src/main/java/info/sigterm/deob/ClassGroup.java index 71b8b05a20..a42a3db818 100644 --- a/src/main/java/info/sigterm/deob/ClassGroup.java +++ b/src/main/java/info/sigterm/deob/ClassGroup.java @@ -21,6 +21,7 @@ public class ClassGroup public ClassFile findClass(String name) { + // XXX handle arrays for (ClassFile c : classes) if (c.getName().equals(name)) return c; diff --git a/src/main/java/info/sigterm/deob/attributes/Code.java b/src/main/java/info/sigterm/deob/attributes/Code.java index 74104f1da9..b3fc346d3f 100644 --- a/src/main/java/info/sigterm/deob/attributes/Code.java +++ b/src/main/java/info/sigterm/deob/attributes/Code.java @@ -48,20 +48,4 @@ public class Code extends Attribute { instructions.buildInstructionGraph(); } - - /* - public void execute(Frame frame) - { - int pc = 0; - - while (exeuting) - { - Instruction i = instructions.findInstruction(pc); - i.execute(frame); - } - } - - public void jump(int offset) - { - }*/ } diff --git a/src/main/java/info/sigterm/deob/attributes/code/instructions/MultiANewArray.java b/src/main/java/info/sigterm/deob/attributes/code/instructions/MultiANewArray.java index a56d23a799..7fbfdef923 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/instructions/MultiANewArray.java +++ b/src/main/java/info/sigterm/deob/attributes/code/instructions/MultiANewArray.java @@ -1,8 +1,12 @@ package info.sigterm.deob.attributes.code.instructions; +import info.sigterm.deob.ClassFile; 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.Stack; +import info.sigterm.deob.pool.Class; import java.io.DataInputStream; import java.io.IOException; @@ -21,5 +25,20 @@ public class MultiANewArray extends Instruction dimensions = is.readUnsignedByte(); length += 3; } - + + @Override + public void execute(Frame e) + { + Stack stack = e.getStack(); + + ClassFile thisClass = this.getInstructions().getCode().getAttributes().getClassFile(); + Class clazz = (Class) thisClass.getPool().getEntry(index); + + // XXX primive type/array type ? [[I [[Lmyclass; etc + ClassFile cf = thisClass.getGroup().findClass(clazz.getName()); + + int[] dims = new int[dimensions]; + for (int i = 0; i < dimensions; ++i) + dims[i] = (int) stack.pop(); + } } 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 a277d23e43..0e0d5c9b6d 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 @@ -1,8 +1,13 @@ package info.sigterm.deob.attributes.code.instructions; +import info.sigterm.deob.ClassFile; 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.Class; import java.io.DataInputStream; import java.io.IOException; @@ -20,4 +25,20 @@ public class New extends Instruction length += 2; } + @Override + public void execute(Frame e) + { + ClassFile thisClass = this.getInstructions().getCode().getAttributes().getClassFile(); + Class clazz = (Class) thisClass.getPool().getEntry(index); + ClassFile cf = thisClass.getGroup().findClass(clazz.getName()); + if (cf == null) + { + e.getStack().push(null); + return; + } + + ClassInstance type = e.getPath().getClassInstance(cf); + ObjectInstance obj = e.getPath().createObject(type); + e.getStack().push(obj); + } }