IDApython - 将修改后的操作数转换为字符串引用

逆向工程 蟒蛇 手臂 自动化
2021-06-21 18:54:14

我正在研究一个 IDAPython 脚本,它应该通过解析它的符号表来修复固件的反汇编。

脚本的核心工作正常,但在编辑 IDA 在反汇编面板中显示内容的方式时,我遇到了一些问题。

想法如下:

我有一个原始指令,如:

LDR          R1,=0xAAAAAAAA

在我的脚本执行后,偏移量 0xAAAAAAAA 被解析为它的当前值,比如 0xBBBBBBBB,它在原始指令旁边添加了一条注释:

LDR          R1,=0xAAAAAAAA ; symbol_address=0xBBBBBBBB, symbol_value='DummyString'

但是因为我只是添加了一条评论,所以我正在丢失与字符串之间的外部参照。

我想要实现的是编辑指令本身,因此 IDA 可以创建字符串的外部参照。就像是:

LDR          R1,=aDummyString 

我使用这个片段来编辑操作数地址,它正在工作:

create_strlit(resolved_addr, 0, STRTYPE_C) # Defined the resolved string's addr as a proper string
new_inst = original_ins.replace(hex(original_addr), hex(resolved_addr))  # Simplified for clarity
set_manual_insn(addr, new_inst)            # Edit the instruction with the new resolved addr

但是我的反汇编视图并没有在地址和字符串本身之间建立链接。

LDR          R1,=0xBBBBBBBB

当我将光标悬停在 0xBBBBBBBB 上时,我可以看到正确的字符串;当我点击这个地址时,IDA 会把我带到字符串的位置。但它没有创建任何适当的外部参照,并且显示不会通知我这是一个字符串位置。

我尝试了这些函数将操作数转换为字符串引用,但没有成功:

op_plain_offset(addr, 1, 0)
op_offset(addr, 1, REF_OFF32)    # I also tried REF_OFF8 and REF_OFF16, just in case

但它不会如我所愿更新反汇编视图。

当我尝试通过“右键单击”->“手动输入当前操作数”来手动完成时,它工作正常:/

任何建议如何做到这一点?

谢谢

1个回答

好吧,我设法用 add_dref() 函数做到了:

add_dref(frm, to, type)
 
Create a data cross-reference.

Parameters:

    to - linear address of referenced data (C++: ea_t)
    type - cross-reference type (C++: dref_t)

Returns: bool
    success (may fail if user-defined xref exists from->to) 

所以我可以为每个解析的符号调用它:

add_dref(instruction_addr, resolved_symbol_address, 1)