166 lines
3.8 KiB
Java
166 lines
3.8 KiB
Java
// Capstone Java binding
|
|
// By Nguyen Anh Quynh & Dang Hoang Vu, 2013
|
|
|
|
package capstone;
|
|
|
|
import com.sun.jna.Structure;
|
|
import com.sun.jna.Union;
|
|
|
|
import java.util.List;
|
|
import java.util.Arrays;
|
|
|
|
import static capstone.X86_const.*;
|
|
|
|
public class X86 {
|
|
|
|
public static class MemType extends Structure {
|
|
public int segment;
|
|
public int base;
|
|
public int index;
|
|
public int scale;
|
|
public long disp;
|
|
|
|
@Override
|
|
public List getFieldOrder() {
|
|
return Arrays.asList("segment", "base", "index", "scale", "disp");
|
|
}
|
|
}
|
|
|
|
public static class Encoding extends Structure {
|
|
public byte modrmOffset;
|
|
public byte dispOffset;
|
|
public byte dispSize;
|
|
public byte immOffset;
|
|
public byte immSize;
|
|
|
|
@Override
|
|
public List getFieldOrder() {
|
|
return Arrays.asList("modrmOffset", "dispOffset", "dispSize", "immOffset", "immSize");
|
|
}
|
|
}
|
|
|
|
public static class OpValue extends Union {
|
|
public int reg;
|
|
public long imm;
|
|
public MemType mem;
|
|
|
|
@Override
|
|
public List getFieldOrder() {
|
|
return Arrays.asList("reg", "imm", "mem");
|
|
}
|
|
}
|
|
|
|
public static class Operand extends Structure {
|
|
public int type;
|
|
public OpValue value;
|
|
public byte size;
|
|
public byte access;
|
|
public int avx_bcast;
|
|
public boolean avx_zero_opmask;
|
|
|
|
public void read() {
|
|
super.read();
|
|
if (type == X86_OP_MEM)
|
|
value.setType(MemType.class);
|
|
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", "size", "access", "avx_bcast", "avx_zero_opmask");
|
|
}
|
|
}
|
|
|
|
public static class UnionOpInfo extends Capstone.UnionOpInfo {
|
|
public byte [] prefix;
|
|
public byte [] opcode;
|
|
public byte rex;
|
|
public byte addr_size;
|
|
public byte modrm;
|
|
public byte sib;
|
|
public long disp;
|
|
public int sib_index;
|
|
public byte sib_scale;
|
|
public int sib_base;
|
|
public int xop_cc;
|
|
public int sse_cc;
|
|
public int avx_cc;
|
|
public byte avx_sae;
|
|
public int avx_rm;
|
|
public long eflags;
|
|
|
|
public byte op_count;
|
|
|
|
public Operand [] op;
|
|
|
|
public Encoding encoding;
|
|
|
|
public UnionOpInfo() {
|
|
op = new Operand[8];
|
|
opcode = new byte[4];
|
|
prefix = new byte[4];
|
|
}
|
|
|
|
@Override
|
|
public List getFieldOrder() {
|
|
return Arrays.asList("prefix", "opcode", "rex", "addr_size",
|
|
"modrm", "sib", "disp", "sib_index", "sib_scale", "sib_base", "xop_cc", "sse_cc", "avx_cc", "avx_sae", "avx_rm", "eflags", "op_count", "op", "encoding");
|
|
}
|
|
}
|
|
|
|
public static class OpInfo extends Capstone.OpInfo {
|
|
public byte [] prefix;
|
|
public byte [] opcode;
|
|
public byte opSize;
|
|
public byte rex;
|
|
public byte addrSize;
|
|
public byte dispSize;
|
|
public byte immSize;
|
|
public byte modrm;
|
|
public byte sib;
|
|
public long disp;
|
|
public int sibIndex;
|
|
public byte sibScale;
|
|
public int sibBase;
|
|
public int xopCC;
|
|
public int sseCC;
|
|
public int avxCC;
|
|
public boolean avxSae;
|
|
public int avxRm;
|
|
public long eflags;
|
|
|
|
public Operand[] op;
|
|
|
|
public Encoding encoding;
|
|
|
|
public OpInfo(UnionOpInfo e) {
|
|
prefix = e.prefix;
|
|
opcode = e.opcode;
|
|
rex = e.rex;
|
|
addrSize = e.addr_size;
|
|
modrm = e.modrm;
|
|
sib = e.sib;
|
|
disp = e.disp;
|
|
sibIndex = e.sib_index;
|
|
sibScale = e.sib_scale;
|
|
sibBase = e.sib_base;
|
|
xopCC = e.xop_cc;
|
|
sseCC = e.sse_cc;
|
|
avxCC = e.avx_cc;
|
|
avxSae = e.avx_sae > 0;
|
|
avxRm = e.avx_rm;
|
|
eflags = e.eflags;
|
|
op = new Operand[e.op_count];
|
|
for (int i=0; i<e.op_count; i++)
|
|
op[i] = e.op[i];
|
|
encoding = e.encoding;
|
|
}
|
|
}
|
|
}
|