呂元江,2019年1月加入去哪兒網,現負責app的分析和設備指紋反爬事項,對app脫殼,java/nativec層加解密算法分析還原有豐富經驗。java
用於熟悉瞭解 dalvik 虛擬機中類的加載流程(native層)linux
建立一個 Android 工程(做爲調試的目標進程)android
帶調試符號文件的替換ios
包含調試符號的文件都保存在編譯後的 symbols 目錄下算法
手機中原有的/system/lib/libdvm.so 替換成帶調試符號信息的 libdvm.so (編譯後的安卓系統源碼out/target/product/hammerhead/symbols/system/lib/libdvm.so)macos
爲目標進程-配置調試模式windows
選擇調試模式-Native 模式,在工具欄中-選擇點擊運行下面的按鈕 Edit Configuration:配置好後名字爲 APPmarkdown
配置以後,直接以 debug 模式運行 APP\app
手機出現 Wating for Debuger 界面後點擊 Android studio 調試器中的暫停按鈕 以下有三個窗口:Frames,Variables,LLDB,分別用於查看函數調用堆棧,變量查看,LLDB 交互。函數
可使用 F7 F8 F9 等命令,進行可視化調試。可是不能在 IDE 中直接下斷點,只能經過 LLDB 命令下斷點,其中爲了方即可視化調試有兩個下斷點的命令比較實用:
A #根據函數名下斷點
br s -n DalvikdalviksystemDexFiledefineClassNative
B #根據文件名配合行號下斷點
br set --file dalviksystemDexFile.cpp --line 387 或者 br s -f dalviksystemDexFile.cpp -l 387
場景:在修改 dalvik 從新編譯後,想對修改後的代碼進行調試,自定義的 libdvm.so 運行過程當中遇到崩潰定位。
在沒有 APP 源碼的狀況下沒法在 Android studio 上實現可視化調試,常見的是經過 gdb,或者IDA。
本次說說用 LLDB 如何進行遠程調試。
LLDB 經常使用命令:
命令 | 功能做用 |
---|---|
p *(Type *)addr | 打印結構體 |
po 對象.屬性 | 查看某個結構體或對象中的屬性 |
br s -n 函數名 | 對函數名下斷點 |
b **.m:NUM | 對某文件設置行斷點 |
br del 斷點編號 | 刪除斷點 |
ta v | 查看全局變量 |
ta v baz | //某個具體全局變量 baz |
fr v | 查看本地變量 |
fr v bar | //查看某個具體變量,其中 bar 爲變量名 |
s | 步入 |
n | 步過 |
c | 繼續運行 |
wa s v b | 將變量 b 設置爲觀察點 |
watchpoint l | 查看觀察點 |
watch del 觀察點編號 | 刪除觀察點 |
前提條件:
****目標 APP 必須爲可調試-咱們編譯的 rom 爲 debug 版本,能夠實現調試任意 APP 功能。
LLDB 使用比較簡單具體步驟以下:
chmod 777 lldb-server
複製代碼
3. 運行手機中的 lldb-server
./lldb-server platform --server --listen unix-abstract:///data/local/tmp/debug.sock
複製代碼
4. 在電腦另起一個終端輸入 lldb
lldb 支持多種插件可經過 platform list 查看
(lldb) platform list
Available platforms:
host: Local Linux user platform plug-in.
remote-freebsd: Remote FreeBSD user platform plug-in.
remote-linux: Remote Linux user platform plug-in.
remote-netbsd: Remote NetBSD user platform plug-in.
remote-windows: Remote Windows user platform plug-in.
kalimba: Kalimba user platform plug-in.
remote-android: Remote Android user platform plug-in.
remote-ios: Remote iOS platform plug-in.
remote-macosx: Remote Mac OS X user platform plug-in.
remote-gdb-server: A platform that uses the GDB remote protocol as the communication transport.(lldb)
複製代碼
咱們選擇使用 Android 調試插件
platform select remote-android
複製代碼
鏈接 lldb-server
platform connect unix-abstract-connect:///data/local/tmp/debug.sock
複製代碼
attach 目標進程
process attach -p 目標app進程id
複製代碼