我正在使用c ++编写一个IDA Pro插件,在这里我需要解码某些指令并找出该指令访问的寄存器。我在使用[rax+rcx*8]
这样的形式的操作数时遇到了麻烦,因为IDA SDK似乎没有在op_t
类中提供有关它们的信息,但是该类应该保存有关指令操作数的所有数据。查看下面的代码,了解我的意思。
const auto ea = get_screen_ea();
qstring line;
generate_disasm_line(&line, ea, GENDSM_REMOVE_TAGS);
msg("%s\n", line.c_str());
insn_t ins;
decode_insn(&ins, ea);
for (int i = 0; i < UA_MAXOP; i++)
{
const op_t &op = ins.ops[i];
if (op.type == o_void)
break;
msg("op %u, type = %u, reg = %u, value = %u, addr = %a, dtype = %u\n",
op.n, op.type, op.reg, op.value, op.addr, op.dtype);
}
上面的代码在当前光标位置反汇编指令,并输出有关其操作数的信息。当我在指令mov rax, [rax+rcx*8]
和mov rax, [rdx+rax]
上运行它时,我得到:
mov rax, [rax+rcx*8]
op 0, type = 1, reg = 0, value = 0, addr = 0, dtype = 7
op 1, type = 3, reg = 4, value = 0, addr = 0, dtype = 7
mov rax, [rdx+rax]
op 0, type = 1, reg = 0, value = 0, addr = 0, dtype = 7
op 1, type = 3, reg = 4, value = 0, addr = 0, dtype = 7
请注意,对于类型3(o_phrase
)操作数,对于reg
之类的操作数,4
的值始终为[reg A + reg B]
,我无法区分它们
除了想自己解析反汇编的指令串之外,我想知道是否有一种方法可以使用decode_insn
来找出指令使用的确切寄存器。