入门ART虚拟机(2)——加载DEX文件续

接上文,继续看art/runtime/native/dalivk_system_DexFile.cc中的DexFile_openDexFileNative静态方法。

在DexFile_openDexFileNative中调用了ClassLinker的openDexFilesFromOat来加载DEX。

openDexFilesFromOat的内容比较多,分段来看,先构造一个OatFileAssistant对象,用于辅助从OAT文件中加载DEX。

继续看openDexFilesFromOat,这里假设该DEX是第一次被加载,系统中不存在对应的OAT文件。

先后调用了OatFileAssistant的MakeUpToDate和GetBestOatFile方法。

再继续看OatFileAssistant的GetDexOptNeeded方法。

因为是第一次加载该DEX,所以返回kDex2OatNeeded,MakeUpToDate将会调用GenerateOatFile为DEX生成对应的OAT文件。

GenerateOatFile调用Dex2Oat(Dex2Oat最终是调用execv执行Android系统中的/system/bin/dex2oat)来为DEX生成OAT文件。

 

现在假设正在加载的DEX,是一个被加固程序处理过的DEX,并且DEX壳代码HOOK execv函数,阻止了OAT文件的生成。回到openDexFilesFromOat,继续看OatFileAssistant的GetBestOatFile方法。

因为没有对应的OAT文件,所以最终返回空指针。再回到openDexFilesFromOat,继续看剩余的代码。

因为没有对应的OAT文件,所以最终会调用DexFile::Open方法来直接加载原始的DEX文件。



作者:十八垧
链接:https://www.jianshu.com/p/b89d0b03e82c
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值