android脫殼之DexExtractor原理分析


導語:

上一篇我們分析android脫殼使用對dvmDexFileOpenPartial下斷點的原理,使用這種方法脫殼的有2個缺點:
1.  需要動態調試
2.  對抗反調試方案
為了提高工作效率, 我們不希望把寶貴的時間浪費去和加固的安全工程師去做對抗。作為一個高效率的逆向分析師, 筆者是忍不了的, 所以我今天給大家帶來一種的新的脫殼方法——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脫殼法的脫殼步驟

 
寫得很好,很詳細, 就簡單提煉出,脫殼步驟吧。
 
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文件。

 

關於筆者

 
微信公眾號:編碼安全
 
微信:蕉下客
 
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
如果你覺得博客對你有用,且你手頭又有富裕,可以打賞一下!!!!
 
知識共享時代,做一個優秀內容提供者。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 


免責聲明!

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



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