Android Studio 動態調試 apk 反編譯出的 smali 代碼


  在信安大賽的准備過程中,主要通過 Android Studio 動態調試 apk 反編譯出來的 smali 代碼的方式來對我們分析的執行流程進行驗證。該技巧的主要流程在此記錄。以下過程使用 Android Studio 3.0.1 和 smalidea 0.0.5 進行演示。

 

smali動態調試簡述

  使用 Android Studio 調試 apk 反編譯出的 smali 代碼,需要 PC 端和移動端的合作。在 PC 端通過 Android Studio 導入反編譯出的完整的 smali 代碼,並設置好調試所需的條件,並設置斷點。隨后將移動設備連接至 PC 端,並正常運行調試的 apk 應用,當待調試的 apk 應用執行流程運行至 PC 端上對應的 smali 代碼設置的斷點處時,則會觸發斷點,從而可以進行進一步的分析和調試等。

  上述方法可以與靜態流程分析相結合,以確認所分析流程的正確性( 會觸發選定的斷點 )。

 

動態調試所需的條件

  想要通過 Android Studio 進行 smali 代碼的動態調試,至少需要滿足以下條件之一:

  (1) 將待調試的應用設置為可調試的。apk 的 release 版本均為不可調試的,故需將 apk 中的 AndroidManifest.xml 文件中的  android:debuggable 設置為 true ,再將 apk 重打包,再進行安裝后,即可進行調試。若原 AndroidManifest.xml 文件不含有 debuggable 字段,則在合適的位置添加即可;( 但該方法會破壞源apk的完整性,可能無法通過 apk 的完整性檢查,且僅針對一款應用 )

  (2) 將移動設備的 / /default.prop 中的 ro.debuggable 設置為 1;(需要手機 root 權限 ,設置后即可對所有應用進行調試 )

  筆者采用的是第二種方案,該方案相對來說最簡單,且不會破壞源 apk 的完整性,設置借助的是 xposed 框架,簡單過程可見文末

 

安裝 smalidea

  (1)在這里下載最新的 smalidea 安裝包(.zip)。

  (2)在 Android Studio 的 File -> Settings -> Plugins 中,選擇 Install plugin from disk ,選中之前下載的 .zip 格式的文件,確定;

  (3)重新啟動 Android Studio 即可;

  不同的Android Studio 版本可能上述路徑有所不同,但過程大致相同。

 

獲取 apk 反編譯出的完整的 smali 代碼

  一般借助 apktools 進行完整 apk 的反編譯操作。

 

在 Android Studio 中導入和配置項目

  (1) 選擇 import project -> 選擇 apk 反編譯出的完整的 smali 文件夾 -> Create project from existing sources ,並一路選擇 next 即可。導入完成后,將目錄結構切換為 project 。

  

 

  (2) 選中項目目錄,右鍵 -> Mark Directory as -> Sources root.

  

 

  (3) 配置項目使用的 JDK 版本,選中 項目目錄 -> 右鍵 -> Open Module Settings -> Project ,在右側 Project SDK 欄中選擇安裝待調試 apk 的移動設備所使用的 JDK 版本。(在筆者使用的 Android Studio 3.0.1 版本的導入過程中,Android Studio 會詢問項目將會使用的 SDK 版本,直接在該提示界面中選擇所需的 JDK 版本即可.)

  

  

  (4) 對調試選項進行編輯,點擊 Android Studio 界面上的圖示按鈕,選擇 Edit Configurations。

  

  通過添加按鈕  添加一個 Remote 調試。可根據需要對該調試的 Name 和 Port 進行修改,通過 apply 進行確認。

  

 

啟動調試

  調試的方法有兩種,一種是通過 DDMS 啟動調試,一種是通過命令行 adb 命令啟動調試。( 以下為 Android Studio 3.0.1 中的操作)

  通過 DDMS 啟動調試

  (1) 通過 Tools -> Android -> Android Device Monitor ,在 DDMS 左側的列表中,選中所需要調試的包名;

  (2) 切回 Android Studio 界面,點擊選擇菜單 run -> debug "xxx" (xxx 為設置的 remote 調試的名字),即開始調試過程,此時 DDMS 界面的包名前面會出現一個綠色小蟲標志;

  

  使用該方法進行調試的缺點在於,需要將 remote 調試中的端口號設置為 DDMS 包名后面顯示的兩個端口號之一。其中 8700 端口總是固定的,建議使用。

 

  使用命令行啟動調試

  ( 注:使用該方法時需要關閉 DDMS,因為 DDMS 也使用了 adb ,同時開啟會有沖突 )

  (1) 使用 adb shell 以調試模式運行待調試的應用,關於以命令行方式運行 adb shell ,可以參考筆者在這里的記錄。

    adb shell am start -D -S -W packageName/mainActivity    //以調試狀態運行目標應用,參數為 包名/主activiy 名。

  所需找到的包名和主活動名在 apk 的 AndroidManifest.xml 中均有記錄。在 AndroidManifest.xml 中, package 字段對應的值即為包名,而帶有 LAUNCHER 關鍵字的 activity 即為主 activity。

    a.包名:

    

    b.主 activity 名

    

  所以對於圖示 apk ,需要執行的命令即為

    adb shell am start -D -S -W com.tencent.mm/com.tencent.mm.ui.LauncherUI 

  若上述命令運行成功,則在手機終端上會顯示 Waiting For Debugger 提示,不要關閉該提示框。

  

  (2) 通過 adb shell ps 命令顯示所有移動設備上運行的進程,並找到目標進程的pid ( 也就是剛啟動的應用的 pid )。

    adb shell ps | grep "com.tencent.mm"      //非Windows環境下,可以使用 grep 命令以包名為參數進行字符串篩選
    adb shell ps | findstr "com.tencent.mm"    //Windows環境下,通過 findstr 命令以包名為參數進行字符串選擇
    adb shell "ps | grep "com.tencent.mm""    //使用 android 環境下的 grep 命令,而不是主機上的命令

  查詢結果如下,即找到對應進程的pid。

  

 

  (3) 進行端口映射

     adb forward tcp:port_A jdwp:pid    //其中,port_A 為添加 remote 調試時指定的端口號,pid 即為第二步中獲得對應調試進程的 pid 

  對於筆者的示例,即為

     adb forward tcp:5005 jdwp:12144

   由於執行了端口映射,所以 remote 調試中的端口號可以為任意未被占用的端口號。

 

  (4) 使用 run -> attach debugger to Android Process 選項,根據提示選擇待調試進程即可。正確操作時,移動設備上的 waiting for debugger 對話框會消失。

 

  通過上述方法啟動調試之后,即可進行正常的調試過程。常見的方案是在經過分析所得的可能執行路徑上事先設置斷點,之后在移動設備上進行對應的 app 操作,若分析正確,則 app 會執行對應的流程,從而觸發斷點,從而可以進行進一步的分析。  

 

一些可能錯誤

  通過 Android Studio 的菜單欄 run -> debug "xxx" 啟動調試時,報錯"unable to open debugger port java.net.socketexception connection reset"

  網上相關資料較少,但出現該問題時,需要注意是否待調試應用是處於可調試狀態的,對於以 adb shell am start -D 命令運行的應用,需要 ro.debuggable=1 或 android:debuggable=”true”,在不滿足上述條件時,adb shell am start -D 命令不會報錯,但是通過 adb shell "ps -t | grep -A 8 package" 進行驗證時,會發現目標應用進程中不含有 JDWP 線程,此時不論如何進行設置,都無法使得調試順序進行,Android Studio 中也會報上述錯誤。

  將移動設備的 ro.debuggable 設置為 1 的方法,比較簡單的無需刷機的方法是安裝 xposed 框架( 需要 root 權限 ),之后通過已開發好的 xposed 模塊如  BuildProp Enhancer 設置 ro.debuggable 位,該方法一次重啟后即可生效,之后即可對應用進行調試。( 注意使用上述方法后,使用諸如 adb shell "getprop ro.debuggable"命令時,返回的結果仍為0,但是所有的應用確實處於可調試狀態)

  xposed 框架的安裝可以參考 xposed 中文網站xposed 英文論壇,也可參考網上資料。

  

 

參考資料:

  (1) 簡要介紹:Smalidea+IntelliJ IDEA/Android Studio無源碼調試

  (2) 完整過程介紹 : 使用Smalidea對無源碼APK調試簡介


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM