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

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

作者: 十八垧 | 来源:发表于2017-07-02 13:49 被阅读534次

    Android安全交流群:478084054

    接上文,继续看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文件。

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/princxtx.html