Android逆向案例:幹掉梆梆加固免費版的反調試檢測

目標和現象

分析目標:某行手機客戶端

分析殼類型:
使用【d2j-dex2jar】反編譯後發現關鍵代碼缺失,因爲 AndroidManifest.xml 中的絕大部分activity和server的實現都是在 cmb.pb 這個包中,但是反編譯的代碼裏沒有 cmb.pb 這個包,只有一些無關緊要的第三方sdk,判斷其核心代碼進行了加固。隨後在反編譯的代碼看到了 “DexInstall” 類,並且搜索 “loadLibrary” 可以找到代碼 System.loadLibrary(“CmbShield”);
從apk中解壓出 libCmbShield.so ,使用 ida pro 反編譯分析,根據一些代碼特徵結合網上搜索,可以判斷出這個 so 其實就是 libSecShell.so 改了個名字,爲2018年的梆梆加固免費版,2019年的最新梆梆加固免費版好像已經不是這個了,所以本文可能沒法直接幫到你,主要目的還是在於總結思路,不斷積累進步。

調試:
無論是要脫殼還是分析,一個重要的步驟就是調試,安裝目標APK,依然是使用 Xposed + BDOpener 打開調試的大門,但是使用 AndroidStudio 附加到目標進程 cmb.pb 時,APP瞬間閃退消失,進程死亡,調試器斷開連接,估計這個殼做了反調試檢測。

分析

調試器附加上去的一瞬間,目標進程立即退出,很快就想到可能是調試操作觸發了它的檢測代碼,並使用 kill 之類的函數結束了自身,而非定時輪詢檢測。
在這裏插入圖片描述
查看死亡前的 logcat 果然找到了一些蛛絲馬跡:

2019-06-06 22:20:39.675 32678-32685/cmb.pb E/2g.out: libdvm_dvmDbgActive_stub called
2019-06-06 22:20:39.730 32678-32685/cmb.pb I/art: Debugger is active
2019-06-06 22:20:39.730 32678-32685/cmb.pb E/2g.out: kill:libdvm_dvmDbgActive_stub

不得不說這個殼實在是有點愚蠢,直接就給出了重要的關鍵信息,告訴你:

我在這兒呢,快來搞我呀

免費版的加固服務果然有免費版的特質,想不通某行這麼大的企業竟不願花錢買梆梆企業版。

依舊是打開 IDA Pro 分析這個 libCmbShield.so
在這裏插入圖片描述
ALT + T 搜索“ libdvm_dvmDbgActive_stub”,果然很快就找到了關鍵代碼,F5反編譯,原形畢露。
在這裏插入圖片描述
查看交叉引用,果然,該殼 Hook 了 libart.so 的 _ZN3art3Dbg8GoActiveEv() 函數,在調試器附加的時候,該函數被調用,實際調用的是被 Hook 替換後的 sub_1B330() 函數,然後在 sub_1B330() 函數中使用 unix api kill() 結束自身。

幹它

在這裏插入圖片描述
最簡單的辦法就是在 sub_1B330() 函數中把 kill() 的調用去掉。我們可以把

BLX kill
STR R0, [SP,#0x28+var_24]

這6個字節的指令替換爲

MOVS R0, R0
MOVS R0, #0
MOVS R1, #0

即做一個無用的空操作,然後讓函數返回值爲0,此處函數返回值爲64位的 int ,所以需要對 r0 r1 兩個寄存器均賦值爲0,原本的 kill() 函數如果執行成功理應返回0,我們也返回0儘量不對調用者產生影響。
在這裏插入圖片描述
替換指令我們使用到了 IDA Pro 的一個插件【keypatch】可以直接將 arm 指令轉換爲機器碼並填充上去,相當方便,否則你還需要查閱 arm 指令手冊或用其它小工具,自行翻譯爲機器碼後使用 010 Editor、UltraEdit 等16進制編輯器修改填充。

【keypatch】項目地址:https://github.com/keystone-engine/keypatch
在這裏插入圖片描述
修改後,直接在 IDA Pro 中,使用【Edit】-【Patch program】-【Apply patches to input file…】保存回二進制文件 libCmbShield.so

注意,libCmbShield.so 中可能有多個類似 sub_1B330() 的函數調用了 kill() ,我們在搜索和處理的時候,不要改了一處就以爲萬事大吉了,繼續搜索,改掉所有相似的地方。

驗證結果

接下來,由於手機已經 ROOT ,我們可以在 adb shell 下以 root 權限訪問系統目錄,我們把修改好的 libCmbShield.so push 到手機中,然後拷貝到目標APP的安裝目錄下覆蓋原來的 libCmbShield.so

adb push libCmbShield.so /sdcard/
adb shell
su
cp /sdcard/libCmbShield.so /data/app/cmb.pb-1/lib/arm/

在這裏插入圖片描述
重新啓動應用,使用 AndroidStudio 附加進程調試,果真沒有再閃退了,穩的好像一條20多年的老狗。
接下來就可以愉快的調試分析進行脫殼或調試我們開發的 Xposed 模塊了。


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

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