Mach-O ARM64 使用文字值而不是帧指针 (BP) 寄存器

逆向工程 手臂 ios 男子气概
2021-07-02 11:20:10

我正在研究 IDA 中的 iOS 应用程序 Mach-O 二进制文件,并注意到它使用固定常量作为 SP 的偏移量来表示堆栈帧的开始而不是寄存器。这是正常的吗?ARM 已经拥有如此多的寄存器可供使用,这似乎是一种奇怪的优化。在这种情况下,说明是否更短,或者它的目的是什么?

1个回答

这不是真正的 RE 问题,但无论如何......

在 x86 上,使用专用 EBP 的优点是使用它的指令比使用 ESP 的指令要小。它还使编译器(或编写程序集时的人)更容易跟踪对堆栈帧的访问 - 使用 ESP 时,您总是需要补偿每个堆栈指针调整。

随着编译器开发的最新进展,其中许多原因并不真正适用,因此对专用帧指针寄存器的需求减少了,尤其是在像 ARM 这样的平台上,使用它比 SP 没有真正的优势。这就是说,帧指针(X29)仍在使用。您通常可以在函数序言中看到它被保存和从 SP 复制,即使它实际上并没有在函数体中被引用。这样做是为了有一个适当的堆栈帧链,由每个函数中的帧指针链接。这在出现异常时简化了调试和堆栈展开。有时它在函数内明确地使用,例如当在堆栈指针的变量调整由于alloca或可变长度数组。在这种情况下,编译器必须使用 FP 或另一个寄存器来寻址帧固定部分中的变量,因为 SP 偏移量不再是已知的。