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)造一個OatFileAssistant對象,用于輔助從OAT文件中加載DEX。

繼續(xù)看openDexFilesFromOat,這里假設(shè)該DEX是第一次被加載,系統(tǒng)中不存在對應(yīng)的OAT文件。

先后調(diào)用了OatFileAssistant的MakeUpToDate和GetBestOatFile方法。

再繼續(xù)看OatFileAssistant的GetDexOptNeeded方法。

因為是第一次加載該DEX,所以返回kDex2OatNeeded,MakeUpToDate將會調(diào)用GenerateOatFile為DEX生成對應(yīng)的OAT文件。

GenerateOatFile調(diào)用Dex2Oat(Dex2Oat最終是調(diào)用execv執(zhí)行Android系統(tǒng)中的/system/bin/dex2oat)來為DEX生成OAT文件。
現(xiàn)在假設(shè)正在加載的DEX,是一個被加固程序處理過的DEX,并且DEX殼代碼HOOK execv函數(shù),阻止了OAT文件的生成?;氐給penDexFilesFromOat,繼續(xù)看OatFileAssistant的GetBestOatFile方法。

因為沒有對應(yīng)的OAT文件,所以最終返回空指針。再回到openDexFilesFromOat,繼續(xù)看剩余的代碼。

因為沒有對應(yīng)的OAT文件,所以最終會調(diào)用DexFile::Open方法來直接加載原始的DEX文件。
