AS+smalidea插件動態調式

往期推薦

JEB動態調試

Method Profiling

方法棧跟蹤

Log插樁調試smali代碼

一:Android Studio 調試的原理

使用 Android Studio 進行動態調試,通過 Android Studio 導入反編譯出的完整的 smali 代碼,設置好調試所需的條件,設置斷點。將移動設備連接至 PC端,然後運行待調試的apk應用程序,當該應用程序執行流程,運行至smali代碼的斷點處時,就會觸發斷點。從而可以進行進一步的分析和調試,讓程序的運行流程和中間參數更清晰。

二:Android Studio 調試的流程

1.下載並安裝Android Studio工具和smalidea插件

下載兩款工具以及安裝Android Studio工具之前有過講解,這裏略過。

着重介紹安裝smalidea插件,打開Android Studio工具,點擊File,選擇Settings,或者按快捷鍵Ctrl+Alt+S打開設置界面,點擊Plugin,再點擊install plugin from disk。找到之前我們下載的smalidea插件選中點擊OK,插件就添加成功了,會彈出彈窗,提示重啓Android Studio,點擊重啓,如下圖所示。

注意:如果沒有重啓,smalidea是沒有生效的,就會導致後面無法在smali代碼上打斷點。

在這裏插入圖片描述

2.反編譯待調試的apk

使用AndroidKiller工具,反編譯我們要調試的APK文件,反編譯成功後,在「工程管理器」找到AndroidManiFest.xml文件,再找到該文件裏的application標籤,查看標籤中是否存在android:debuggable=「true」屬性,如果文件中不存android:debuggable=「true」,則需要進行添加,如下圖所示。

在這裏插入圖片描述

探究:爲什麼要增加這個屬性呢?

因爲在開發的過程中,這個屬性是由開發人員開發並調試的屬性,但是在發佈的時候這個屬性會自動刪除,而我們要調試該程序,就需要將其進行增加。當然如果是使用第三方模擬器或安卓自帶模擬器,它是自動默認開啓的,就不需要進行增加。
然後將apk打包安裝到模擬器裏,如下圖所示。

在這裏插入圖片描述

並且將工程下的project目錄複製到桌面,方便後面AndroidStudio工具查找,如下圖所示。

在這裏插入圖片描述

3.將反編譯的文件夾導入AndroidStudio

打開AndroidStudio工具選擇Import Project選項,點擊該選項,如下圖所示。

在這裏插入圖片描述

並找到桌面上的project目錄選中後點擊OK,如下圖所示。

在這裏插入圖片描述

這些頁面中選擇第一個,然後一直點擊 「Next」,直到Finish完成導入項目,如下圖所示。

在這裏插入圖片描述

如果打開之後是默認上一次的工程,可以選擇關閉默認打開上一次工程。關閉的操作流程:在主界面中,選擇單擊菜單欄File選項;彈出File菜單列表,單擊Settings設置選項,彈出對話窗口選擇Appearance&Behavior選項,Appearance & Behavior展開後,選擇System Settings選項,取消勾選Reopen last project on startup選項。

4.調試環境配置

(1)在AndroidStudio工程中右鍵點擊smali文件夾,設定Mark Directory as => Sources Root,如下圖所示。

在這裏插入圖片描述

(2)打開AndroidStudio的File => Project Structure選擇,選擇對應的JDK,如下圖所示。

在這裏插入圖片描述
在這裏插入圖片描述

(3)配置遠程調試的選項,選擇Run =>Edit Configurations選項,如下圖所示。

在這裏插入圖片描述

點擊「+」號,新建remote類型調試器,如下圖所示。

在這裏插入圖片描述

設置Name,修改端口號,可以選擇未被佔用的任意端口,本次設置爲8700,如下圖所示。

在這裏插入圖片描述

5.開始調試分析smali代碼

和Jeb動態調試一樣,也有兩種調試方法:一種是普通模式調試,另外一種是通過命令行「adb shell am start –D -n 應用程序包名/應用程序入口界面」命令,以調試模式啓動應用程序調試。

探究:JEB動態調試的兩種方法分別是什麼呢?

(1)普通模式調試

第一步:以「註冊機」APP爲例,打開雷電模擬器安裝「註冊機」APP,安裝完成後打開「註冊機」程序。

第二步:點擊左下角的「windows」圖標,輸入cmd命令,打開命令窗口。輸入「adb shell ps」命令,查看當前設備的進程信息,通過瀏覽進程信息,找到「註冊機」程序的進程pid ,並且記錄下來,如下圖所示。

在這裏插入圖片描述

第三步:再次點擊左下角的「windows」圖標,輸入cmd命令,打開新的命令窗口。輸入「adb forward tcp:8700 jdwp:2524」命令,進行端口轉發,其中的「tcp」是之前配置調試環境時指定的端口號,「jdwp」這裏指的是我們要調試的程序的進程pid,在此之前已經記錄下來,如下圖所示。

在這裏插入圖片描述

第四步:在菜單中找到「debug」調試按鈕,點擊該按鈕開始調試,出現下面的「socket」信息,這就說明附加成功,如下圖所示。

在這裏插入圖片描述

附加完成之後進行下斷,找到MainActivity.smali文件裏面的checkSN方法,在方法前面的行號處點擊即可下斷,如下圖所示。

在這裏插入圖片描述

這個過程中會發現,沒有立即斷下來,這是因爲程序還沒有調用該方法,這時去操作程序,讓他調用該方法,在這裏隨意輸入一個「用戶名」,但註冊碼必須是16位的,否則,會影響到後面的調試分析。輸入相應的信息後直接點擊 「註冊」按鈕,如下圖所示。

在這裏插入圖片描述

發現程序被斷下來了,出現了參數寄存器的值,如下圖所示。

在這裏插入圖片描述

接下來會使用到一些按鈕和快捷鍵進行後續操作,簡單介紹一下它們的用法,如下圖所示。

F9:跳到下一個斷點
F8:單步步過
F7:單步步入
Alt+shift+F7:強制進入
Shift+F8:單步步出

在這裏插入圖片描述

一直按f8或者可以在這個位置下斷,按f9程序就會在這個斷點斷下來,如下圖所示。

在這裏插入圖片描述

發現正確的註冊碼已經出現,如下圖所示。

在這裏插入圖片描述

然後停掉as,如下圖所示。

在這裏插入圖片描述

去模擬器裏面粘貼註冊碼,點擊註冊,註冊成功了,如圖10.23所示,說明我們已經獲取到正確註冊碼。

在這裏插入圖片描述

以調試模式啓動調試

設置斷點的方法和普通模式是一樣的,先打開模擬器,然後再cmd裏面輸入「adb shell am start -D -n 應用程序包名/應用程序入口界面」命令回車,如下圖所示。

在這裏插入圖片描述

模擬器彈出了一個彈窗,等待被調試,如下圖所示。

在這裏插入圖片描述

此時,打開cmd命令窗口,進行端口轉發,輸入「adb forward tcp:8700 jdwp:2700」回車轉發端口,如下圖所示。

在這裏插入圖片描述

轉發成功後,點擊調試按鈕開始調試,如下圖所示。

在這裏插入圖片描述

同樣去操作程序,點擊註冊,馬上就斷下來,如下圖所示。

在這裏插入圖片描述

接下來的操作參考普通模式調試。

小結:

今天主要分享了AndroidStudio+smalidea插件動態調試,主要掌握的重點內容有:

  1. 調試環境配置:安裝插件->反編譯apk ->複製project目錄到桌面、安裝反編譯後的apk ->導入project到as工程 ->設置smali文件夾爲資源文件夾 -> 配置工程jdk ->配置調試選項 ->下斷。

2.普通調試模式:配置好一切之後,打開模擬器裏面的apk -> cmd命令查找進程PID ->然後轉發端口 ->點擊調試按鈕開始調試分析。

3.以調試模式啓動調試:配置好一切之後 ->cmd命令以調試模式啓動程序,記下pid->轉發端口 ->點擊調試按鈕開始調試分析。

4、快捷鍵:
F9:跳到下一個斷點
F8:單步步過
F7:單步步入
Alt+shift+F7:強制進入
Shift+F8:單步步出

如果你也對安卓逆向感興趣。可以加下方的羣,大家一起討論問題,或者掃描下方二維碼關注公衆號,關注回覆 「安卓逆向」 獲取免費教程

安卓逆向交流學習:1139349849
vx:Yjxiaox

在這裏插入圖片描述