0x00 背景
最近在做iOS程序的debug,将步骤记录一下。部分参考此文一步一步用debugserver + lldb代替gdb进行动态调试。
0x01 各种安装
debugserver运行在iOS上,顾名思义,它作为服务端,实际执行LLDB(作为客户端)传过来的命令,再把执行结果反馈给LLDB,显示给用户,即所谓的“远程调试”。在默认情况下,iOS上并没有安装debugserver,
-
将iPhone用USB链接到Mac上,打开Xcode,在Window→Devices菜单中点击此设备,等一段时间,当该设备完全被添加上后,你会在iPhone的
/Developer/usr/bin/
目录下发现debugserver被安装上了。 -
帮debugserver减肥,将iPhone的
/Developer/usr/bin/debugserver
用scp拷贝到Mac上,在Mac上执行如下命令:lipo -thin armv7 ./debugserver -output ./debugserver
如果是iPhone5,cpu架构师armv7,iPhone5s及以上用arm64。
-
下载ent.xml至同一目录内,执行:
ldid -Sent.xml ./debugserver
给debugserver签名。
- scp拷贝debugserver回iPhone,最好拷到
/usr/bin
下。
0x02 开始debug
-
在iPhone上使用
ps -aux | grep AppName
来找到App的进程号pid -
在iPhone上启动debugserver,attach上进程
debugserver *:9090 -a pid
-
在Mac上输入lldb,进入lldb,然后输入
- platform select remote-ios
- 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会被触发。