Я пишу плагин 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
, кроме простого разбора дизассемблированногострока инструкции сама.