基於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還要轉發接口,現在點點鼠標就可以了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章