Fix invokeinterface, add invokedynamic
This commit is contained in:
@@ -19,6 +19,7 @@ import info.sigterm.deob.attributes.code.instructions.IStore;
|
|||||||
import info.sigterm.deob.attributes.code.instructions.IfNonNull;
|
import info.sigterm.deob.attributes.code.instructions.IfNonNull;
|
||||||
import info.sigterm.deob.attributes.code.instructions.IfNull;
|
import info.sigterm.deob.attributes.code.instructions.IfNull;
|
||||||
import info.sigterm.deob.attributes.code.instructions.InstanceOf;
|
import info.sigterm.deob.attributes.code.instructions.InstanceOf;
|
||||||
|
import info.sigterm.deob.attributes.code.instructions.InvokeDynamic;
|
||||||
import info.sigterm.deob.attributes.code.instructions.InvokeInterface;
|
import info.sigterm.deob.attributes.code.instructions.InvokeInterface;
|
||||||
import info.sigterm.deob.attributes.code.instructions.InvokeSpecial;
|
import info.sigterm.deob.attributes.code.instructions.InvokeSpecial;
|
||||||
import info.sigterm.deob.attributes.code.instructions.InvokeStatic;
|
import info.sigterm.deob.attributes.code.instructions.InvokeStatic;
|
||||||
@@ -228,6 +229,7 @@ public enum InstructionType
|
|||||||
INVOKESPECIAL(0xb7, "invokespecial", InvokeSpecial.class),
|
INVOKESPECIAL(0xb7, "invokespecial", InvokeSpecial.class),
|
||||||
INVOKESTATIC(0xb8, "invokestatic", InvokeStatic.class),
|
INVOKESTATIC(0xb8, "invokestatic", InvokeStatic.class),
|
||||||
INVOKEINTERFACE(0xb9, "invokeinterface", InvokeInterface.class),
|
INVOKEINTERFACE(0xb9, "invokeinterface", InvokeInterface.class),
|
||||||
|
INVOKEDYNAMIC(0xba, "invokedynamic", InvokeDynamic.class),
|
||||||
NEW(0xbb, "new", New.class),
|
NEW(0xbb, "new", New.class),
|
||||||
NEWARRAY(0xbc, "newarray", NewArray.class),
|
NEWARRAY(0xbc, "newarray", NewArray.class),
|
||||||
ANEWARRAY(0xbd, "anewarray", ANewArray.class),
|
ANEWARRAY(0xbd, "anewarray", ANewArray.class),
|
||||||
@@ -245,69 +247,6 @@ public enum InstructionType
|
|||||||
JSR_W(0xc9, "jsr_w", JSR_W.class),
|
JSR_W(0xc9, "jsr_w", JSR_W.class),
|
||||||
BREAKPOINT(0xca, "breakpoint", Instruction.class);
|
BREAKPOINT(0xca, "breakpoint", Instruction.class);
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
{"0xc4", "4", "wide", Code_wide.class},
|
|
||||||
{"0xc5", "4", "multianewarray", Code_multianewarray.class},
|
|
||||||
{"0xc6", "3", "ifnull", Code_Branch.class},
|
|
||||||
{"0xc7", "3", "ifnonnull", Code_Branch.class},
|
|
||||||
{"0xc8", "5", "goto_w", Code_BranchInt.class},
|
|
||||||
{"0xc9", "5", "jsr_w", Code_BranchInt.class},
|
|
||||||
{"0xca", "1", "breakpoint", null},
|
|
||||||
{"0xcb", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xcc", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xcd", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xce", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xcf", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xd0", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xd1", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xd2", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xd3", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xd4", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xd5", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xd6", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xd7", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xd8", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xd9", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xda", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xdb", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xdc", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xdd", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xde", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xdf", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xe0", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xe1", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xe2", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xe3", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xe4", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xe5", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xe6", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xe7", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xe8", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xe9", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xea", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xeb", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xec", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xed", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xee", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xef", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xf0", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xf1", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xf2", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xf3", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xf4", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xf5", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xf6", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xf7", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xf8", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xf9", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xfa", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xfb", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xfc", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xfd", "1", "xxxunusedxxx", null},
|
|
||||||
{"0xfe", "1", "impdep1", null},
|
|
||||||
{"0xff", "1", "impdep2", null}
|
|
||||||
*/
|
|
||||||
private byte code;
|
private byte code;
|
||||||
private String name;
|
private String name;
|
||||||
private Class<? extends Instruction> clazz;
|
private Class<? extends Instruction> clazz;
|
||||||
|
|||||||
@@ -19,7 +19,8 @@ public class Instructions
|
|||||||
|
|
||||||
int length = is.readInt();
|
int length = is.readInt();
|
||||||
|
|
||||||
for (int pc = 0; pc < length;)
|
int pc;
|
||||||
|
for (pc = 0; pc < length;)
|
||||||
{
|
{
|
||||||
byte opcode = is.readByte();
|
byte opcode = is.readByte();
|
||||||
|
|
||||||
@@ -40,6 +41,8 @@ public class Instructions
|
|||||||
throw new IOException(ex);
|
throw new IOException(ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
assert pc == length;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Code getCode()
|
public Code getCode()
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import java.io.IOException;
|
|||||||
public class InvokeInterface extends Instruction
|
public class InvokeInterface extends Instruction
|
||||||
{
|
{
|
||||||
private int index;
|
private int index;
|
||||||
|
private int count;
|
||||||
|
|
||||||
public InvokeInterface(Instructions instructions, InstructionType type, int pc) throws IOException
|
public InvokeInterface(Instructions instructions, InstructionType type, int pc) throws IOException
|
||||||
{
|
{
|
||||||
@@ -17,7 +18,9 @@ public class InvokeInterface extends Instruction
|
|||||||
|
|
||||||
DataInputStream is = instructions.getCode().getAttributes().getStream();
|
DataInputStream is = instructions.getCode().getAttributes().getStream();
|
||||||
index = is.readUnsignedShort();
|
index = is.readUnsignedShort();
|
||||||
length += 2;
|
count = is.readUnsignedByte();
|
||||||
|
is.skip(1);
|
||||||
|
length += 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user