概述
debugserver、lldb是协同工作的,debugserver依附在APP上,时刻监听APP的运行状态,并有控制APP执行的能力;lldb是在APP外部的,可以和debugserver建立连接,通过debugserver获取APP运行状态,并且能通知debugserver对APP做一些事情。在真机调试的时候,Xcode将debugserver加入到APP中,通过lldb来调试APP,那么同样也可以在iterm上对越狱手机上的任意APP进行调试。
LLDB的功能可以概括为以下四点:
- 在指定的条件下启动程序;
- 在指定的条件下停止程序;
- 在程序停止的时候检查程序内部发生的事;
- 在程序停止的时候对程序进行改动,观察程序的执行过程有什么变化。
debugserver 简介
debugserver
运行在iOS上,顾名思义,它作为服务端,实际执行LLDB
(作为客户端)传过来的命令,再把执行结果反馈给LLDB
,显示给用户,即所谓的“远程调试”。在默认情况下,iOS上并没有安装 debugserver
,只有在设备连接过一次Xcode,并在 Window→Devices菜单中添加此设备后,debugserver
才会被Xcode安装到iOS的“/Developer/usr/bin/”目录下。
但是,因为缺少task_for_pid
权限,通过Xcode安装的debugserver
只能调试我们自己的App。
可以自己配置debugserver,也可以直接在 Cydia
上直接安装debugserver使用。
配置 debugserver
1、帮 debugserver 瘦身
将未经处理的debugserver从iOS拷贝到OSX中 的“~/Desktop/iPhoneResource/”目录下,命令如下:
scp -P 2222 root@localhost:/Developer/usr/bin/debugserver ~/Desktop/iPhoneResource/
<font color="red">
注意:
不要使用 iFunBox 拷贝到电脑上,IFunBox 拷贝后的不是 Mach-O
格式,是 data
格式,无法进行减肥操作。
</font>
查看设备对应的架构,我使用的是iphone 7
,架构是 arm64
的;
真机(iOS设备)架构如下:
armv6: iPhone、iPhone 2、iPhone 3G、iPod Touch(第一代)、iPod Touch(第二代)
armv7: iPhone 3Gs、iPhone 4、iPhone 4s、iPad、iPad 2
armv7s: iPhone 5、iPhone 5c (静态库只要支持了armv7,就可以在armv7s的架构上运行)
arm64(注:无armv64): iPhone 5s、iPhone 6、iPhone 6 Plus、iPhone 6s、iPhone 6s Plus、iPad Air、iPad Air2、iPad mini2、iPad mini3
然后帮它减肥,进入~/Desktop/iPhoneResource/
文件夹下,然后创建debugserver
文件夹,再次进入debugserver
文件夹下,创建arm64
文件夹,然后进行减肥,命令如下:
# 减肥
lipo -thin arm64 debugserver -output ./arm64/debugserver
注意把这里的“arm64”换成你的设备所对应的 ARM。
2、给 debugserver
添加 task_for_pid
权限
在~/Desktop/iPhoneResource/arm64
目录下创建一个 en.pist
文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.springboard.debugapplications</key>
<true/>
<key>run-unsigned-code</key>
<true/>
<key>get-task-allow</key>
<true/>
<key>task_for_pid-allow</key>
<true/>
</dict>
</plist>
然后再当前目录下进行运行如下命令:
codesign -s - --entitlements en.plist -f debugserver
3、将处理过得debugserver
拷贝回iOS
将经过处理的debugserver拷回iOS,并添加执行
权限,命令如下:
scp -P 2222 debugserver root@localhost:/usr/bin/
这里之所以把处理过的debugserver
存放在iOS 的/usr/bin/
下,而没有覆盖/Developer/usr/bin/
下的原版debugserver
,一是因为原版debugserver
是不可写的,无法覆盖;二是因为/usr/bin/
下的命令无须输入全路径就可以执行,即在任意目录下运 行debugserver
都可启动处理过的debugserver
。
4、用debugserver
启动或附加进程
debugserver最常用的2种场景,就是启动和附加进程,它们的命令都很简单,分别是:
debugserver -x backboard IP:port /path/to/executable
debugserver
会启动 executable
,并开启port
端口,等待来自IP
的LLDB
接入。
debugserver IP:port -a "ProcessName"
例如:
tsukasawatarukoutekiiPhone:~ root# debugserver -x backboard *:12345 /Applications/MobileSMS.app/MobileSMS
debugserver-@(#)PROGRAM:LLDB PROJECT:lldb-1205.2.13
for arm64.
Listening to port 12345 for a connection from *...
上面代码会启动MobileSMS
,并开启12345
的端口,来等待任意IP地址的LLDB
接入。而:
tsukasawatarukoutekiiPhone:~ root# debugserver *:12345 -a "MobileSMS"
debugserver-@(#)PROGRAM:LLDB PROJECT:lldb-1205.2.13
for arm64.
Attaching to process MobileSMS...
Listening to port 12345 for a connection from *...
会附加到MobileSMS
上,并开启12345
端口来等待来自任意IP地址的LLDB
接入。
5、LLDB
的使用说明
使用方式
1、越狱手机启动 <font color="red">debugserver</font> 服务
debugserver ip:port –a appName ip
对应的手机ip直接使用*,port为对外开放的端口号(可以自定义)app为要附加的应用名称。
将debugserver
附加到微信进程上:
debugserver localhost:12345 –a WeChat
或者
debugserver *:12345 –a WeChat
网友评论