在越狱 ios 13.3 设备上生成和调试二进制文件的问题
Problems with spawning and debugging a binary on jailbroken ios 13.3 device
我用 Xcode 和 运行 创建了一个 helloworld 应用程序。二进制文件安装在 /var/containers/Bundle/Application/123455-D134F-1234-3414-123123451/helloworld.app/helloworld
使用与 Cydia 一起安装的调试服务器,我可以附加到进程并调试它们,但前提是从主屏幕手动启动它们。
当我尝试生成程序并使用 lldb 对其进行调试时,发生了以下情况:lldb 成功附加,然后我发出“继续”,程序因 SIGABRT 而崩溃。
同样,我在尝试使用 frida-trace 生成它时遇到错误:
进程崩溃:SIGABRT。 ...错误制定崩溃报告:
优先要求符号化。
相反,如果我附加到 PID,Frida-trace 工作正常。
下面是输出:
root# debugserver localhost:1111 /var/containers/Bundle/Application/123455-D134F-1234-3414-123123451/helloworld.app/helloworld
debugserver-@(#)PROGRAM:LLDB PROJECT:lldb-10.0.0
for arm64.
Listening to port 1111 for a connection from localhost...
Got a connection, launched process /var/containers/Bundle/Application/123455-D134F-1234-3414-123123451/helloworld.app/helloworld (pid = 742).
$ lldb
(lldb) process connect connect://localhost:1111
Process 742 stopped
* thread #1, stop reason = signal SIGSTOP
...
Target 0: (helloworld) stopped.
(lldb) continue
Process 742 resuming
Process 742 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGABRT
frame #0: 0x00000001a81c1ec4 libsystem_kernel.dylib`__pthread_kill + 8
libsystem_kernel.dylib`__pthread_kill:
-> 0x1a81c1ec4 <+8>: b.lo 0x1a81c1ee0 ; <+36>
0x1a81c1ec8 <+12>: stp x29, x30, [sp, #-0x10]!
0x1a81c1ecc <+16>: mov x29, sp
0x1a81c1ed0 <+20>: bl 0x1a81a0f64 ; cerror_nocancel
Target 0: (helloworld) stopped.
(lldb)
$ a=/var/containers/Bundle/Application/123455-D134F-1234-3414-123123451/helloworld.app/helloworld
$ frida-trace -U -f $a | tee /tmp/aa
Spawning `/var/containers/Bundle/Application/123455-D134F-1234-3414-123123451/helloworld.app/helloworld`...
Instrumenting...
Started tracing 0 functions. Press Ctrl+C to stop.
Process crashed: SIGABRT
...
Thread 0 Crashed:
0 libsystem_kernel.dylib 0x00000001a81c1ec4 __pthread_kill + 8
...
Thread 11 name: com.apple.uikit.eventfetch-thread
Thread 11:
0 libsystem_kernel.dylib 0x00000001a81a0634 mach_msg_trap + 8
1 CoreFoundation 0x00000001a8348288 __CFRunLoopServiceMachPort + 216
2 CoreFoundation 0x00000001a83433a8 __CFRunLoopRun + 1444
3 CoreFoundation 0x00000001a8342adc CFRunLoopRunSpecific + 464
4 Foundation 0x00000001a8682784 -[NSRunLoop(NSRunLoop) runMode:beforeDate:] + 228
5 Foundation 0x00000001a8682664 -[NSRunLoop(NSRunLoop) runUntilDate:] + 88
6 UIKitCore 0x00000001ac4e8e80 -[UIEventFetcher threadMain] + 152
7 Foundation 0x00000001a87b309c __NSThread__start__ + 848
8 libsystem_pthread.dylib 0x00000001a80e5d8c _pthread_start + 156
9 libsystem_pthread.dylib 0x00000001a80e976c thread_start + 8
使用 Theos 的调整,在 %ctor { }
中添加睡眠(比如 15 秒)。
这样,当应用程序启动时,您有几秒钟的时间连接调试服务器、附加 lldb 和 interrupt
进程。然后就可以正常调试了
我发现ctor最多可以等待19秒,否则app会被kill掉
关于无法从调试服务器生成的原因,可能是因为 UI 应用程序无法 运行 从后台 IOS。
看,其实就是这个问题:launch gui through command line
在越狱设备上调试仍然需要您先打开应用程序。您可以安装各种调整以从命令行启动应用程序,但标准程序是正常启动应用程序,然后使用 ps -ax
列出 PID,找到应用程序的 PID,然后附加到它。
我用 Xcode 和 运行 创建了一个 helloworld 应用程序。二进制文件安装在 /var/containers/Bundle/Application/123455-D134F-1234-3414-123123451/helloworld.app/helloworld
使用与 Cydia 一起安装的调试服务器,我可以附加到进程并调试它们,但前提是从主屏幕手动启动它们。
当我尝试生成程序并使用 lldb 对其进行调试时,发生了以下情况:lldb 成功附加,然后我发出“继续”,程序因 SIGABRT 而崩溃。
同样,我在尝试使用 frida-trace 生成它时遇到错误: 进程崩溃:SIGABRT。 ...错误制定崩溃报告: 优先要求符号化。 相反,如果我附加到 PID,Frida-trace 工作正常。
下面是输出:
root# debugserver localhost:1111 /var/containers/Bundle/Application/123455-D134F-1234-3414-123123451/helloworld.app/helloworld
debugserver-@(#)PROGRAM:LLDB PROJECT:lldb-10.0.0
for arm64.
Listening to port 1111 for a connection from localhost...
Got a connection, launched process /var/containers/Bundle/Application/123455-D134F-1234-3414-123123451/helloworld.app/helloworld (pid = 742).
$ lldb
(lldb) process connect connect://localhost:1111
Process 742 stopped
* thread #1, stop reason = signal SIGSTOP
...
Target 0: (helloworld) stopped.
(lldb) continue
Process 742 resuming
Process 742 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGABRT
frame #0: 0x00000001a81c1ec4 libsystem_kernel.dylib`__pthread_kill + 8
libsystem_kernel.dylib`__pthread_kill:
-> 0x1a81c1ec4 <+8>: b.lo 0x1a81c1ee0 ; <+36>
0x1a81c1ec8 <+12>: stp x29, x30, [sp, #-0x10]!
0x1a81c1ecc <+16>: mov x29, sp
0x1a81c1ed0 <+20>: bl 0x1a81a0f64 ; cerror_nocancel
Target 0: (helloworld) stopped.
(lldb)
$ a=/var/containers/Bundle/Application/123455-D134F-1234-3414-123123451/helloworld.app/helloworld
$ frida-trace -U -f $a | tee /tmp/aa
Spawning `/var/containers/Bundle/Application/123455-D134F-1234-3414-123123451/helloworld.app/helloworld`...
Instrumenting...
Started tracing 0 functions. Press Ctrl+C to stop.
Process crashed: SIGABRT
...
Thread 0 Crashed:
0 libsystem_kernel.dylib 0x00000001a81c1ec4 __pthread_kill + 8
...
Thread 11 name: com.apple.uikit.eventfetch-thread
Thread 11:
0 libsystem_kernel.dylib 0x00000001a81a0634 mach_msg_trap + 8
1 CoreFoundation 0x00000001a8348288 __CFRunLoopServiceMachPort + 216
2 CoreFoundation 0x00000001a83433a8 __CFRunLoopRun + 1444
3 CoreFoundation 0x00000001a8342adc CFRunLoopRunSpecific + 464
4 Foundation 0x00000001a8682784 -[NSRunLoop(NSRunLoop) runMode:beforeDate:] + 228
5 Foundation 0x00000001a8682664 -[NSRunLoop(NSRunLoop) runUntilDate:] + 88
6 UIKitCore 0x00000001ac4e8e80 -[UIEventFetcher threadMain] + 152
7 Foundation 0x00000001a87b309c __NSThread__start__ + 848
8 libsystem_pthread.dylib 0x00000001a80e5d8c _pthread_start + 156
9 libsystem_pthread.dylib 0x00000001a80e976c thread_start + 8
使用 Theos 的调整,在 %ctor { }
中添加睡眠(比如 15 秒)。
这样,当应用程序启动时,您有几秒钟的时间连接调试服务器、附加 lldb 和 interrupt
进程。然后就可以正常调试了
我发现ctor最多可以等待19秒,否则app会被kill掉
关于无法从调试服务器生成的原因,可能是因为 UI 应用程序无法 运行 从后台 IOS。 看,其实就是这个问题:launch gui through command line
在越狱设备上调试仍然需要您先打开应用程序。您可以安装各种调整以从命令行启动应用程序,但标准程序是正常启动应用程序,然后使用 ps -ax
列出 PID,找到应用程序的 PID,然后附加到它。