typedef struct _x86im_instr_object // x86 decoded/generated instruction: { unsigned long mode; // mode: 32/64bits unsigned long flags; // instr flags unsigned long id; // instr id unsigned long grp; // instr grp & subgrp unsigned long mnm; // instr mnemonic unsigned long len; // total instr length unsigned char def_opsz; // default operand size: 1/2/4/8 unsigned char def_adsz; // default address size: 16bit = 2 | 32bit = 4 | 64bit = 8 unsigned char opcode[3]; // instr opcodes: up to 3 unsigned char opcode_count; // instr opcode count unsigned short prefix; // instr prefixes ( mask ) unsigned char prefix_values[4]; // prefixes unsigned char prefix_count; // instr prefix count unsigned long prefix_order; // instr prefix order unsigned char rexp; // REX prefix unsigned char somimp; // mandatory prefix: SOMI instr only: 0x66|0xF2|0xF3 unsigned char n3did; // 3dnow instr id unsigned char seg; // implicit segment register used by mem operands: unsigned char w_bit; // wide bit value: 0/1 - if IF_WBIT unsigned char s_bit; // sign-extend bit value: 0/1 - if IF_SBIT unsigned char d_bit; // direction bit value: 0/1 - if IF_DBIT unsigned char gg_fld; // granularity field value: 0-2 ( mmx ) - if IF_GGFLD unsigned char tttn_fld; // condition test field value: if IF_TTTN unsigned short selector; // explicit segment selector used by CALL/JMP far: IF_SEL unsigned long imm_size; // imm size: 0 | (1/2/4/8) unsigned long long imm; // imm value: 64bit max value ( if imm_size != 0 ) unsigned long disp_size; // disp size: 0 | (1/2/4/8) unsigned long long disp; // disp value: 64bit max value ( if disp_size != 0 ) unsigned char mem_flags; // mem flags: src/dst/.. unsigned short mem_am; // addressing mode unsigned short mem_size; // operand size ( xxx ptr ) unsigned char mem_base; // base reg : grp+id unsigned char mem_index; // index reg: grp+id unsigned char mem_scale; // scale reg: grp+id unsigned char modrm; // modrm byte value & fields: if IF_MODRM unsigned char sib; // sib byte value & fields: if IF_SIB unsigned long rop[4]; // imp/exp reg op array unsigned char rop_count; // imp/exp reg op count unsigned int status; void *data; } x86im_instr_object;
int __stdcall x86im_dec( __inout x86im_instr_object *io, __in unsigned long mode, __in unsigned char *data )
x86im_instr_object io; char *d = "\x58"; /* POP EAX, OPCODE */ x86im_dec( &io, X86IM_IO_MODE_32BIT, d );
int __stdcall x86im_gen( __inout x86im_instr_object *io, __in unsigned long options, __in unsigned long code, __in unsigned long reg, __in unsigned long mem, __in unsigned long long disp, __in unsigned long long imm )
x86im_instr_object io; x86im_gen( &io, X86IM_IO_MODE_32BIT|X86IM_GEN_OAT_NPO_D, X86IM_GEN_CODE_POP_RG1, X86IM_IO_ROP_ID_EAX, 0, 0, 0 );
int __stdcall x86im_enc( __inout x86im_instr_object *io, __out unsigned char *data )
x86im_instr_object io; char data[1]; x86im_enc( &io, data );
There are 31,322 total registered users.
[+] expand