一個section加密的apk的分析

一個section加密的apk的分析

6 人贊了文章

這個apk是去年參加某個CTF比賽時候的一道題,當時沒做出來,這幾天整理文件翻出來了,決定再做一做,寫點筆記。

題目描述:某企業反饋其員工專用手機上,被安裝了一個間諜軟體,該軟體會不定期自動連接一個疑似黑客控制的伺服器,伺服器的連接密碼內嵌在該軟體中。逆向分析此間諜軟體,獲取其伺服器的連接密碼。

首先安裝運行一下。

拖到jadx裡面,可以看到java層並沒有什麼核心功能,關鍵是導入了一個net庫,用了裡面的upload函數。

解壓apk之後得到libnet.so,拖到IDA裡面提示 First Section must be SHT_NULL,很有可能section被加密了。

在IDA裡面看到有個.init_proc和JNI_OnLoad,JNI_OnLoad的代碼應該是被加密過的。

那麼這個時候我們就只能動態調試了,動態調試的步驟網上一搜一大堆就不再詳細寫了,這裡在linker下的斷點,

BLX R4之後就進入了.init_proc。

直到執行完sub_2C5A之後發現libnet.so已經消失了,取而代之的是debug077,同時JNI_OnLoad也被解密了出來。

這裡需要導入JNI,在IDA7.0以下的版本中通常是通過這篇文章中的方法導入JNI的。在IDA7.0及以上的版本中有一種更簡單的方法。View->Open subviews->Type Libraries,按下Insert,選擇android_arm(IDA6.8裡面沒有這個庫所以不能用這個方法)。

打開Structures,按下Insert,選擇Add standard structure,選擇_JNIEnv 和 JNINativeMethod。

把變數的類型改成 JNIEnv*,Force call type,現在看起來舒服多了。

這裡在 JNI_OnLoad 中通過 RegisterNatives 註冊了 java 層需要調用的 native 方法,我們到 0x7579411C 看看。

IDA沒有識別出來這個結構體,我們手動添加一下。右鍵 Structure,選擇 JNINativeMethod,函數名為Upload,地址為 0x7578E30C,這個函數就是我們在java層看見的函數了,到這個地址看看。

右鍵Create Function,但是提示 debug077:7578FBD0: The function has undefined instruction/data at the specified address。

直接按C,全部轉成代碼,就可以創建函數然後F5了。

這裡兩個異或非常可疑,寫個腳本看看異或之後的值是多少。

#include <idc.idc> static main(){ auto start,end,ptr; auto key; start=0x75794004; key=0; for(ptr=start;ptr<=start+11;ptr++) { Message("%c",Byte(ptr)^key); key++; } Message("
"); key=0; for(ptr=start+12;ptr<=start+20;ptr++) { Message("%c",Byte(ptr)^key); key++; } }

解出來這兩個字元串就應該是答案了。

總結一下:

1.一定還是要用真機調試,bug少點,nexus4就兩三百塊錢。我等屌絲還是應該搞android,比學ios/macos便宜多了。

2.關於IDA導入JNI

這個文章中已經說了有兩種方法,IDA7.0以下的版本需要手動導入jni.h文件,IDA7.0及以上的版本可以使用內置的庫。

3.關於程序的debuggable選項

這一點文章中沒提,如果程序的debuggable選項未開啟就直接jdb去attach的話是調試不了的,會出現下面這樣的錯誤。

可以修改 AndroidManifest.xml中的debuggable="true" 然後簽名重打包;或者修改系統屬性將defalut.prop中ro.debuggable設置為1。

這兩種方法操作起來其實都很麻煩而且容易遇到各種各樣的問題,所以我一般用的方法一個是riusksk的BDopener,一個是netsniffer優化的mprop。

這兩個工具更方便。如果還是報錯的話可以打開DDMS,點一下你要調試的進程,點了之後會出現8700的埠和紅色的蟲子。這個時候再attach應該就沒問題了,成功attach上去蟲子會變成綠色。

4.關於讓程序停在載入so文件之前

這一點文章中也沒提,

其實也有幾種方法,一個是在System.loadLibrary之前加入waitForDebugger的代碼;一個是用am命令的-D參數以debug模式啟動程序;一個是開啟手機的開發者選項之後在選擇調試應用中選擇要調試的應用,並且勾選等待調試器選項。毫無疑問最後一種方法是最簡單的。

來源:[原創]一個section加密的apk的分析-『Android安全』-看雪安全論壇

本文由看雪論壇 houjingyi 原創

轉載請註明來自看雪社區


推薦閱讀:

對手機應用程序的簡單實用性修改
.net程序源代碼如何避免被反編譯

TAG:加密 | 反編譯 | 軟體破解 |