h4ck1nH4ck1n  2022-06-28 14:48 字节时代 隐藏边栏 |   2 条评论  823 
文章评分 1 次,平均分 5.0

在 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

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

h4ck1n
H4ck1n 关注:0    粉丝:0 最后编辑于:2022-08-26
这个人很懒,什么都没写

发表评论

表情 格式 链接 私密 签到

  1. ronaldinho
    ronaldinho 中国 Google Chrome 121.0.0.0 Mac OS X Lion 10.15.7

    似乎只能attach?

    • h4ck1n
      h4ck1n 永久会员 博主 中国 Google Chrome 121.0.0.0 Mac OS X Lion 10.15.7

      @ronaldinho如果你要使用Xcode启动应用进行调试,除非程序是你自己写或者使用EasyDev/MonkeyDev之类的工具进行开发,否则只能附加进程进行,这是Xcode本身的限制。
      如果需要,你依然可以在命令行使用debugserver+lldb的原始方式启动或附加进程进行调试。

扫一扫二维码分享