r1
作为堆栈指针,因此IDA从r1
构建堆栈帧和局部变量。参数在r3
,r4
,r5
等中传递。我遇到的问题是,我看到了这个问题: .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)
?否则获得效果正在以我从未想到的方式寻找?
#1 楼
免责声明:我不会在此处创建工作代码示例,并且也没有出于特定目的在PowerPC上对其进行测试。 YMMV我可以想到两种方法。首先将是手动方法,方法是使用一些IDAPython技巧将基于
r31
的所有偏移量强制设置为堆栈帧结构。第二个(可能使用的那个)就是为此使用指定的API。您需要:
获取隐藏的堆栈框架结构您正在运行的函数的ID
通过使用所需函数内的任何地址调用
ida_frame.get_frame
函数,可以轻松完成此操作。此函数返回一个ID,用于在IDB中标识此结构。逐条指令进行遍历,并标识所有对
r31
的取消引用。从获取反汇编字符串和解析实际文本到特定于操作数的API等。因此,我将这留给读者作为第一练习。如果您需要随时创建新的堆栈变量,那么它也有多个功能。第二种方法是使用为此目的而设计的两个API之一。这两个API分别称为
OffOpEx
和idc.define_local_var
。ida_frame.add_regvar
的定义如下:结构并根据需要定义新成员。这可能是您要玩的第一件事,但是您仍然需要遍历所有指令并手动识别define_local_var
偏移量。 r31
指令创建的变量。您可以在此处了解更多信息#2 楼
我遇到了类似的问题,发现了以下解决方法:创建特定的结构,其字段偏移等于您的
r31
偏移对每个有趣的地方使用“结构偏移(T)”说明。
评论
旧的PPC ELF规范(refspecs.linuxbase.org/elf/elfspec_ppc.pdf)将r31定义为“用于局部变量或“环境指针””,所以也许这就是您在代码中看到的内容。因此,可能有助于指定您要分析的代码在哪个平台上运行。@MichaelEngel不是OP,但我也在使用CodeWarrior编译的可执行文件的main()函数中看到了这一点。它的功能与OP的功能相同:将SP复制到r31,并将r31用作其余功能中的SP。