如何陷入调试器并继续使用iOS硬件?

Luk*_*uke 6 iphone debugging assembly breakpoints ios

在Mac OS X和iOS模拟器(均为x86)中,我们可以使用int3内联汇编中的指令陷阱到调试器(LLDB).这很好,因为它陷阱到特定的代码行,但我们可以通过在调试器中按下continue来立即继续.

有没有办法在iOS硬件上执行此操作?

对于一个较旧的问题的回答提到了raise(SIGINT)我所能看到的(从检查中signal.h)并不存在.另一个答案提到trap汇编指令,它会导致构建错误("无法识别的指令助记符").同样无法识别的是ARM文档中提到BKPT汇编指令.

我已经尝试__builtin_trap()了几乎,几乎做了我想要的,但不允许我继续.除非我使用jump +1或者手动推进指令指针,否则我会继续按下它register write pc `$pc+8\`,这比仅仅按下继续操作要方便得多.

我正在为使用Xcode 7.3.1的32位和64位设备构建iOS 9.任何帮助表示赞赏!

Sig*_*uza 6

Apple 的 libcsignal.h包括 XNU 的sys/signal.h,它确实定义了 SIGINT(在所有平台上):

// [...]

#define SIGHUP  1   /* hangup */
#define SIGINT  2   /* interrupt */
#define SIGQUIT 3   /* quit */
// [...]
Run Code Online (Sandbox Code Playgroud)

因此,虽然我无法确认这种做法确实有效(由于我缺少 iOS 9 设备),但阻碍您前进的障碍实际上应该不是问题。

至于汇编指令,BKPT是一条有效的 ARM 指令,虽然仅适用于 A32。A64 变体称为BRK.
如果您正在构建胖二进制文件并无条件地使用其中任何一个,您将始终遇到编译器错误。

另请注意,这两条指令都需要一个立即值(传递给调试器)。省略该值也会产生编译器错误。

也就是说,您应该能够使用简单的命令插入 A32 和 A64 的调试指令#ifdef

#ifdef __aarch64__
asm volatile("BRK 0");
#else
asm volatile("BKPT 0");
#endif
Run Code Online (Sandbox Code Playgroud)

您可以替换0为您在0和之间选择的任何值255

关于TRAP指令的说明:虽然 Apple 的汇编程序似乎接受了 A32 的这条指令并将其翻译为0xe7ffdefe,但它会在 A64 上发出“无法识别的指令助记符”,类似于该BKPT指令。
我也无法在 ARM 信息中心或 Apple 文档中找到对说明的任何参考。