// Capstone Java binding // By Nguyen Anh Quynh & Dang Hoang Vu, 2013 import com.sun.jna.Structure; import com.sun.jna.Pointer; import com.sun.jna.Union; import com.sun.jna.NativeLong; import java.util.List; import java.util.Arrays; class X86 { // Operand type public static final int X86_OP_INVALID = 0; // Uninitialized. public static final int X86_OP_REG = 1; // Register operand. public static final int X86_OP_IMM = 2; // Immediate operand. public static final int X86_OP_FP = 3; // Floating-Point immediate operand. public static final int X86_OP_MEM = 4; // Memory operand public static class MemType extends Structure { public int base; public int index; public int scale; public long disp; @Override public List getFieldOrder() { return Arrays.asList("base", "index", "scale", "disp"); } } public static class OpValue extends Union { public int reg; public long imm; public double fp; public MemType mem; @Override public List getFieldOrder() { return Arrays.asList("reg", "imm", "fp", "mem"); } } public static class Operand extends Structure { public int type; public OpValue value; public void read() { super.read(); if (type == X86_OP_MEM) value.setType(MemType.class); if (type == X86_OP_FP) value.setType(Double.TYPE); if (type == X86_OP_IMM) value.setType(Long.TYPE); if (type == X86_OP_REG) value.setType(Integer.TYPE); if (type == X86_OP_INVALID) return; readField("value"); } @Override public List getFieldOrder() { return Arrays.asList("type", "value"); } } public static class UnionOpInfo extends Structure { public byte [] prefix = new byte[5]; public int segment; public byte [] opcode = new byte[3]; public byte op_size; public byte addr_size; public byte disp_size; public byte imm_size; public byte modrm; public byte sib; public int disp; public int sib_index; public byte sib_scale; public int sib_base; public int op_count; public Operand [] op = new Operand[8]; @Override public List getFieldOrder() { return Arrays.asList("prefix", "segment", "opcode", "op_size", "addr_size", "disp_size", "imm_size", "modrm", "sib", "disp", "sib_index", "sib_scale", "sib_base", "op_count", "op"); } } public static class OpInfo extends Capstone.OpInfo { public byte [] prefix; public int segment; public byte [] opcode; public byte op_size; public byte addr_size; public byte disp_size; public byte imm_size; public byte modrm; public byte sib; public int disp; public int sib_index; public byte sib_scale; public int sib_base; Operand[] op; public OpInfo(UnionOpInfo e) { prefix = e.prefix; segment = e.segment; opcode = e.opcode; op_size = e.op_size; addr_size = e.addr_size; disp_size = e.disp_size; imm_size = e.imm_size; modrm = e.modrm; sib = e.sib; disp = e.disp; sib_index = e.sib_index; sib_scale = e.sib_scale; sib_base = e.sib_base; if (e.op_count == 0) { op = null; return; } op = new Operand[e.op_count]; for (int i=0; i