iOS逆向教程之動態(tài)調(diào)試詳解
前言
有時候想更了解別人App的調(diào)用流程,就需要在App運行的時候進行動態(tài)調(diào)試。動態(tài)調(diào)試指的是將程序運行起來,通過下斷點、打印等方式,查看參數(shù)、返回值、函數(shù)調(diào)用流程等。
下面話不多說了,來隨著小編一起看看詳細的介紹吧
Xcode的動態(tài)調(diào)試原理
首先了解一下 Xcode 編譯和調(diào)試器的發(fā)展。Xcode 中的編譯器發(fā)展歷程:GCC -> LLVM,調(diào)試器的發(fā)展歷程:GDB -> LLDB 。
Xcode 調(diào)試安裝到手機上的應(yīng)用的原理:Xcode 通過 LLDB 調(diào)試器把調(diào)試指令發(fā)送到手機上的 debugserver, debugserver 再與相應(yīng)的 APP 進行交互,達到調(diào)試的效果。
debugserver 一開始是存放在Mac的Xcode里面,路徑:
/Applications/Xcode.app/Contents/Developer/Platforms /iPhoneOS.platform/DeviceSupport /9.1/DeveloperDiskImage.dmg /usr/bin/debugserver
當 Xcode 識別到手機設(shè)備時,Xcode 會自動將 debugserver 安裝到手機上。
Xcode 調(diào)試的局限性:一般情況下,只能調(diào)試通過 Xcode 安裝的APP,無法調(diào)試其它APP。
給debugserver賦予權(quán)限
默認情況下 /Developer/usr/bin/debugserver 缺少一定的權(quán)限,只能調(diào)試通過Xcode安裝的App,如果希望調(diào)試其它App,需要對 debugserver 重新簽名,簽上可以調(diào)試其它App的權(quán)限。
需要的兩個權(quán)限為:get-task-allow 和 task_for_pid-allow
iPhone上的 /Developer 目錄是只讀的,無法直接對 /Developer/usr/bin/debugserver 文件簽名,需要先把 debugserver 復(fù)制到Mac。
通過 ldid 命令導(dǎo)出文件以前的簽名權(quán)限:
$ ldid -e debugserver > debugserver.entitlements
debugserver.entitlements 這個文件其實是個 plist 文件,在這個文件中加上上面提到的兩個權(quán)限后,再通過 ldid 命令對文件重新簽名。
$ ldid -Sdebugserver.entitlements debugserver
然后將已經(jīng)簽好權(quán)限的 debugserver 放到 /usr/bin 目錄,便于找到 debugserver 指令。
debugserver附加到某個APP進程
$ debugserver *:端口號 -a 進程
- *:端口號:使用iPhone的某個端口啟動debugserver服務(wù)(不是保留端口)
- -a進程:輸入APP的進程信息(進程ID或者進程名稱)
Mac遠程連接iPhone上的debugserver服務(wù)
啟動LLDB:
// 在終端輸入 $ lldb
連接debugserver服務(wù)
(lldb) process connect connect://手機IP地址:debugserver服務(wù)端口號
使用LLDB的c命令讓程序先繼續(xù)運行
(lldb) c
到此,就可以遠程調(diào)試別人的App了。
常用的LLDB指令
給ViewController的test方法設(shè)置斷點
breakpoint set -n "-[ViewController test]"
查看指令用戶使用 help 指令: help breakpoint 等。
打印線程的堆棧信息: thread backtrace
很多命令不在這里贅述,請參考:http://lldb.llvm.org/lldb-gdb.html
ASLR
獲取 ASLR 的偏移量:
image list -o -f
打印結(jié)果的第二列前面的地址就是我們需要的 ASLR 的偏移量offset。
假如我們想給某個類中的test方法添加斷點,那么通過 Hooper 工具找到該方法的第一個內(nèi)存地址,假如為0x010101,然后地址加上我們得到的 ASLR 的偏移量就是該方法的實際地址。然后通過該地址給方法下斷點。
breakpoint set -o 0x010101+offset
到此就給該方法添加了斷點,之后當程序調(diào)用該方法的時候,會停在該斷點出。
結(jié)語
練習 lldb 的各種指令時,推薦先在 Xcode 上練習各種用法,因為會有提示和直觀的輸出結(jié)果,更容易我們理解。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
iOS中長按調(diào)出菜單組件UIMenuController的使用實例
UIMenuController即是用來制作我們平時對文本長按屏幕后顯示出的復(fù)制粘貼等選項菜單,下面就來詳細整理一下iOS中長按調(diào)出菜單組件UIMenuController的使用實例:2016-06-06