debugserver是运行在ios上,作为服务端,实际上执行LLDB(作为客户端)传过来的没命令,再把执行结果反馈给LLDB,显示给用户,即所谓的”远程调试”。在默认情况下,ios上并没有安装debugserver。需要设备连接Xcode,在
window-->Devices
菜单中增加此设备后,debugserver才会被Xcode安装到IOS设备的/Developer/usr/bin/
目录下。注意:由于缺少task_for_pid权限,通过Xcode安装的debugserver只能调试自己的APP。为了逆向,我们需要对debugserver进行相关配置,使我们可以调试别人的APP
配置
在配置前,我们需要看一下各设备对应的ARM的类型
Name | ARM |
---|---|
iPhone 4s | armv7 |
iPhone 5 | armv7s |
iPhone 5c | armv7s |
iPhone 5s | arm64 |
iPhone 6 plus | arm64 |
iPhone 6 | arm64 |
iPad 2 | armv7 |
iPad mini | armv7 |
The New iPad | armv7 |
iPad with Retina display | armv7s |
iPad Air | arm64 |
iPad Air 2 | arm64 |
iPad mini with Retina display | arm64 |
iPad mini 3 | arm64 |
iPad touch 5 | armv7 |
将未经处理的debugserver从IOS拷贝到OSX中/Users/snkeninny
目录下。
~ snakeninny$ scp root@iOSIO:/Developer/usr/bin/debugserver ~/debugserver
然后帮它瘦身,命令如下:
~ snkeninny$ lipo -thin armv7s ~/debugserver -output ~/debugserver
注意:这里的armv7s换成你设备对用的ARM
给debugserver增加task_id_pid权限
- 方案一
下载ent.xml到OSX的/Users/snkeninny/
目录,然后运行如下命令:
~ snakeninny$ /opt/theos/bin/ldid -Sent.xml debugserver
注意:"-S"
选项与"ent.xml"
之间没有空格。
- 方案二
下载ent.plist 到/Users/snakeninny/
,然后运行如下命令:
~ snakeninny$ codesign -s - --entitlements ent.plist -f debugserver
将处理过的debugserver拷贝回ios
将经过处理的debugserver 拷贝回ios,并增加执行权限,命令如下:
~ snakeninny$ scp ~/debugserver root@iOSIP:/usr/bin/debugserver
~ snakeninny$ ssh root@iOSIP
~ root# chmod +x /usr/bin/debugserver
这里之所以把处理过得debugserver存放到ios版的/usr/bin/
下而没有覆盖/Developer/usr/bin/
下的原版debugserver,一是因为原版debugserver是不可写的,无法覆盖,二是因为在/usr/bin/
下无需输入全路径就可以执行。
用debugserver启动或附加进程
debugserver最常见的2中场景,就是启动和附加进程,它的命令都很简单,分别为:
debugserver -x backboard IP:port /path/to/executable
debugserver会启动executable,并开启port端口,等待来自IP的LLDB接入。
debugserver IP:port -a "ProcessName"
debugserver会附加ProcessName,并开启port端口,等待来自IP的LLDB接入。
例如:
debugserver -x backboard *:1234 /Applications/MobileSMS.app/MobileSMS
上面的命令行会启动mobileSMS,并开启1234端口,等待任意IP地址的LLDB接入。