在 iOS 设备上调试应用程序,需要使用 debugserver
+ lldb
的方式,配置方法可以参考文章 一步一步用debugserver + lldb代替gdb进行动态调试,这里不赘述。
使用 debugserver
+ lldb
调试固然不错,但有一个小问题,那就是操作较为麻烦。虽然已经有一些插件简化了调试步骤,如:SpringBoard tweak 双击图标启动debugserver,但终归是使用终端命令行来调试,对于用惯了Xcode
的人来说很不友好,毕竟Xcode
除了操作简单以外,还提供了许多实用的辅助功能,如:视图层级查看,内存跟踪等。
在 macOS 上,Xcode 可以直接使用 root 权限调试进程(可能需要关闭SIP),但在 iOS 上不支持。
能不能通过某种方式,让 Xcode 也支持在 iOS 设备上使用 root 权限调试应用或者进程呢?
在 iOS 上使用 Xcode 调试程序时,会先使用mobile
用户启动/Developer/usr/bin/debugserver
,然后再使用debugserver
启动目标进程或直接对目标进行附加。
如果能将/Developer/usr/bin/debugserver
替换为修改过的高权限debugserver
岂不是轻松搞定。
很可惜,/Developer/usr/bin/debugserver
存放在一个只读磁盘上,我们无法对它进行修改和替换。
换个角度,如果知道是哪个进程启动了/Developer/usr/bin/debugserver
,在它启动之前将/Developer/usr/bin/debugserver
替换成修改过的高权限debugserver
也可以达到目的。
使用Xcode
调试应用时可以发现新增了一个debugserver
进程,它的启动参数如下:
/Developer/usr/bin/debugserver --lockdown --launch=frontboard --secure-socket-proxy
启动参数中可以看到 lockdown
字眼,谷歌了一下,找到一篇文章usbmux原理以及PeerTalk源码解析,里面有这么一段话:
三方软件读取ios设备相册, iTunes备份iPhone,Xcode真机调试, Xcode若要执行真机调试,首先需要和lockdown服务通信,发出启动调试请求,lockdown收到请求以后,启动iOS端对应的调试服务(debugserver),然后Xcode便与debugserver之间建立了通信连接。
基本上可以确定启动debugserver
的目标就在提供lockdown
服务的lockdownd
守护进程中。
经过分析,发现lockdownd
中是使用SMJobSubmit
函数来启动/Developer/usr/bin/debugserver
进程的,启动参数如下:
{
EnvironmentVariables = {
"LOCKDOWN_MACH_SERVICE" = "lockdown.12392682664230.com.apple.debugserver.DVTSecureSocketProxy";
};
KeepAlive = 0;
Label = "lockdown.12392682664230.com.apple.debugserver.DVTSecureSocketProxy";
LaunchOnlyOnce = 1;
MachServices = {
"lockdown.12392682664230.com.apple.debugserver.DVTSecureSocketProxy" = 1;
};
POSIXSpawnType = Interactive;
ProgramArguments = (
"/Developer/usr/bin/debugserver",
"--lockdown",
"--launch=frontboard",
"--secure-socket-proxy"
);
RunAtLoad = 0;
UserName = mobile;
}
知道上面的信息后,事情就简单了,通过hookSMJobSubmit
函数,在需要启动/Developer/usr/bin/debugserver
时将其替换成自定义的debugserver
路径,同时把UserName
改成root
,就可以达到让Xcode使用root权限调试任意进程的目的。
最后根据上面的思路,写了一个Tweak,代码在 这里。
Cydia 源:https://repo.byteage.com。
本文为原创文章,版权归字节时代所有,欢迎分享本文,转载请保留出处!
似乎只能attach?
@ronaldinho如果你要使用Xcode启动应用进行调试,除非程序是你自己写或者使用EasyDev/MonkeyDev之类的工具进行开发,否则只能附加进程进行,这是Xcode本身的限制。
如果需要,你依然可以在命令行使用debugserver+lldb的原始方式启动或附加进程进行调试。