我正在使用IDA pro 6.95(付费版)重新发行一些PowerPC代码。 PowerPC通常使用r1作为堆栈指针,因此IDA从r1构建堆栈帧和局部变量。参数在r3r4r5等中传递。我遇到的问题是,我看到了这个问题:
.text: foo:
.text:.set back_chain, -0x30                     // Stack frame
.text: .set var_4, -4
.text: .set sender_lr,  4
<<<function preamble snipped>>>
.text:               mr        r31, r1        // Copy stack pointer to r31
.text:               stw       r3, 8(r31)     // All local variables are relative
.text:               stw       r4, 0xC(r31)   //  to r31, instead of r1, so IDA
                                              //  doesn't recognize them.


我想要的是全部转换,例如8(r31)函数中的局部变量引用了正常的var_8(r31)语法。我不想手动更改每个参考。有没有办法:


说服IDA r31是堆栈指针?
通过一个命令将所有8(31)更改为var_8(r31)
否则获得效果正在以我从未想到的方式寻找?


评论

旧的PPC ELF规范(refspecs.linuxbase.org/elf/elfspec_ppc.pdf)将r31定义为“用于局部变量或“环境指针””,所以也许这就是您在代码中看到的内容。因此,可能有助于指定您要分析的代码在哪个平台上运行。

@MichaelEngel不是OP,但我也在使用CodeWarrior编译的可执行文件的main()函数中看到了这一点。它的功能与OP的功能相同:将SP复制到r31,并将r31用作其余功能中的SP。

#1 楼

免责声明:我不会在此处创建工作代码示例,并且也没有出于特定目的在PowerPC上对其进行测试。 YMMV

我可以想到两种方法。首先将是手动方法,方法是使用一些IDAPython技巧将基于r31的所有偏移量强制设置为堆栈帧结构。第二个(可能使用的那个)就是为此使用指定的API。

您需要:


获取隐藏的堆栈框架结构您正在运行的函数的ID
通过使用所需函数内的任何地址调用ida_frame.get_frame函数,可以轻松完成此操作。此函数返回一个ID,用于在IDB中标识此结构。
逐条指令进行遍历,并标识所有对r31的取消引用。从获取反汇编字符串和解析实际文本到特定于操作数的API等。因此,我将这留给读者作为第一练习。如果您需要随时创建新的堆栈变量,那么它也有多个功能。

第二种方法是使用为此目的而设计的两个API之一。这两个API分别称为OffOpExidc.define_local_var

ida_frame.add_regvar的定义如下:结构并根据需要定义新成员。这可能是您要玩的第一件事,但是您仍然需要遍历所有指令并手动识别define_local_var偏移量。 r31指令创建的变量。您可以在此处了解更多信息

#2 楼

我遇到了类似的问题,发现了以下解决方法:


创建特定的结构,其字段偏移等于您的r31偏移
对每个有趣的地方使用“结构偏移(T)”说明。