標籤:分析師 安裝 檔案名稱 www 內容 特質 tag and 檔案路徑
http://www.cnblogs.com/jiaoxiake/p/6818786.html內容如下
導語:上一篇我們分析android脫殼使用對dvmDexFileOpenPartial下斷點的原理,使用這種方法脫殼的有2個缺點:1. 需要動態調試2. 對抗反調試方案為了提高工作效率, 我們不希望把寶貴的時間浪費去和加固的安全工程師去做對抗。作為一個高效率的逆向分析師, 筆者是忍不了的,所以我今天給大家帶來一種的新的脫殼方法——DexExtractor脫殼法。 資源地址:DexExtractor源碼:https://github.com/bunnyblue/DexExtractor DexExtractor脫殼原理1. 一個DEX檔案需要被解析成Dalivk虛擬機器能操作對象DvmDex, 解析過過程中就必須調用 DexFile* dexFileParse(const u1* data, size_t length, int flags)。2. dexFileParse 函數原型如下: DexFile* dexFileParse(const u1* data, size_t length, int flags) data :檔案就是DEX檔案經過最佳化後再記憶體中資料的首地址。 length:檔案就是DEX檔案經過最佳化後再記憶體中資料的長度。 3. DexExtracctor就是重寫 dexFileParse函數,在原函數實現基礎上,將記憶體中DEX檔案中資料經過Base64加密,寫到行動裝置的SD卡4. 使用Base64加密是為了對有些加固代碼,對read.write 函數進行hook。 原理分析:根據上篇日誌《android 脫殼 之 dvmDexFileOpenPartial斷點脫殼原理分析》我們知道一個Dex檔案載入必須經過dvmDexFileOpenPartial函數,這個函數內調用 dexFileParse 進行解析Dex檔案成DexFile 我們看看Android 源碼中dexFileParse的實現 再看看DexExtractor的 dexFileParse 的實現,你發現這裡面比android 源碼多了兩行代碼,而且這兩行的編碼格式不符合一個優秀的程式員的特質,竟然沒有代碼對齊,這是作者有意為之, 引起代碼讀者的注意。 DexHacker 是DexExtraor作者自訂一個類。你會發現會調用DexHacker類的weiteDex2Encode, 分析到這你這裡關鍵字Encode, 為什麼需要加密, 所以我們繼續分析函數writeDex2Encoded。 可以看出使用base64對Dex檔案加密, 加密的Dex儲存在SD卡中, 檔案名稱和應用程式有關。注意:這裡我們看到加密的dex檔案儲存到SD卡, 我們知道這個操作需要Android應用程式有需要給這個應用添加一個寫sd卡的許可權:
<uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE”/>
這裡我們會有一個疑問: 為什麼要對DEX檔案進行加密,這樣還要解密,這樣不是更加的麻煩嗎?1. 這個主要是為了對抗加固策略,現在一些加固平台,比如梆梆加固,會對dex的記憶體dump脫殼進行檢測,具體的就是hook修改當前進程的read、write讀寫相關的函數,一旦檢測到read,write讀寫相關的函數的操作中有對dex檔案的dump行為會有對抗的處理,防止dex的記憶體dump。DexExtractor脫殼工具的作者考慮為了過掉這種記憶體dump的對抗,需要先將原始的dex檔案資料進行base64加密, 加密後,就沒有DEX檔案格式的特徵啦。 2. 這個解密工具也在github目錄下Decode.jar,用法:java -jar Decode.jar dexdir;這裡需要注意的是,dexdir是我們pull出dex之後的目錄,記住是目錄,不是對應的dex檔案哦! DexExtractor脫殼法的脫殼步驟 由於筆者看過一個大牛使用DexExtrator 脫殼執行個體: http://www.wjdiankong.cn/apk%E8%84%B1%E5%A3%B3%E5%9C%A3%E6%88%98%E4%B9%8B-%E5%A6%82%E4%BD%95%E8%84%B1%E6%8E%89%E6%A2%86%E6%A2%86%E5%8A%A0%E5%9B%BA%E7%9A%84%E4%BF%9D%E6%8A%A4%E5%A3%B3/寫得很好,很詳細, 就簡單提煉出,脫殼步驟吧。 1、給Android 裝置 安裝 DexExtractor功能, 我們分析DexExtractor的原理, 我們需要重寫函數dexFileParser
- 在Android源碼(AOSP)中,添加DexExtractor功能, 然後編譯產生system.img,但是這個system.img 只使用餘google手機和模擬器(你如果不想編譯,這裡給出了一個修改之後的system.img:https://pan.baidu.com/s/1jG3WQMU,這個檔案是Android4.4系統的)
- 你如果沒有google手機,也不想使用模擬器, 你可以替換手機系統的libdvm.so,DexExtractor的github 有提供(ARM, X86兩個版本)
- 你使用你的手機支援 CM/LineageOS/TheMuppets 系統, 你可以下載他們源碼,然後使用DexExtractor源碼重寫函數dexFileParse,然後編譯,刷機。 (筆者支援這麼幹, 不過筆者還沒弄過, 這麼幹,主動權全在我們手裡)
2、添加寫SD卡許可權。如果應用程式沒有SD卡許可權, 就需要然後在AndroidManifest.xml中添加<uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE”/>,然後在回編譯重簽名即可。3、查看脫殼程式對應的日誌,tag是dalvikvm。發現create file end等資訊段。找到脫殼之後的dex檔案路徑。4、將sd卡中脫殼之後的dex檔案匯出到本地,在使用Decode.jar工具進行解密即可。5、解密之後的dex格式odex,所以為了使用jadx方便查看代碼邏輯,可以使用smali.jar工具將其轉化成dex檔案。
android脫殼之DexExtractor原理分析[zhuan]