更強脫殼器的不同思路
分析Fart和Youpk的整體dump組件
Fart整體dump思路的演進
APP中的Application類中的attachBaseContext和onCreate函數(shù)是app中最先執(zhí)行的方法。
因此需要選在在Application的onCreate函數(shù)執(zhí)行之后才開始被調(diào)用的任意一個函數(shù)中。
比如選擇在ActivityThread中的performLaunchActivity函數(shù)作為時機,來獲取最終的應(yīng)用的Classloader。
獲取到應(yīng)用解密后的dex文件最終依附的Classloader之后
通過java的反射機制最終獲取到對應(yīng)的DexFile的結(jié)構(gòu)體,并完成dex的dump
所有類和方法的裝載和鏈接/編譯和執(zhí)行流程之中
ART下DexFile類中定義了兩個關(guān)鍵的變量: begin_、size_以及用于獲取這兩個變量的Begin()和Size()函數(shù)
這兩個變量分別代表著當前DexFile對象對應(yīng)的內(nèi)存中的dex文件加載的起始位置和大小。
只要有了這兩個值,我們就可以完成對這個dex的dump。
類裝載的流程
1、裝載:查找和導(dǎo)入Class文件
2、鏈接:其中解析步驟是可以選擇的
(a)檢查:檢查載入的class文件數(shù)據(jù)的正確性
(b)準備:給類的靜態(tài)變量分配存儲空間
(c)解析:將符號引用轉(zhuǎn)成直接引用
3、初始化:即調(diào)用<clinit>函數(shù),對靜態(tài)變量,靜態(tài)代碼塊執(zhí)行初始化工作
Fart整體dump思路的演進
找到繞過dex2oat的時機
類的初始化函數(shù)始終運行在ART下的inpterpreter模式
在解釋執(zhí)行<clinit>時進行脫殼 實現(xiàn)“繞過”dex2oat
因此必然進入到interpreter.cc文件中的Execute函數(shù),進而進入ART下的解釋器解釋執(zhí)行
同時在dex2oat和類的初始化流程函數(shù)設(shè)置“hook”
Youpk的整體dump思路
App啟動后10s開始
禁用dex2oat:在dex2oat中設(shè)置 CompilerFilter 為僅驗證
compiler_options_->SetCompilerFilter(CompilerFilter::kVerifyAtRuntime);
從ClassLinker中遍歷DexFile對象并dump
推薦閱讀:https://bbs.pediy.com/thread-254028.htm
Youpk+Fart 整體dump進一步提升
在安卓8上禁用dex2oat
結(jié)合fart所提出的海量脫殼點
推薦閱讀
- https://bbs.pediy.com/thread-252630.htm
- https://bbs.pediy.com/thread-254028.htm