iOS逆向之動態(tài)調(diào)試任意APP,終端LLDB、手機debugserver

一、動態(tài)調(diào)試

將程序運行起來,通過下斷點、打印等方式,查看參數(shù)、返回值、函數(shù)調(diào)用流程等

二、Xcode的動態(tài)調(diào)試

Xcode調(diào)試器使用的是LLDB?
1. 在Xcode的上進行打斷、打印等行為,通過調(diào)試器LLDB將指令傳輸給debugserver(即debugserver監(jiān)聽LLDB傳輸?shù)闹噶睿?br>2. debugserver 接收到指令,將指令執(zhí)行到到APP上
3. APP 執(zhí)行調(diào)試指令,將執(zhí)行后的反饋,返還給debugserver
4. debugserver再將信息傳給LLDB,LLDB將信息展示到Xcode的輸出欄中

關(guān)于GCC、LLVM、GDB、LLDB
? ? Xcode的編譯器發(fā)展歷程 GCC -> LLVM
? ? Xcode的調(diào)試器發(fā)展歷程 GDB -> LLDB

debugserver一般是開始存放在Mac的Xcode里面
????/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/9.1/DeveloperDiskImage.dmg/usr/bin/debugserver

通過Xcode給手機安裝APP時,Xcode會將debugserver安裝到iPhone上
? ? ?/Developer/usr/bin/debugserver

Xcode調(diào)試的局限性
? ? 一般情況下,只能調(diào)試通過Xcode安裝的APP

三、動態(tài)調(diào)試任意APP

即通過終端,調(diào)試手機上的任意APP

1. debugserver的權(quán)限問題
? ? A. 默認情況下,/Developer/usr/bin/debugserver 缺少一定的權(quán)限,只能調(diào)試通過Xcode安裝的APP,無法調(diào)試其他來源的APP。
? ? B. 如果希望調(diào)試其他APP,需要對debugserver重新簽名,簽上2個測試相關(guān)的權(quán)限
????????a. get-task-allow
? ? ? ? b. task-for-pid-allow? ? ? ?

2.如何給debugserver簽上權(quán)限? ??
? ? A. iphone上 的/Developer 目錄是只讀權(quán)限,無法直接對?/Developer/usr/bin/debugserver? 文件簽名。需要把debugserver 復(fù)制到Mac上
? ? B. 通過 ldid 命令將文件以前簽名權(quán)限文件

? ? ldid -e debugserver > debugserver.entitlements

? ? C.打開debugserver.entitlements 文件加上權(quán)限

????????D. 通過 ldid 命令重新給 debugserver 簽名權(quán)限

ldid -Sdebugserver.entitlements debugserver

? ? ? ? E. 將已將簽好權(quán)限的debugserver放到/usr/bin目錄中,通過chmod +x??/usr/bin/debugserver 賦予更高權(quán)限啟動

? ? 3. 讓debugserver附加到某個APP進程(此處已微信為例)? ? ? ??
????????debugserver *:端口號 -a 進程
? ? ? ? A. *:端口號? ?使用iPhone的某個端口啟動 debugserver服務(wù)(只要不是保留端口號都可以)
? ? ? ? B. -a 進程? ? ?輸入APP的進程信息(進程ID或者進程名稱)

debugserver 127.0.0.1:10011 -a WeChat


此處不建議使用 debugserver *:10011 -a WeChat? 如果使用* 會在后續(xù)報錯

? ? 此處已端口號 為10011 APP為微信為例。且微信要出于喚醒狀態(tài)。

????????如果出現(xiàn)Failed to get connection from a remote gdb process.連接失敗,則可以試著重啟手機(reboot)或者killall SpringBoard

如果權(quán)限列表中出現(xiàn),下面的權(quán)限也會導(dǎo)致?Failed to get connection from a remote gdb process.連接失敗

????<key>com.apple.security.network.server</key>
? ? <true/>
????<key>com.apple.security.network.client</key>
????<true/>
????<key>seatbelt-profiles</key>
????<array>
????<string>debugserver</string>
????</array>

建議權(quán)寫成?

<?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.frontboard.debugapplications</key>
<true/>
<key>com.apple.frontboard.launchapplications</key>
<true/>
<key>com.apple.springboard.debugapplications</key>
<true/>
<key>com.apple.system-task-ports</key>
<true/>
<key>get-task-allow</key>
<true/>
<key>platform-application</key>
<true/>
<key>run-unsigned-code</key>
<true/>
<key>task_for_pid-allow</key>
<true/>
</dict>
</plist>


?? 4.在Mac上啟動 LLDB ,并遠程連接上iPhone上的debugserver服務(wù)?
? ? ? ? A. 啟動LLDB電腦終端輸入

lldb

? ? ? ? B. 鏈接debugserver服務(wù)?
? ? ? ? ? ? process connect connect://手機IP地址:debugserver服務(wù)端口號

? ? ?process connect connect://localhost:10011

此處使用?/localhost:10011 是因為做了映射,把本地的10011映射到了手機端口的10011上了
需要用到 tcperlay.py工具

出現(xiàn)下圖表示鏈接成功,并且自動進入斷點模式,對手機上的APP的任何操作都無效

? ? ? ? C.使用LLDB的指令 讓程序運行 c

c

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容