基於Android studio動態調試smali全過程
1 工具和環境
1、Android studio 用於集成idea插件和導入smali源碼/
2、idea插件
3、首先得有一部已經 root 的手機
第三條條件沒有那沒辦法了
插件下載 https://link.jianshu.com/?t=https://bitbucket.org/JesusFreke/smali/downloads/
或者在studio中搜索Smalidea進行插件下載(要翻牆)
在Android studio中通過idea插件來調試smali和在idea中調試很類似,下面就來講解調試的步驟。
2 smali反編譯和導入
調試的步驟大概如下:
通過apktool工具反編譯目標Apk獲取smali文件,修改xml中android:debuggable=“true”。
導入smali文件至Android studio
在相應位置打好斷點後,啓動調試進程。
開始Apk動態調試調試吧!
2.1 獲取smali文件
通過apktool獲取反編譯之後的smali文件非常簡單。
apktool d *.apk
通過上面的apktool命令獲取反編譯的smali文件。
根目錄demo-release默認爲apk的名字,也可以通過-o指定路徑名。如果遇到某些apk(如支付寶、微信等)採取了防止apktool破解的策略,我們也可以通過修改apktool碼來修復漏洞(因爲是開源代碼),但是這不是本文的重點。
2.2 打開smali文件夾
通過Android studio 提供的Open an existing Android Studio project功能來打開文件夾。注意:smali作爲根目錄導入。
導入後,工程目錄如下:
我們可以在as中查看和修改smali代碼。
2.3 調試smali
下面的調試方法可以在進程起來就能附加調試進程。
2.3.1 配置Android Studio調試環境
成功導入smali文件夾後配置遠程調試的選項。選擇 Run -->Edit Configurations,增加一個Remote調試的調試選項,端口選擇:8700(未佔用端口均可)。
2.3.2 進入等待調試
在需要的地方打好斷點,通過一下命令行啓動進程調試等待模式:
命令行啓動調試模式,
adb shell am start -D -n packagename/ MainActivity
packagename爲進程名,MainActivity爲首頁Activity
啓動調試app,通過
adb shell dumpsys "activity top | grep --color=always ACTIVITY"
在終端獲取包名和頁面信息。
執行
adb shell ps | grep packagename
獲取進程pid
執行
adb forward tcp:8700 jdwp:pid
建立端口轉發
也可以通過shell腳本,直接進入等待調試:
#!/bin/sh
if [[ $# == 0 ]]; then
echo "./debugTool [package] [activity] "
exit 1
fi
package=$1
activity=$2
adb shell am start -D -n ${package}/${activity}
varId=`adb shell ps | grep package| awk '{print $2}'`
adb forward tcp:8700 jdwp:$varId
進入等待調試後,在Android studio中執行Run -> Debug啓動剛纔創建的遠程調試器,進入動態調試了。通過斷點可以查看內存的信息。
如下,查看smali中寄存器v3的對象:
--------------------更新 Android Studio 4.0之後 --------------------------------------------------
更新 Android Studio 4.0之後, debug 可以直接使用
去 attach 調試目標的進程,能夠直接調試 smali 代碼,以前還要看要調試的進程pid還要轉發接口,現在點點鼠標就可以了!