我正在研究一个 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
但它不会如我所愿更新反汇编视图。
当我尝试通过“右键单击”->“手动输入当前操作数”来手动完成时,它工作正常:/
任何建议如何做到这一点?
谢谢