From 39ed12af48fbcd984027b2c8e5b3db3269822fff Mon Sep 17 00:00:00 2001 From: Adam Date: Mon, 1 Dec 2014 11:37:08 -0500 Subject: [PATCH] Instructions done --- .../deob/attributes/code/ANewArray.java | 19 +++++ .../deob/attributes/code/CheckCast.java | 19 +++++ .../sigterm/deob/attributes/code/DLoad.java | 2 +- .../sigterm/deob/attributes/code/FLoad.java | 2 +- .../deob/attributes/code/GetField.java | 19 +++++ .../deob/attributes/code/GetStatic.java | 19 +++++ .../sigterm/deob/attributes/code/GotoW.java | 19 +++++ .../deob/attributes/code/IfNonNull.java | 19 +++++ .../sigterm/deob/attributes/code/IfNull.java | 19 +++++ .../deob/attributes/code/InstanceOf.java | 19 +++++ .../deob/attributes/code/Instruction.java | 2 +- .../deob/attributes/code/InstructionType.java | 77 ++++++++++--------- .../deob/attributes/code/Instructions.java | 11 ++- .../deob/attributes/code/InvokeInterface.java | 19 +++++ .../deob/attributes/code/InvokeSpecial.java | 19 +++++ .../deob/attributes/code/InvokeStatic.java | 19 +++++ .../deob/attributes/code/InvokeVirtual.java | 19 +++++ .../sigterm/deob/attributes/code/JSR_W.java | 19 +++++ .../deob/attributes/code/LookupSwitch.java | 36 +++++++++ .../deob/attributes/code/MultiANewArray.java | 21 +++++ .../sigterm/deob/attributes/code/New.java | 19 +++++ .../deob/attributes/code/NewArray.java | 19 +++++ .../deob/attributes/code/PutField.java | 19 +++++ .../deob/attributes/code/PutStatic.java | 19 +++++ .../sigterm/deob/attributes/code/Ret.java | 19 +++++ .../deob/attributes/code/TableSwitch.java | 34 ++++++++ .../sigterm/deob/attributes/code/Wide.java | 32 ++++++++ 27 files changed, 520 insertions(+), 39 deletions(-) create mode 100644 src/main/java/info/sigterm/deob/attributes/code/ANewArray.java create mode 100644 src/main/java/info/sigterm/deob/attributes/code/CheckCast.java create mode 100644 src/main/java/info/sigterm/deob/attributes/code/GetField.java create mode 100644 src/main/java/info/sigterm/deob/attributes/code/GetStatic.java create mode 100644 src/main/java/info/sigterm/deob/attributes/code/GotoW.java create mode 100644 src/main/java/info/sigterm/deob/attributes/code/IfNonNull.java create mode 100644 src/main/java/info/sigterm/deob/attributes/code/IfNull.java create mode 100644 src/main/java/info/sigterm/deob/attributes/code/InstanceOf.java create mode 100644 src/main/java/info/sigterm/deob/attributes/code/InvokeInterface.java create mode 100644 src/main/java/info/sigterm/deob/attributes/code/InvokeSpecial.java create mode 100644 src/main/java/info/sigterm/deob/attributes/code/InvokeStatic.java create mode 100644 src/main/java/info/sigterm/deob/attributes/code/InvokeVirtual.java create mode 100644 src/main/java/info/sigterm/deob/attributes/code/JSR_W.java create mode 100644 src/main/java/info/sigterm/deob/attributes/code/LookupSwitch.java create mode 100644 src/main/java/info/sigterm/deob/attributes/code/MultiANewArray.java create mode 100644 src/main/java/info/sigterm/deob/attributes/code/New.java create mode 100644 src/main/java/info/sigterm/deob/attributes/code/NewArray.java create mode 100644 src/main/java/info/sigterm/deob/attributes/code/PutField.java create mode 100644 src/main/java/info/sigterm/deob/attributes/code/PutStatic.java create mode 100644 src/main/java/info/sigterm/deob/attributes/code/Ret.java create mode 100644 src/main/java/info/sigterm/deob/attributes/code/TableSwitch.java create mode 100644 src/main/java/info/sigterm/deob/attributes/code/Wide.java diff --git a/src/main/java/info/sigterm/deob/attributes/code/ANewArray.java b/src/main/java/info/sigterm/deob/attributes/code/ANewArray.java new file mode 100644 index 0000000000..35c7f64d06 --- /dev/null +++ b/src/main/java/info/sigterm/deob/attributes/code/ANewArray.java @@ -0,0 +1,19 @@ +package info.sigterm.deob.attributes.code; + +import java.io.DataInputStream; +import java.io.IOException; + +public class ANewArray extends Instruction +{ + private int index; + + ANewArray(Instructions instructions, InstructionType type, int pc) throws IOException + { + super(instructions, type, pc); + + DataInputStream is = instructions.getCode().getAttributes().getStream(); + index = is.readUnsignedShort(); + length += 2; + } + +} diff --git a/src/main/java/info/sigterm/deob/attributes/code/CheckCast.java b/src/main/java/info/sigterm/deob/attributes/code/CheckCast.java new file mode 100644 index 0000000000..6ed3b3bef2 --- /dev/null +++ b/src/main/java/info/sigterm/deob/attributes/code/CheckCast.java @@ -0,0 +1,19 @@ +package info.sigterm.deob.attributes.code; + +import java.io.DataInputStream; +import java.io.IOException; + +public class CheckCast extends Instruction +{ + private int index; + + CheckCast(Instructions instructions, InstructionType type, int pc) throws IOException + { + super(instructions, type, pc); + + DataInputStream is = instructions.getCode().getAttributes().getStream(); + index = is.readUnsignedShort(); + length += 2; + } + +} diff --git a/src/main/java/info/sigterm/deob/attributes/code/DLoad.java b/src/main/java/info/sigterm/deob/attributes/code/DLoad.java index 39d7162e06..1a1ad1ba0d 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/DLoad.java +++ b/src/main/java/info/sigterm/deob/attributes/code/DLoad.java @@ -5,7 +5,7 @@ import java.io.IOException; public class DLoad extends Instruction { - int index; + private int index; DLoad(Instructions instructions, InstructionType type, int pc) throws IOException { diff --git a/src/main/java/info/sigterm/deob/attributes/code/FLoad.java b/src/main/java/info/sigterm/deob/attributes/code/FLoad.java index 6392891b04..d86cbad48f 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/FLoad.java +++ b/src/main/java/info/sigterm/deob/attributes/code/FLoad.java @@ -5,7 +5,7 @@ import java.io.IOException; public class FLoad extends Instruction { - int index; + private int index; FLoad(Instructions instructions, InstructionType type, int pc) throws IOException { diff --git a/src/main/java/info/sigterm/deob/attributes/code/GetField.java b/src/main/java/info/sigterm/deob/attributes/code/GetField.java new file mode 100644 index 0000000000..2ce8f8772a --- /dev/null +++ b/src/main/java/info/sigterm/deob/attributes/code/GetField.java @@ -0,0 +1,19 @@ +package info.sigterm.deob.attributes.code; + +import java.io.DataInputStream; +import java.io.IOException; + +public class GetField extends Instruction +{ + private int index; + + GetField(Instructions instructions, InstructionType type, int pc) throws IOException + { + super(instructions, type, pc); + + DataInputStream is = instructions.getCode().getAttributes().getStream(); + index = is.readUnsignedShort(); + length += 2; + } + +} diff --git a/src/main/java/info/sigterm/deob/attributes/code/GetStatic.java b/src/main/java/info/sigterm/deob/attributes/code/GetStatic.java new file mode 100644 index 0000000000..4e202b3c82 --- /dev/null +++ b/src/main/java/info/sigterm/deob/attributes/code/GetStatic.java @@ -0,0 +1,19 @@ +package info.sigterm.deob.attributes.code; + +import java.io.DataInputStream; +import java.io.IOException; + +public class GetStatic extends Instruction +{ + private int index; + + GetStatic(Instructions instructions, InstructionType type, int pc) throws IOException + { + super(instructions, type, pc); + + DataInputStream is = instructions.getCode().getAttributes().getStream(); + index = is.readUnsignedShort(); + length += 2; + } + +} diff --git a/src/main/java/info/sigterm/deob/attributes/code/GotoW.java b/src/main/java/info/sigterm/deob/attributes/code/GotoW.java new file mode 100644 index 0000000000..70d45406c1 --- /dev/null +++ b/src/main/java/info/sigterm/deob/attributes/code/GotoW.java @@ -0,0 +1,19 @@ +package info.sigterm.deob.attributes.code; + +import java.io.DataInputStream; +import java.io.IOException; + +public class GotoW extends Instruction +{ + private int offset; + + GotoW(Instructions instructions, InstructionType type, int pc) throws IOException + { + super(instructions, type, pc); + + DataInputStream is = instructions.getCode().getAttributes().getStream(); + offset = is.readInt(); + length += 4; + } + +} diff --git a/src/main/java/info/sigterm/deob/attributes/code/IfNonNull.java b/src/main/java/info/sigterm/deob/attributes/code/IfNonNull.java new file mode 100644 index 0000000000..ff440ce7b9 --- /dev/null +++ b/src/main/java/info/sigterm/deob/attributes/code/IfNonNull.java @@ -0,0 +1,19 @@ +package info.sigterm.deob.attributes.code; + +import java.io.DataInputStream; +import java.io.IOException; + +public class IfNonNull extends Instruction +{ + private int index; + + IfNonNull(Instructions instructions, InstructionType type, int pc) throws IOException + { + super(instructions, type, pc); + + DataInputStream is = instructions.getCode().getAttributes().getStream(); + index = is.readUnsignedShort(); + length += 2; + } + +} diff --git a/src/main/java/info/sigterm/deob/attributes/code/IfNull.java b/src/main/java/info/sigterm/deob/attributes/code/IfNull.java new file mode 100644 index 0000000000..c6be8e8fbc --- /dev/null +++ b/src/main/java/info/sigterm/deob/attributes/code/IfNull.java @@ -0,0 +1,19 @@ +package info.sigterm.deob.attributes.code; + +import java.io.DataInputStream; +import java.io.IOException; + +public class IfNull extends Instruction +{ + private int index; + + IfNull(Instructions instructions, InstructionType type, int pc) throws IOException + { + super(instructions, type, pc); + + DataInputStream is = instructions.getCode().getAttributes().getStream(); + index = is.readUnsignedShort(); + length += 2; + } + +} diff --git a/src/main/java/info/sigterm/deob/attributes/code/InstanceOf.java b/src/main/java/info/sigterm/deob/attributes/code/InstanceOf.java new file mode 100644 index 0000000000..89c16c374b --- /dev/null +++ b/src/main/java/info/sigterm/deob/attributes/code/InstanceOf.java @@ -0,0 +1,19 @@ +package info.sigterm.deob.attributes.code; + +import java.io.DataInputStream; +import java.io.IOException; + +public class InstanceOf extends Instruction +{ + private int index; + + InstanceOf(Instructions instructions, InstructionType type, int pc) throws IOException + { + super(instructions, type, pc); + + DataInputStream is = instructions.getCode().getAttributes().getStream(); + index = is.readUnsignedShort(); + length += 2; + } + +} 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 e5bb8cb783..571935705c 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/Instruction.java +++ b/src/main/java/info/sigterm/deob/attributes/code/Instruction.java @@ -7,7 +7,7 @@ public class Instruction private int pc; protected int length = 1; - Instruction(Instructions instructions, InstructionType type, int pc) + public Instruction(Instructions instructions, InstructionType type, int pc) { this.instructions = instructions; this.type = type; 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 13c05e7494..343307a40c 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/InstructionType.java +++ b/src/main/java/info/sigterm/deob/attributes/code/InstructionType.java @@ -163,43 +163,50 @@ public enum InstructionType IFLE(0x9e, "ifle", Branch.class), IF_ICMPEQ(0x9f, "if_icmpeq", Branch.class), IF_ICMPNE(0xa0, "if_icmpne", Branch.class), - IF_ICMPLT(0xa1, "if_cmplt", Branch.class); + IF_ICMPLT(0xa1, "if_cmplt", Branch.class), + IF_CMPGE(0xa2, "if_cmpge", Branch.class), + IF_CMPGT(0xa3, "if_cmpgt", Branch.class), + IF_CMPLE(0xa4, "if_cmple", Branch.class), + IF_ACMPEQ(0xa5, "if_acmpeq", Branch.class), + IF_ACMPNE(0xa6, "if_acmpne", Branch.class), + GOTO(0xa7, "goto", Branch.class), + JSR(0xa8, "jsr", Branch.class), + RET(0xa9, "ret", Ret.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), + GETSTATIC(0xb2, "getstatic", GetStatic.class), + PUTSTATIC(0xb3, "putstatic", PutStatic.class), + GETFIELD(0xb4, "getfield", GetField.class), + PUTFIELD(0xb5, "putfield", PutField.class), + INVOKEVIRTUAL(0xb6, "invokevirtual", InvokeVirtual.class), + INVOKESPECIAL(0xb7, "invokespecial", InvokeSpecial.class), + INVOKESTATIC(0xb8, "invokestatic", InvokeStatic.class), + INVOKEINTERFACE(0xb9, "invokeinterface", InvokeInterface.class), + NEW(0xbb, "new", New.class), + NEWARRAY(0xbc, "newarray", NewArray.class), + ANEWARRAY(0xbd, "anewarray", ANewArray.class), + ARRAYLENGTH(0xbe, "arraylength", Instruction.class), + ATHROW(0xbf, "athrow", Instruction.class), + CHECKCAST(0xc0, "checkcast", CheckCast.class), + INSTANCEOf(0xc1, "instanceof", InstanceOf.class), + MONITORENTER(0xc2, "monitorenter", Instruction.class), + MONITOREXIT(0xc3, "monitorexit", Instruction.class), + WIDE(0xc4, "wide", Wide.class), + MULTIANEWARRAY(0xc5, "multianewarray", MultiANewArray.class), + IFNULL(0xc6, "ifnull", IfNull.class), + IFNONNULL(0xc7, "ifnonnull", IfNonNull.class), + GOTO_W(0xc8, "goto_w", GotoW.class), + JSR_W(0xc9, "jsr_w", JSR_W.class), + BREAKPOINT(0xca, "breakpoint", Instruction.class); /* - {"0xa2", "3", "if_icmpge", Code_Branch.class}, - {"0xa3", "3", "if_icmpgt", Code_Branch.class}, - {"0xa4", "3", "if_icmple", Code_Branch.class}, - {"0xa5", "3", "if_acmpeq", Code_Branch.class}, - {"0xa6", "3", "if_acmpne", Code_Branch.class}, - {"0xa7", "3", "goto", Code_Branch.class}, - {"0xa8", "3", "jsr", Code_Branch.class}, - {"0xa9", "2", "ret", Code_VarTable.class}, - {"0xaa", "0", "tableswitch", Code_tableswitch.class}, - {"0xab", "0", "lookupswitch", Code_lookupswitch.class}, - {"0xac", "1", "ireturn", null}, - {"0xad", "1", "lreturn", null}, - {"0xae", "1", "freturn", null}, - {"0xaf", "1", "dreturn", null}, - {"0xb0", "1", "areturn", null}, - {"0xb1", "1", "return", null}, - {"0xb2", "3", "getstatic", Code_Pool.class}, - {"0xb3", "3", "putstatic", Code_Pool.class}, - {"0xb4", "3", "getfield", Code_Pool.class}, - {"0xb5", "3", "putfield", Code_Pool.class}, - {"0xb6", "3", "invokevirtual", Code_Pool.class}, - {"0xb7", "3", "invokespecial", Code_Pool.class}, - {"0xb8", "3", "invokestatic", Code_Pool.class}, - {"0xb9", "5", "invokeinterface", Code_invokeinterface.class}, - {"0xba", "1", "xxxunusedxxx", null}, - {"0xbb", "3", "new", Code_Pool.class}, - {"0xbc", "2", "newarray", Code_newarray.class}, - {"0xbd", "3", "anewarray", Code_Pool.class}, - {"0xbe", "1", "arraylength", null}, - {"0xbf", "1", "athrow", null}, - {"0xc0", "3", "checkcast", Code_Pool.class}, - {"0xc1", "3", "instanceof", Code_Pool.class}, - {"0xc2", "1", "monitorenter", null}, - {"0xc3", "1", "monitorexit", null}, + {"0xc4", "4", "wide", Code_wide.class}, {"0xc5", "4", "multianewarray", Code_multianewarray.class}, {"0xc6", "3", "ifnull", Code_Branch.class}, diff --git a/src/main/java/info/sigterm/deob/attributes/code/Instructions.java b/src/main/java/info/sigterm/deob/attributes/code/Instructions.java index e3f6d5dd6d..b5be55489a 100644 --- a/src/main/java/info/sigterm/deob/attributes/code/Instructions.java +++ b/src/main/java/info/sigterm/deob/attributes/code/Instructions.java @@ -5,13 +5,16 @@ import info.sigterm.deob.attributes.Code; import java.io.DataInputStream; import java.io.IOException; import java.lang.reflect.Constructor; +import java.util.ArrayList; public class Instructions { private Code code; + private ArrayList instructions = new ArrayList(); public Instructions(Code code) throws IOException { + this.code = code; DataInputStream is = code.getAttributes().getStream(); int length = is.readInt(); @@ -24,11 +27,17 @@ public class Instructions try { - Constructor con = type.getInstructionClass().getConstructor(new Class[] { Instructions.class, InstructionType.class, Integer.class }); + Constructor con = type.getInstructionClass().getConstructor(Instructions.class, InstructionType.class, int.class); Instruction ins = con.newInstance(this, type, pc); + + instructions.add(ins); + + int len = ins.getLength(); + pc += len; } catch (java.lang.Exception ex) { + System.out.println(type); throw new IOException(ex); } } diff --git a/src/main/java/info/sigterm/deob/attributes/code/InvokeInterface.java b/src/main/java/info/sigterm/deob/attributes/code/InvokeInterface.java new file mode 100644 index 0000000000..b261a75781 --- /dev/null +++ b/src/main/java/info/sigterm/deob/attributes/code/InvokeInterface.java @@ -0,0 +1,19 @@ +package info.sigterm.deob.attributes.code; + +import java.io.DataInputStream; +import java.io.IOException; + +public class InvokeInterface extends Instruction +{ + private int index; + + InvokeInterface(Instructions instructions, InstructionType type, int pc) throws IOException + { + super(instructions, type, pc); + + DataInputStream is = instructions.getCode().getAttributes().getStream(); + index = is.readUnsignedShort(); + length += 2; + } + +} diff --git a/src/main/java/info/sigterm/deob/attributes/code/InvokeSpecial.java b/src/main/java/info/sigterm/deob/attributes/code/InvokeSpecial.java new file mode 100644 index 0000000000..a1ec9ec2c3 --- /dev/null +++ b/src/main/java/info/sigterm/deob/attributes/code/InvokeSpecial.java @@ -0,0 +1,19 @@ +package info.sigterm.deob.attributes.code; + +import java.io.DataInputStream; +import java.io.IOException; + +public class InvokeSpecial extends Instruction +{ + private int index; + + public InvokeSpecial(Instructions instructions, InstructionType type, int pc) throws IOException + { + super(instructions, type, pc); + + DataInputStream is = instructions.getCode().getAttributes().getStream(); + index = is.readUnsignedShort(); + length += 2; + } + +} diff --git a/src/main/java/info/sigterm/deob/attributes/code/InvokeStatic.java b/src/main/java/info/sigterm/deob/attributes/code/InvokeStatic.java new file mode 100644 index 0000000000..80059a888a --- /dev/null +++ b/src/main/java/info/sigterm/deob/attributes/code/InvokeStatic.java @@ -0,0 +1,19 @@ +package info.sigterm.deob.attributes.code; + +import java.io.DataInputStream; +import java.io.IOException; + +public class InvokeStatic extends Instruction +{ + private int index; + + InvokeStatic(Instructions instructions, InstructionType type, int pc) throws IOException + { + super(instructions, type, pc); + + DataInputStream is = instructions.getCode().getAttributes().getStream(); + index = is.readUnsignedShort(); + length += 2; + } + +} diff --git a/src/main/java/info/sigterm/deob/attributes/code/InvokeVirtual.java b/src/main/java/info/sigterm/deob/attributes/code/InvokeVirtual.java new file mode 100644 index 0000000000..d1a06d63d5 --- /dev/null +++ b/src/main/java/info/sigterm/deob/attributes/code/InvokeVirtual.java @@ -0,0 +1,19 @@ +package info.sigterm.deob.attributes.code; + +import java.io.DataInputStream; +import java.io.IOException; + +public class InvokeVirtual extends Instruction +{ + private int index; + + InvokeVirtual(Instructions instructions, InstructionType type, int pc) throws IOException + { + super(instructions, type, pc); + + DataInputStream is = instructions.getCode().getAttributes().getStream(); + index = is.readUnsignedShort(); + length += 2; + } + +} diff --git a/src/main/java/info/sigterm/deob/attributes/code/JSR_W.java b/src/main/java/info/sigterm/deob/attributes/code/JSR_W.java new file mode 100644 index 0000000000..28097e4923 --- /dev/null +++ b/src/main/java/info/sigterm/deob/attributes/code/JSR_W.java @@ -0,0 +1,19 @@ +package info.sigterm.deob.attributes.code; + +import java.io.DataInputStream; +import java.io.IOException; + +public class JSR_W extends Instruction +{ + private int offset; + + JSR_W(Instructions instructions, InstructionType type, int pc) throws IOException + { + super(instructions, type, pc); + + DataInputStream is = instructions.getCode().getAttributes().getStream(); + offset = is.readInt(); + length += 4; + } + +} diff --git a/src/main/java/info/sigterm/deob/attributes/code/LookupSwitch.java b/src/main/java/info/sigterm/deob/attributes/code/LookupSwitch.java new file mode 100644 index 0000000000..547b12987e --- /dev/null +++ b/src/main/java/info/sigterm/deob/attributes/code/LookupSwitch.java @@ -0,0 +1,36 @@ +package info.sigterm.deob.attributes.code; + +import java.io.DataInputStream; +import java.io.IOException; + +public class LookupSwitch extends Instruction +{ + private int def; + private int[] match; + private int[] branch; + + LookupSwitch(Instructions instructions, InstructionType type, int pc) throws IOException + { + super(instructions, type, pc); + + DataInputStream is = instructions.getCode().getAttributes().getStream(); + + int tableSkip = 4 - (pc + 1) % 4; + if (tableSkip == 4) tableSkip = 0; + if (tableSkip > 0) is.skip(tableSkip); + + def = is.readInt(); + + int count = is.readInt(); + match = new int[count]; + branch = new int[count]; + + for (int i = 0; i < count; ++i) + { + match[i] = is.readInt(); + branch[i] = is.readInt(); + } + + length += tableSkip + 8 + (count * 8); + } +} diff --git a/src/main/java/info/sigterm/deob/attributes/code/MultiANewArray.java b/src/main/java/info/sigterm/deob/attributes/code/MultiANewArray.java new file mode 100644 index 0000000000..03250e342c --- /dev/null +++ b/src/main/java/info/sigterm/deob/attributes/code/MultiANewArray.java @@ -0,0 +1,21 @@ +package info.sigterm.deob.attributes.code; + +import java.io.DataInputStream; +import java.io.IOException; + +public class MultiANewArray extends Instruction +{ + private int index; + private int dimensions; + + MultiANewArray(Instructions instructions, InstructionType type, int pc) throws IOException + { + super(instructions, type, pc); + + DataInputStream is = instructions.getCode().getAttributes().getStream(); + index = is.readUnsignedShort(); + dimensions = is.readUnsignedByte(); + length += 3; + } + +} diff --git a/src/main/java/info/sigterm/deob/attributes/code/New.java b/src/main/java/info/sigterm/deob/attributes/code/New.java new file mode 100644 index 0000000000..f4eb111057 --- /dev/null +++ b/src/main/java/info/sigterm/deob/attributes/code/New.java @@ -0,0 +1,19 @@ +package info.sigterm.deob.attributes.code; + +import java.io.DataInputStream; +import java.io.IOException; + +public class New extends Instruction +{ + private int index; + + New(Instructions instructions, InstructionType type, int pc) throws IOException + { + super(instructions, type, pc); + + DataInputStream is = instructions.getCode().getAttributes().getStream(); + index = is.readUnsignedShort(); + length += 2; + } + +} diff --git a/src/main/java/info/sigterm/deob/attributes/code/NewArray.java b/src/main/java/info/sigterm/deob/attributes/code/NewArray.java new file mode 100644 index 0000000000..dff3297c5f --- /dev/null +++ b/src/main/java/info/sigterm/deob/attributes/code/NewArray.java @@ -0,0 +1,19 @@ +package info.sigterm.deob.attributes.code; + +import java.io.DataInputStream; +import java.io.IOException; + +public class NewArray extends Instruction +{ + private int type; + + NewArray(Instructions instructions, InstructionType type, int pc) throws IOException + { + super(instructions, type, pc); + + DataInputStream is = instructions.getCode().getAttributes().getStream(); + this.type = is.readUnsignedByte(); + length += 1; + } + +} diff --git a/src/main/java/info/sigterm/deob/attributes/code/PutField.java b/src/main/java/info/sigterm/deob/attributes/code/PutField.java new file mode 100644 index 0000000000..c726f91259 --- /dev/null +++ b/src/main/java/info/sigterm/deob/attributes/code/PutField.java @@ -0,0 +1,19 @@ +package info.sigterm.deob.attributes.code; + +import java.io.DataInputStream; +import java.io.IOException; + +public class PutField extends Instruction +{ + private int index; + + PutField(Instructions instructions, InstructionType type, int pc) throws IOException + { + super(instructions, type, pc); + + DataInputStream is = instructions.getCode().getAttributes().getStream(); + index = is.readUnsignedShort(); + length += 2; + } + +} diff --git a/src/main/java/info/sigterm/deob/attributes/code/PutStatic.java b/src/main/java/info/sigterm/deob/attributes/code/PutStatic.java new file mode 100644 index 0000000000..9f7c0e1e9d --- /dev/null +++ b/src/main/java/info/sigterm/deob/attributes/code/PutStatic.java @@ -0,0 +1,19 @@ +package info.sigterm.deob.attributes.code; + +import java.io.DataInputStream; +import java.io.IOException; + +public class PutStatic extends Instruction +{ + private int index; + + PutStatic(Instructions instructions, InstructionType type, int pc) throws IOException + { + super(instructions, type, pc); + + DataInputStream is = instructions.getCode().getAttributes().getStream(); + index = is.readUnsignedShort(); + length += 2; + } + +} diff --git a/src/main/java/info/sigterm/deob/attributes/code/Ret.java b/src/main/java/info/sigterm/deob/attributes/code/Ret.java new file mode 100644 index 0000000000..2edeab4845 --- /dev/null +++ b/src/main/java/info/sigterm/deob/attributes/code/Ret.java @@ -0,0 +1,19 @@ +package info.sigterm.deob.attributes.code; + +import java.io.DataInputStream; +import java.io.IOException; + +public class Ret extends Instruction +{ + int index; + + Ret(Instructions instructions, InstructionType type, int pc) throws IOException + { + super(instructions, type, pc); + + DataInputStream is = instructions.getCode().getAttributes().getStream(); + index = is.readByte(); + length += 1; + } + +} diff --git a/src/main/java/info/sigterm/deob/attributes/code/TableSwitch.java b/src/main/java/info/sigterm/deob/attributes/code/TableSwitch.java new file mode 100644 index 0000000000..3ea09c65a2 --- /dev/null +++ b/src/main/java/info/sigterm/deob/attributes/code/TableSwitch.java @@ -0,0 +1,34 @@ +package info.sigterm.deob.attributes.code; + +import java.io.DataInputStream; +import java.io.IOException; + +public class TableSwitch extends Instruction +{ + private int def; + private int[] jumps; + + TableSwitch(Instructions instructions, InstructionType type, int pc) throws IOException + { + super(instructions, type, pc); + + DataInputStream is = instructions.getCode().getAttributes().getStream(); + + int tableSkip = 4 - (pc + 1) % 4; + if (tableSkip == 4) tableSkip = 0; + if (tableSkip > 0) is.skip(tableSkip); + + def = is.readInt(); + + int low = is.readInt(); + int high = is.readInt(); + + int count = high - low + 1; + jumps = new int[count]; + + for (int i = 0; i < count; ++i) + jumps[i] = is.readInt(); + + length += tableSkip + 12 + (count * 4); + } +} diff --git a/src/main/java/info/sigterm/deob/attributes/code/Wide.java b/src/main/java/info/sigterm/deob/attributes/code/Wide.java new file mode 100644 index 0000000000..d89cfa89f5 --- /dev/null +++ b/src/main/java/info/sigterm/deob/attributes/code/Wide.java @@ -0,0 +1,32 @@ +package info.sigterm.deob.attributes.code; + +import java.io.DataInputStream; +import java.io.IOException; + +public class Wide extends Instruction +{ + private byte opcode; + private int index; + private int value; + + Wide(Instructions instructions, InstructionType type, int pc) throws IOException + { + super(instructions, type, pc); + + DataInputStream is = instructions.getCode().getAttributes().getStream(); + + opcode = is.readByte(); + index = is.readUnsignedShort(); + length += 3; + + // XXX + InstructionType optype = InstructionType.findInstructionFromCode(opcode); + assert optype != null; + if (optype == InstructionType.IINC) + { + value = is.readUnsignedShort(); + length += 2; + } + } + +}