Android逆向小技巧③:批量注入日誌,打印目標程序執行流程

回顧

《Android應用逆向——分析反編譯代碼之大神器》

在之前的一篇文章中,我們提到一個思路,使用 apktool 解包目標APK,然後在感興趣的JAVA包裏使用腳本批量注入日誌,隨後重新打包APK,安裝運行後,函數的執行流程就通過logcat打印了出來,目標APP點擊某個按鈕後執行了哪些函數一目瞭然。

回顧一下大致思路:

public class InjectLog {
    public static void PrintCaller()
    {
        Thread cur_thread = Thread.currentThread();
        StackTraceElement stack[] = cur_thread.getStackTrace();
        Log.d("InjectLog", stack[3].toString() + "[" + cur_thread.getId() + "]");
    }
}

我們寫了這樣一段JAVA代碼,用於輸出調用者的函數名。
然後我們又寫了一行JAVA代碼:

InjectLog.PrintCaller();

反編譯爲smali代碼:

invoke-static {}, Lcom/hook/tools/InjectLog;->PrintCaller()V

然後把這句smali代碼,批量注入到目標APP的smali代碼中,讓目標APP的每個函數都會調用這行代碼,就能實現觀測目標APP函數執行流程的效果。

這個思路行之有效,被轉到52pojie論壇中,很多同學使用了都說好。不過之前的文章中我們只是講了思路,注入腳本也寫的很潦草很隨意,對於各種異常情況沒有做處理,比如有的APK反編譯的smali代碼,沒有.prologue標記,導致注入失敗,並且存在重複執行腳本會導致重複注入多行代碼的情況。於是這一章,我們完善了一下這個注入腳本,修復這些問題,並放到Github上,大家一起來完善,也可以提 issues 反饋問題,使得這個工具可用性越來越好。同時,本章我們也通過一個小小的案例,來回顧一下這個工具的具體用法。

完善後的日誌注入工具

項目地址:https://github.com/encoderlee/android_tools

需要先安裝 Python3

用法示例:
1.先用 apktool 解包 apk 到目錄 f:\alipay_10.1.30
2.執行 inject_log.py -c 目標是 apktool 解包出的文件夾根目錄

inject_log.py -c f:\alipay_10.1.30\

這一步作用其實是把 InjectLog.smali 拷貝到 f:\alipay_10.1.30\smali\com\hook\tools\ 中,InjectLog.smali 就是 InjectLog.PrintCaller()函數的實現,對於每個apk項目,這個步驟只需做一次

3.注入代碼:
① 只對一個 smali 文件注入代碼

inject_log.py f:\alipay_10.1.30\smali_classes5\com\alipay\mobile\payee\ui\PayeeQRActivity.smali

② 對一個目錄下的所有 smali 文件注入代碼,不遞歸子目錄

inject_log.py f:\alipay_10.1.30\smali_classes5\com\alipay\mobile\payee\ui\

② 對一個目錄及它所有子目錄下的所有 smali 文件注入代碼,遞歸子目錄

inject_log.py -r f:\alipay_10.1.30\smali_classes5\com\alipay\mobile\payee\ui\

小技巧:
可以把 inject_log.py 放到一個目錄中,把這個目錄添加到 PATH 環境變量中
在這裏插入圖片描述
接下來在任意位置,按住【shift】鍵,點擊鼠標右鍵,就可以在此位置打開CMD窗口
然後就可以直接對當前目錄執行注入腳本工作了:

inject_log.py -c ./
inject_log.py -r ./

重要提示

先縮小範圍,確定關鍵代碼在某幾個包中,再小範圍批量注入代碼,不要一上來就對整個APK全部注入代碼,那樣運行起來會卡死奔潰的

注入代碼前,最好先用 git 跟蹤 apktool 解包出的整個項目文件夾,這樣清除注入的日誌也方便

git chekout .

分析支付寶案例

《Android逆向小技巧①:從Activity下手找到切入點,逆向分析支付寶APP》
上一篇文章,我們通過 adb 獲取了 Activity 名,並通過【Android Device Monitor】獲取 resource-id ,找到了關鍵代碼的大致位置。

在支付寶的收款二維碼界面點擊【設置金額】後來到了第二個界面,通過 adb 獲取到了 Activity 名爲:

com.alipay.mobile.payee.ui.PayeeQRSetMoneyActivity

於是我們將目光鎖定到了 com.alipay.mobile.payee.ui 這個JAVA包,使用日誌注入工具對該包下的所有 smali 注入代碼。
在首次注入代碼前,我們需要到 apktool 解包出的根目錄裏執行:

inject_log.py -c f:\alipay_10.1.30\

此舉作用在於往目標APK中放入一個文件 smali\com\hook\tools\InjectLog.smali 該文件是 InjectLog.PrintCaller() 函數的實現,沒有這個文件的話,調用 InjectLog.PrintCaller() 會出錯的。

然後我們找到 com.alipay.mobile.payee.ui 所在的 smali 文件目錄:

f:\alipay_10.1.30\smali_classes5\com\alipay\mobile\payee\ui

使用日誌注入工具注入代碼:

inject_log.py -r f:\alipay_10.1.30\smali_classes5\com\alipay\mobile\payee\ui

隨後用 apktool 重打包並安裝運行,在 Android Studio 中打開 logcat ,過濾 tag 爲 InjectLog,查看日誌輸出。
在這裏插入圖片描述
so easy !
我們可以看到在 PayeeQRSetMoneyActivity 界面 onClick 點擊 確定 按鈕後,執行了幾個函數,後面到了
PayeeQRActivity.onActivityResult() 的時候,其實 確定 按鈕的功能代碼已經執行完了,得到了二維碼結果並返回了上一個界面PayeeQRActivity。這樣一來,大大的進一步縮小了重點關注的範圍,只需要在這幾個函數上研究反編譯的JAVA代碼,很快就能找到關鍵點。
在這裏插入圖片描述
果然,很快就找到了關鍵實現代碼:

    ConsultSetAmountReq localConsultSetAmountReq = new ConsultSetAmountReq();
    localConsultSetAmountReq.amount = this.g;
    localConsultSetAmountReq.desc = this.c.getUbbStr();
    localConsultSetAmountReq.sessionId = this.h;
    new RpcRunner(new cs(this), new cr(this)).start(new Object[] { localConsultSetAmountReq });

構造一個 ConsultSetAmountReq 對象,分別賦值 amount 金額,desc 備註,sessionid,然後放入RpcRunner中向服務器發送請求。接下來,繼續深入分析他是怎麼發的請求,或者止步於此,直接使用Xposed注入模塊到支付寶進程中,調用這段代碼就能實現相同的效果。

另外,關於有的APK使用 apktool 解包或打包出錯。重新打包後的微信、支付寶等APK,簽名驗證不通過而無法登陸該怎麼辦,在後續文章中我們將一一道來。

日誌注入工具更新內容:
2019年05月31日
輸出函數名的時候增加了序號,方便觀察,以免同名函數反覆調用的時候擾亂視覺
在這裏插入圖片描述

本文由encoderlee發表於CSDN博客: https://blog.csdn.net/CharlesSimonyi/article/details/90691417 轉載請註明出處

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