LEGU脫殼


一、原理

騰訊樂固(http://legu.qcloud.com/)提供APK加殼技術,分析了一下,做了個簡單的脫殼程序。

以某新華字典APP為例,APK下載地址:https://apkpure.com/%E6%96%B0%E5%8D%8E%E5%AD%97%E5%85%B8/com.qiushui.android.app.chdir

加殼的方法是,將原始的 class.dex 的文件頭(DexHeader,長度為0x70個字節)使用某種方式進行加密,后面的數據保持不變,使用騰訊的代碼(TxAppEntry)加固;運行時從文件的特定偏移地址開始,解密出原始的DEX,從內存運行。這里分析的殼的版本是0.0.3.

 

二、分析過程

打開APK,在lib/armeabi 下面發現這幾個文件:

 

使用 linux下的 file 工具查看,可知:

 

libshella.so 是ARM平台用的,libshellx.so是X86平台用的,那么這兩個so內的函數應該完全一樣。

選擇在 Android 平台調試,用 IDA 打開so文件,附加到進程(方法參考:http://www.cnblogs.com/shaoge/p/5425214.html ),經過若干次的嘗試,終於找到解密的函數是:sub_5DCF4EA4。

目前可以這樣找,搜索字符串 start mem dex,通過 xref graph 找到使用這個字符串的地方,可以找到是在函數sub_5DCEF760中,由於此時的 dex 是已經解密好的,如果不關心加殼的過程,可以在這里直接在該函數下斷點,執行到這里時,用IDA的script來dump 內存,起始地址保存在寄存器 R0, 長度保存在寄存器R1.

 

如果關心解密過程,就向上查找,在函數  sub_5DE108E0 中,找到調用 sub_5DCF4EA4 之前的代碼(有多個地方調用,可以在運行時查看實際執行的代碼):

 

這里簡單解釋一下,過程大概如下:

  1. 獲取進程的PID,打開 /proc/{PID}/mmap 文件,查找 XX.apk@classes.dex,找到內存的起始地址;
  2. 在這個地址偏移0x3028個字節,復制0x70個字節(DexHeader的大小)進行解密,解密的算法參見后面的地址;
  3. 解密后就是原始的DEX了。

 

在執行中,通過查看內存,可以知道 XX.apk@classes.dex 是 odex 的格式,因此偏移了 0x3028 個字節,如果是普通的 dex 格式,則只需偏移 0x3000 個字節。

 

DEX 文件的大小就是 DexHeader 里面包含了(DEX文件格式 http://www.retrodev.com/android/dexformat.html),只需向后直接復制相應的長度即可。脫殼后的文件頭如下所示:

 

 

三、源代碼

    https://github.com/zbqf109/txshellunpack

四、參考文檔

  1. 騰訊應用加固的脫殼分析和修復http://www.52pojie.cn/thread-330022-1-1.html
  2. IDA遠程調試 在內存中dump Dex文件 http://www.cnblogs.com/shaoge/p/5425229.html
  3. android某加固脫殼
    (一) http://www.xiaobaiyey.com/618.html
    (二) http://www.xiaobaiyey.com/634.html
  4. Dex File Format http://www.retrodev.com/android/dexformat.html

五、用到的工具

    apktool http://ibotpeaches.github.io/Apktool/

    dex2jar https://github.com/pxb1988/dex2jar

 

聲明:僅供個人學習,不得用於其他用途。


免責聲明!

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



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