4859a2e07d2165fcaeb813910b518880
安全攻与防篇:调试与反调试上篇之 ptrace

1.debugserver

1.1 LLDB 调试原理

在日常的开发中,LLDB(工具篇:终端动态调试之LLDB) 是我们常用的调试工具。在 XCode 中,通过 LLDB 指令,我们可以查看和修改设备上运行程序的一些值或状态。那么这个过程是怎么实现的呢?下面我们来分析一下这个过程:

  • 第一步:在 Xcode 中,内置了 一个 LLDB 工具;
  • 第二步:Xcode 第一次在移动设备上运行的时候,将对应系统版本中的 debugserver(示例:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/10.3/DeveloperDiskImage.dmg 文件中的 /usr/bin/debugserver),安装到移动设备的 /Developer/usr/bin 目录下,如下图所示:
  • LLDB 将我们输入的每一条指令,发送给 debugserver;
  • debugserver 选择性的去调试某一个 App。
LeeGof-5C:~ root# cd /Developer/usr/bin/
LeeGof-5C:/Developer/usr/bin root# ./debugserver
debugserver-@(#)PROGRAM:debugserver  PROJECT:debugserver-360.0.26.3
 for armv7.
Usage:
  debugserver host:port [program-name program-arg1 program-arg2 ...]
  debugserver /path/file [program-name program-arg1 program-arg2 ...]
  debugserver host:port --attach=<pid>
  debugserver /path/file --attach=<pid>
  debugserver host:port --attach=<process_name>
  debugserver /path/file --attach=<process_name>

1.2 debugserver 相关指令

1.2.1 debugserver 连接 App 开启监听

debugserver *:端口号 -a 进程

【参数说明】:

  • *:端口号:表示使用设备的某个端口号提供服务;
  • -a 进程:表示根据进程 ID / 进程名称(Mach-O 文件的名称),连接指定的 App。

小示例

LeeGof-5C:/Developer/usr/bin root# ./debugserver *:3333 -a GofTweakDemo
debugserver-@(#)PROGRAM:debugserver  PROJECT:debugserver-360.0.26.3
 for armv7.
Attaching to process GofTweakDemo...
Listening to port 3333 for a connection from *...

上面的示例表示监听设备的 3333 端口,开启 GofTweakDemo 这个 App 的调试监听。

1.2.2 LLDB 连接 debugserver

直接在终端(或者 iTerm2)中,使用下面的指令,打开 LLDB:

 ~ > lldb

WIFI 方式连接

连接 1.2.1 中开启的 debugserver 监听:

// process connect connect://手机IP地址:debugserver服务的端口
(lldb) process connect connect://192.168.0.111:3333
Process 4634 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
    frame #0: 0x1d8f8900 libsystem_kernel.dylib`mach_msg_trap + 20
libsystem_kernel.dylib`mach_msg_trap:
->  0x1d8f8900 <+20>: pop    {r4, r5, r6, r8}
    0x1d8f8904 <+24>: bx     lr

libsystem_kernel.dylib`mach_msg_overwrite_trap:
    0x1d8f8908 <+0>:  mov    r12, sp
    0x1d8f890c <+4>:  push   {r4, r5, r6, r8}
Target 0: (GofTweakDemo) stopped.
(lldb) c
Process 4634 resuming

USB 方式连接

上面是使用 WIFI 的方式进行连接的,我们也可以通过 USB 进行连接。

  • 第一步:添加端口监听。直接修改我们之前的 GofUSBConnect 文件即可。
python /Users/GofLee/GofShell/python-client/tcprelay.py -t 22:2222 3333:3333
  • 第二步:设备上,开启 debugserver 监听。
./debugserver *:3333 -a GofTweakDemo
  • 第三步:LLDB 连接 debugserver。
~ > lldb
Stop hook #1 added.
(lldb) process connect connect://127.0.0.1:3333
Process 4634 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
    frame #0: 0x1d8f8900 libsystem_kernel.dylib`mach_msg_trap + 20
libsystem_kernel.dylib`mach_msg_trap:
->  0x1d8f8900 <+20>: pop    {r4, r5, r6, r8}
    0x1d8f8904 <+24>: bx     lr

libsystem_kernel.dylib`mach_msg_overwrite_trap:
    0x1d8f8908 <+0>:  mov    r12, sp
    0x1d8f890c <+4>:  push   {r4, r5, r6, r8}
Target 0: (GofTweakDemo) stopped.

接下来我们就可以使用 LLDB 的相关命令来调试 App 了。

报错处理

连接过程中,有可能会报一个错误,如下所示:

LeeGof-5C:~ root# /Developer/usr/bin/debugserver *:3333 -a WeChat
debugserver-@(#)PROGRAM:debugserver  PROJECT:debugserver-360.0.26.3
 for armv7.
Attaching to process WeChat...
error: failed to attach to process named: "" unable to start the exception thread
Exiting.

这是因为在 /Developer/usr/bin 中的 debugserver 只能调试自己 Xcode 安装的 App,我们需要做一些修改。

  • 第一步:创建一个 plist 文件,命名随意。
    ```




    com.apple.springboard.debugapplications

    run-unsigned-code
top Created with Sketch.