要想调试 iOS 设备上的任何程序,需要用到 debugserver
+ lldb
的方式,可以参考文章一步一步用debugserver + lldb代替gdb进行动态调试进行配置,不再赘述。
使用 debugserver
+ lldb
调试有一个问题就是略麻烦。虽然有一些插件简化了调试的步骤,如:SpringBoard tweak 双击图标启动debugserver,但使用终端调试,脱离Xcode
总有些不爽。
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
进程,它的启动参数如下:
可以看到 lockdown
字眼,谷歌了一下,找到一篇文章usbmux原理以及PeerTalk源码解析,里面有这么一段话:
三方软件读取ios设备相册, iTunes备份iPhone,Xcode真机调试, Xcode若要执行真机调试,首先需要和lockdown服务通信,发出启动调试请求,lockdown收到请求以后,启动iOS端对应的调试服务(debugserver),然后Xcode便与debugserver之间建立了通信连接。
于是基本确定启动debugserver
的目标就在提供lockdown
服务的lockdownd
守护进程中。
经过分析,发现在lockdownd
中是使用SMJobSubmit
函数来提交启动/Developer/usr/bin/debugserver
进程的。
启动参数如下:
知道上面的信息后,事情就简单了,通过hookSMJobSubmit
函数,在需要启动/Developer/usr/bin/debugserver
时将其替换成自定义的debugserver
路径,同时把UserName
改成root
,就可以达到让Xcode使用root权限调试任意进程的目的。
最后根据上面的思路,写了一个Tweak,代码在 这里。
Cydia 源:https://repo.byteage.com。
/
Developer
/
usr
/
bin
/
debugserver
-
-
lockdown
-
-
launch
=
frontboard
-
-
secure
-
socket
-
proxy
/
Developer
/
usr
/
bin
/
debugserver
-
-
lockdown
-
-
launch
=
frontboard
-
-
secure
-
socket
-
proxy
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)