iOS程序动态debug方法

0x00 背景

最近在做iOS程序的debug,将步骤记录一下。部分参考此文一步一步用debugserver + lldb代替gdb进行动态调试

0x01 各种安装

debugserver运行在iOS上,顾名思义,它作为服务端,实际执行LLDB(作为客户端)传过来的命令,再把执行结果反馈给LLDB,显示给用户,即所谓的“远程调试”。在默认情况下,iOS上并没有安装debugserver,

  1. 将iPhone用USB链接到Mac上,打开Xcode,在Window→Devices菜单中点击此设备,等一段时间,当该设备完全被添加上后,你会在iPhone的/Developer/usr/bin/目录下发现debugserver被安装上了。

  2. 帮debugserver减肥,将iPhone的/Developer/usr/bin/debugserver用scp拷贝到Mac上,在Mac上执行如下命令:

    lipo -thin armv7 ./debugserver -output ./debugserver

如果是iPhone5,cpu架构师armv7,iPhone5s及以上用arm64。

  1. 下载ent.xml至同一目录内,执行:

    ldid -Sent.xml ./debugserver

给debugserver签名。

  1. scp拷贝debugserver回iPhone,最好拷到/usr/bin下。

0x02 开始debug

  1. 在iPhone上使用ps -aux | grep AppName来找到App的进程号pid

  2. 在iPhone上启动debugserver,attach上进程

    debugserver *:9090 -a pid
  3. 在Mac上输入lldb,进入lldb,然后输入

    1. platform select remote-ios
    2. process connect connect://192.168.2.2:9090

    将ip替换为你iPhone的ip。

0x03 lldb使用方法

查询App基址

image list -o -f

然后翻到最上面一条,第一列即为基址,注意最后括号中的地址并不是基址。

根据地址设置断点

breakpoint set -a 0xffffff

显示地址处的指令

disassemble --start-address 0xffffff --count 20

寄存器与内存操作

register read x0
memory read $x0
memory write $x0 0x01
memory write $x0+1 0x00

watchpoint

watchpoint set expression -w read -- 0x100000d84

在x64上测试,可以在代码段设置read watchpoint,当代码段被读时(比如代码的完整性检测)这个watchpoint会被触发。