Android安全交流群:478084054
接上文腌紧,繼續(xù)看art/runtime/native/dalivk_system_DexFile.cc中的DexFile_openDexFileNative靜態(tài)方法阅束。
在DexFile_openDexFileNative中調(diào)用了ClassLinker的openDexFilesFromOat來加載DEX冀偶。
openDexFilesFromOat的內(nèi)容比較多,分段來看呈队,先構(gòu)造一個(gè)OatFileAssistant對(duì)象枪蘑,用于輔助從OAT文件中加載DEX垒玲。
繼續(xù)看openDexFilesFromOat陆馁,這里假設(shè)該DEX是第一次被加載,系統(tǒng)中不存在對(duì)應(yīng)的OAT文件侍匙。
先后調(diào)用了OatFileAssistant的MakeUpToDate和GetBestOatFile方法氮惯。
再繼續(xù)看OatFileAssistant的GetDexOptNeeded方法叮雳。
因?yàn)槭堑谝淮渭虞d該DEX想暗,所以返回kDex2OatNeeded,MakeUpToDate將會(huì)調(diào)用GenerateOatFile為DEX生成對(duì)應(yīng)的OAT文件帘不。
GenerateOatFile調(diào)用Dex2Oat(Dex2Oat最終是調(diào)用execv執(zhí)行Android系統(tǒng)中的/system/bin/dex2oat)來為DEX生成OAT文件说莫。
現(xiàn)在假設(shè)正在加載的DEX,是一個(gè)被加固程序處理過的DEX寞焙,并且DEX殼代碼HOOK execv函數(shù)储狭,阻止了OAT文件的生成〉方迹回到openDexFilesFromOat辽狈,繼續(xù)看OatFileAssistant的GetBestOatFile方法。
因?yàn)闆]有對(duì)應(yīng)的OAT文件呛牲,所以最終返回空指針刮萌。再回到openDexFilesFromOat,繼續(xù)看剩余的代碼娘扩。
因?yàn)闆]有對(duì)應(yīng)的OAT文件着茸,所以最終會(huì)調(diào)用DexFile::Open方法來直接加載原始的DEX文件。