Xdex(百度版)脫殼工具基本原理


【原創】Xdex(百度版)脫殼工具基本原理
作 者: sherrydl
時 間: 2015-12-13,10:52:45
鏈 接: http://bbs.pediy.com/showthread.php?t=206441

學習移動安全快一年了,最近花了一些時間寫了一個脫殼機(分百度版和通用版)。核心思想是:根據dalvik 獲取dex各個數據段的方式,我也用同樣的函數去獲取,然后一步一步去恢復成一個合法的dex文件。基本思想很簡單,也已有大牛實現過。
     這里先拿百度加固來舉例說明,百度加固相對於其它廠商的加固,好像並沒有在類加載的時候做什么事。其它廠商的加固有的會在類加載的時候執行靜態函數,有的會hook一些類加載的中間函數,才去恢復真正的數據。對於這些加固,必須去主動加載類,然后去獲取ClazzObject 數據結構,這里面的數據才可能真正是正確的,其余內存的dex大部分數據多半已經被抹掉成沒用的。但是主動加載類又會有很多其它的問題,比如 類的初始化會去優化指令,dvmLinkClass函數中:
名稱:  1.png
查看次數: 5
文件大小:  2.0 KB
     上面這個函數在一些特殊情況下又會去修改ClazzObject 中virtualMethodCount 原本的值,還有的加固會改變AccessFlag的最高位,這些都會對最后脫殼產生影響。關於需要主動加載類這一塊加固的脫殼,以后跟大家交流。
     下面還是回到百度加固的問題上來,由於百度加固並沒有在類加載的時候做什么事,導致我們不需要去主動加載類,我們直接可以通過dalvik的的一些函數去獲取所需要的數據,
在源碼目錄中:/dalvik/libdex/DexFile.h 和/dalvik/libdex/DexClass.h  ,這兩個文件里基本包含了所有的dalvik去獲取dex各個數據段的函數。如下圖:
名稱:  2.png
查看次數: 2
文件大小:  85.2 KB
點擊圖片以查看大圖

圖片名稱:	3.png
查看次數:	23
文件大小:	11.6 KB
文件 ID :	101891
(部分函數截圖)
      我們可以直接調用這些函數,或者去根據這些函數去獲取內存中dex數據的方式,寫出類似的代碼去獲取數據。這里比較重要的一點:因為是對dex每一塊最小的數據段都進行了再次獲取,所以需要對dex文件的格式有足夠的了解,這樣才能一步一步的恢復、重構成一個合法的dex文件,代碼實現起來比較麻煩點的就是重寫dex結構里的那些偏移。
      當然百度加固並沒有這么簡單,雖然沒有在類加載的時候干點坑人的事,但是有以下幾個需要解決的點。
1 .聽說有負偏移。 實際上這里的負偏移的含義是由於dex的DexMethod結構的codeOff是u4類型,而它的值過大,再加上dex 在內存的baseaddr ,結果就溢出了,這樣就造成的DexCode在內存的位置變成了baseaddr的上面去了,但是這種加固方案並木有對我這種脫殼方式有啥影響,對於靜態分析的大神進行脫殼修復就有一點麻煩了。

2. onCreate001 函數指令執行時存在,執行后抹去。關於這點,目前一些通用脫殼的方式是改變脫殼點的位置,然后去獲取抹去的指令。當onCreate001函數過多,這樣做好像有點麻煩。后來多虧某位大神的提醒,采用java反射的方式,能夠自動恢復所有onCreate001里的指令。經測試,的確可以
點擊圖片以查看大圖

圖片名稱:	4.png
查看次數:	18
文件大小:	17.8 KB
文件 ID :	101892


免責聲明!

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



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