Как получить регистры в инструкциях, таких как mov rax, [rax + rcx * 8] с IDA SDK? - PullRequest
0 голосов
/ 02 мая 2019

Я пишу плагин IDA Pro с использованием c ++, где мне нужно декодировать определенные инструкции и выяснить регистры, к которым обращается инструкция.У меня возникают проблемы с операндами с формой, подобной [rax+rcx*8], поскольку SDA IDA, кажется, не предоставляет информацию о них в классе 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, кроме простого разбора дизассемблированногострока инструкции сама.

...