想必论坛各路大佬都已经知道如何使用 debugserver
+ lldb
在真机设备上调试任意进程了,这里就不赘述了。
使用 debugserver
+ lldb
调试有一个问题就是有点麻烦。虽然有一些插件简化了调试的步骤, 如:SpringBoard tweak 双击图标启动debugserver,但使用终端调试总是有点不爽。
macOS上,xcode是可以直接使用root权限调试进程的,但是iOS上不支持。
能不能让xcode也支持使用root权限调试应用或者进程呢?如果可以,那么在熟悉的xcode上面调试岂不是舒服?
xcode 在iOS上调试,是使用mobile
用户,启动/Developer/usr/bin/debugserver
来对进程进行附加或者其他操作。
如果能替换/Developer/usr/bin/debugserver
,那么debugserver
的权限问题就解决了。
可惜/Developer/usr/bin/debugserver
是放在一个只读磁盘上的,无法对它进行任何操作。
换个角度,如果知道是哪个进程启动了/Developer/usr/bin/debugserver
,在它启动之前将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之间建立了通信连接。
于是基本确定目标就在提供lockdown
服务的lockdownd
守护进程中。
经过一通分析,最后发现在lockdownd
中是使用SMJobSubmit
函数来提交启动一个进程的。
启动参数如下:
{
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;
}
后面就简单了,直接hook它,然后将需要启动的/Developer/usr/bin/debugserver
替换成自定义的debugserver
路径,同时顺便把UserName
改成root
,就可以达到让xcode使用root权限调试任意进程的目的了。
代码在 这里。
Cydia 源:https://repo.byteage.com。