1、重簽debugserver
找到你Xcode的位置,右鍵打開包內(nèi)容,然后按路徑 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport找到和你手機(jī)系統(tǒng)版本對(duì)應(yīng)的DeveloperDiskImage.dmg
打開DeveloperDiskImage.dmg,找到/usr/bin/debugserver
拷貝一份debugserver到桌面
wifi:~ clf$ cp /Volumes/DeveloperDiskImage/usr/bin/debugserver ~/Desktop/debugserver
接下來,想讓debugserver成功跑起來要做兩件事
1)給debugserver瘦身
瘦身要把debugserver瘦成和我們?cè)O(shè)備相同arm指令集的對(duì)應(yīng)類型拍谐,可參照下圖
然后執(zhí)行命令
wifi:~ clf$ lipo -thin arm64 ~/Desktop/debugserver -output ~/Desktop/debugserver
備注:如果ldid支持fat binary的話,就不用瘦身馏段,我還沒有去驗(yàn)證ldid支不支持轩拨,所以還是瘦身下比較靠譜。
2)給debugserver添加task_for_pid權(quán)限
只有打了task_for_pid權(quán)限我們才可以在后來以進(jìn)程為單位調(diào)試我們要調(diào)試的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>
如果你輸出結(jié)果有亂碼什么的顯示亡蓉,就說明你的ldid有問題。
下面我們給debugserver重簽名
新建一個(gè)entitlement.plist文件喷舀,內(nèi)容如下:
<?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>
重簽名砍濒,執(zhí)行命令:
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拷貝到手機(jī)上
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
接下來就可以再手機(jī)上使用debugserver了。
當(dāng)然你要賦予debugserver執(zhí)行權(quán)限
iPhone:~ root# chmod +x /usr/bin/debugserver
備注:
如果你手機(jī)連接過xcode做過任何調(diào)試拿愧,在你手機(jī)的 /Developer/usr/bin/ 目錄下會(huì)有個(gè)debugserver杠河,你也可以把這個(gè)傳到電腦上,重簽名后再傳回到手機(jī)上,這樣的好處是不用瘦身券敌,這個(gè)debugserver對(duì)應(yīng)的指令集就是手機(jī)的指令集)
3唾戚、遠(yuǎn)程調(diào)試
再手機(jī)上開啟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.
然后我嘗試開啟一個(gè)手機(jī)上有的程序
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 *...
這個(gè)就是成功了的。
如果debugserver開啟成功陪白,就可以在電腦終端使用lldb命令
命令lldb颈走,然后process connect connect://yourPhoneIp:1212
wifi:Desktop clf$ lldb
(lldb) process connect connect://192.168.2.2:1212
這時(shí)候連接手機(jī)的一端就會(huì)增加一句輸出
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.
稍等一下膳灶,之后就會(huì)連接成功咱士,然后就可以利用lldb的命令行,來調(diào)試連接的App了
當(dāng)然這里QQ是從App Store上下載的轧钓,加殼的序厉,我們負(fù)載不了
(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)
常見錯(cuò)誤:
(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 的以下權(quán)限,重新簽名毕箍。
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