如何使用IDA SDK在mov rax,[rax + rcx * 8]等指令中获取寄存器?

时间:2019-05-02 14:14:53

标签: c++ plugins disassembly ida

我正在使用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来找出指令使用的确切寄存器。

0 个答案:

没有答案