Изменение инструкций с помощью ida API

Я хочу изменить значение Op инструкции, используя idautils и/или idaapi. Например, я загрузил в память бинарный файл и хочу изменить адрес JMP оператора JMP (я знаю, где переход, и могу получить оператор). Я пытался сделать что-то вроде этого:

i = ida.idautils.DecodeInstruction(addr)
op = i.Op1
op.addr = new_addr
i.Op1.assign(op)
print i.Op1.addr

Но адрес не меняется. Вместо этого, если я сделаю:

i = ida.idautils.DecodeInstruction(addr)
op = idaapi.op_t()
op.addr = new_addr
i.Op1.assign(op)
print i.Op1.addr

Это работает, но когда я смотрю на байты (используя [idaapi.get_bytes(addr+i) for i in range(0, i.size)]), они не меняются. Я бы хотел изменить этот адрес и увидеть это изменение также при чтении байтов.


person badnack    schedule 14.10.2013    source источник


Ответы (1)


Попробуйте использовать PatchByte (или idaapi.patch_byte). Затем вы должны увидеть правильное значение с idaapi.get_byte. Существуют эквивалентные функции исправления для слов, двойных слов и даже буферов переменной длины.

(Обратите внимание, что для этого требуется знать точную байтовую кодировку инструкции, которую вы хотите изменить)

person user1354557    schedule 22.10.2013