1、重签debugserver
找到你Xcode的位置,右键打开包内容,然后按路径 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport找到和你手机系统版本对应的DeveloperDiskImage.dmg
打开DeveloperDiskImage.dmg,找到/usr/bin/debugserver
拷贝一份debugserver到桌面
wifi:~ clf$ cp /Volumes/DeveloperDiskImage/usr/bin/debugserver ~/Desktop/debugserver
接下来,想让debugserver成功跑起来要做两件事
1)给debugserver瘦身
瘦身要把debugserver瘦成和我们设备相同arm指令集的对应类型,可参照下图
然后执行命令
wifi:~ clf$ lipo -thin arm64 ~/Desktop/debugserver -output ~/Desktop/debugserver
备注:如果ldid支持fat binary的话,就不用瘦身,我还没有去验证ldid支不支持,所以还是瘦身下比较靠谱。
2)给debugserver添加task_for_pid权限
只有打了task_for_pid权限我们才可以在后来以进程为单位调试我们要调试的App。
查看原始的debugserver的签名属性:
ldid -e ~/Desktop/debugserver
<?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.backboardd.debugapplications</key>
<true/>
<key>com.apple.backboardd.launchapplications</key>
<true/>
<key>com.apple.diagnosticd.diagnostic</key>
<true/>
<key>com.apple.frontboard.debugapplications</key>
<true/>
<key>com.apple.frontboard.launchapplications</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>
<key>com.apple.security.network.server</key>
<true/>
<key>com.apple.springboard.debugapplications</key>
<true/>
<key>run-unsigned-code</key>
<true/>
<key>seatbelt-profiles</key>
<array>
<string>debugserver</string>
</array>
</dict>
</plist>
如果你输出结果有乱码什么的显示,就说明你的ldid有问题。
下面我们给debugserver重签名
新建一个entitlement.plist文件,内容如下:
<?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>
重签名,执行命令:
wifi:Desktop clf$ codesign -s - --entitlements entitlements.plist -f debugserver
debugserver: replacing existing signature
再查看下debugserver的签名:
wifi:Desktop clf$ ldid -e ~/Desktop/debugserver
<?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>
把旧的属性列表替换掉了,说明OK了。
2、把重签名的debugserver拷贝到手机上
wifi:Desktop clf$ scp -p 22 debugserver root@192.168.2.2:/usr/bin/
root@192.168.2.2's password:
22: No such file or directory
debugserver 100% 4599KB 2.1MB/s 00:02
接下来就可以再手机上使用debugserver了。
当然你要赋予debugserver执行权限
iPhone:~ root# chmod +x /usr/bin/debugserver
备注:
如果你手机连接过xcode做过任何调试,在你手机的 /Developer/usr/bin/ 目录下会有个debugserver,你也可以把这个传到电脑上,重签名后再传回到手机上,这样的好处是不用瘦身,这个debugserver对应的指令集就是手机的指令集)
3、远程调试
再手机上开启debugserver
debugserver *:1212 -a <process name>
iPhone:~ root# debugserver *:1212 -a TargetApp
失败了
debugserver-@(#)PROGRAM:debugserver PROJECT:debugserver-360.0.26.1
for arm64.
Attaching to process TargetApp...
error: failed to attach to process named: ""
Exiting.
然后我尝试开启一个手机上有的程序
iPhone:~ root# debugserver *:1212 -a QQ
debugserver-@(#)PROGRAM:debugserver PROJECT:debugserver-360.0.26.1
for arm64.
Attaching to process QQ...
Listening to port 1212 for a connection from *...
这个就是成功了的。
如果debugserver开启成功,就可以在电脑终端使用lldb命令
命令lldb,然后process connect connect://yourPhoneIp:1212
wifi:Desktop clf$ lldb
(lldb) process connect connect://192.168.2.2:1212
这时候连接手机的一端就会增加一句输出
debugserver-@(#)PROGRAM:debugserver PROJECT:debugserver-360.0.26.1
for arm64.
Attaching to process QQ...
Listening to port 1212 for a connection from *...
Waiting for debugger instructions for process 0.
稍等一下,之后就会连接成功,然后就可以利用lldb的命令行,来调试连接的App了
当然这里QQ是从App Store上下载的,加壳的,我们负载不了
(lldb) process connect connect://192.168.2.2:1212
Process 18659 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
frame #0: 0x0000000185231cf8 CoreFoundation`_CFSetTSD + 64
CoreFoundation`_CFSetTSD:
-> 0x185231cf8 <+64>: cbnz x22, 0x185231d20 ; <+104>
0x185231cfc <+68>: orr w0, wzr, #0x1
0x185231d00 <+72>: mov w1, #0x468
0x185231d04 <+76>: bl 0x1853c508c ; symbol stub for: __76-[_CFXPreferences copyAppValueForKey:identifier:container:configurationURL:]_block_invoke
Target 0: (QQ) stopped.
(lldb)
常见错误:
(lldb) process connect connect://127.0.0.1:1212
error: Failed to connect port
电脑端添加端口映射:iproxy 1212 1212
Failed to get connection from a remote gdb process. Exiting.
解决:删除debugserver 的以下权限,重新签名。
com.apple.security.network.server
com.apple.security.network.client
seatbelt-profiles
888:~ root# /usr/bin/debugserver --version
zsh: killed /usr/bin/debugserver --version
解决:重签名使用codesign -fs