安卓底層 native 代碼的調試

呂元江,2019年1月加入去哪兒網,現負責app的分析和設備指紋反爬事項,對app脫殼,java/nativec層加解密算法分析還原有豐富經驗。java


1. 背景

用於熟悉瞭解 dalvik 虛擬機中類的加載流程(native層)linux

  1. 有 APP 源碼狀況如何配置,能夠在 Android studio 實現圖形化調試(IDE 自帶功能)。
  2. 無 APP 源碼的狀況下如何實現圖形化調試。

2. 環境要求配置

  1. Android Studio版本:2.2以上(低版本不支持 native 調試)
  2. 安裝插件:LLDB 調試器 ( lldb.llvm.org/ )

image.png

  1. 一份編譯好的安卓系統源碼(Android4.4.4)

3. 有 APP 源碼的狀況

  1. 建立一個 Android 工程(做爲調試的目標進程)android

  2. 帶調試符號文件的替換ios

    包含調試符號的文件都保存在編譯後的 symbols 目錄下算法

    手機中原有的/system/lib/libdvm.so 替換成帶調試符號信息的 libdvm.so (編譯後的安卓系統源碼out/target/product/hammerhead/symbols/system/lib/libdvm.so)macos

  3. 爲目標進程-配置調試模式windows

    選擇調試模式-Native 模式,在工具欄中-選擇點擊運行下面的按鈕 Edit Configuration:配置好後名字爲 APPmarkdown

image.png

  1. 配置以後,直接以 debug 模式運行 APP\app

  2. 手機出現 Wating for Debuger 界面後點擊 Android studio 調試器中的暫停按鈕 以下有三個窗口:Frames,Variables,LLDB,分別用於查看函數調用堆棧,變量查看,LLDB 交互。函數

image.png

  1. 在 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

image.png

  1. 可經過單步調試對感興趣的其餘模塊進行調試,如 libdvm.so 等

4. 無 APP 源碼的狀況調試 libdvm.so

場景:在修改 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 使用比較簡單具體步驟以下:

  1. 將lldb-server push 到手機 /data/local/tmp 目錄下 lldb-server 位於 Android/Sdk/lldb/3.1/android/armeabi 目錄下

image.png

  1. 在手機上給 lldb-server 賦予可執行權限
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
複製代碼
  1. 經過 lldb 命令下斷點,對 libdvm.so 進行調試

image.png

相關文章
相關標籤/搜索