将寄存器设置为特定值以用于 IDA Pro 6.9 中的自动分析

逆向工程 艾达 登记 指针 电源
2021-07-11 17:03:34

我正在使用 IDA Pro 6.9 和一些 PowerPC 反汇编。代码设置r13一个值,比如 0x10000,然后偏移该寄存器以在该区域加载和存储内存。r13不会在代码中再次修改,它仅用于通过偏移加载/存储数据。

e_stb     r7, -0x56E2(r13)

我希望有一种方法可以告诉 IDA r13 的值,以便它自动生成对正确内存位置的引用,以便我得到类似的信息:

e_stb     r7, -0x56E2(r13) # Named_Location

以及当我用鼠标悬停时该位置的值。

更新:
Igor Skochinsky 给出了正确答案,但没有解决我的具体问题。

答案似乎在添加指令中使用 r13 的任何地方都有效,e_add16i r31, r13, -0x2DF2 # unk_4000ADE2但不适用于直接相对加载/存储指令,e_stb r3, -0x2E08(r13)(无变量名称,红色偏移)。

这可能是 IDA 中的一个错误。

2个回答

只需在处理器选项中设置即可。

在此处输入图片说明

关于 IDA 中的潜在错误:

首先,你可以自己添加引用idaapi.add_crefidaapi.add_drefIDAPython的API。这可以使用相对简单的脚本来完成,如下所示:

import idaapi
import idautils
import idc

predefined_r13 = YOUR_R13_VALUE

for h in idautils.Heads():
    dis = idc.GetDisasm(h) #probably there is another way to do it and parsing textual assembly is not the best option
    pos = dis.find ("(r13)")
    if pos != -1: #we have your register here
          splitted = dis[:pos].split() 
          lastarg = splitted[-1]
          lastarg_numeric = int(lastarg, 16)
          addr = predefined_r13 + lastarg_numeric
          idaapi.add_dref(h, addr, idc.dr_O)

当然这个脚本应该扩展一下:r13的表达式可能更复杂,数据引用的类型可能不同,可能根本就是代码引用,写的时候已经解决了部分情况的问题在@Igor Skochinsky 的回答中,但总体思路很好地说明了。

另外(如果你想覆盖反汇编器的工作)你可以像@Rolf Rolles 在这篇文章中所做的那样安装你自己的反汇编器模块钩子,这将重新计算所有这些东西(你需要覆盖idaapi.IDP_Hooks.custom_emu),但添加数据引用可能是更简单的方法来实现你的目标。