在脱壳的时候经常见到在dvmDexFileOpenPartial这个函数下断点,但是为什么要在这里下断点呢,这篇文件就从源码的角度跟踪一下Dex的加载流程。

源码可以在这里查看:/dalvik/dexopt/OptMain.cpp

OptMain中的main函数就是加载dex的最原始入口,是用c代码写成的native函数:

可以看到,这里会分别对3中类型的文件做不同处理,我们关心的是dex文件,所以接下来看看fromDex函数:

这个函数先初始化了一个虚拟机,然后调用dvmContinueOptimization函数(/dalvik/vm/analysis/DexPrepare.cpp),进入这个函数:

这个函数中对Dex文件做了一些优化(如字节重排序,结构对齐等),然后重新写入Dex文件。如果优化成功的话接下来调用dvmDexFileOpenPartial,而这个函数中调用了真正的Dex文件。在具体看看这个函数(/dalvik/vm/DvmDex.cpp):

这个函数的前两个参数非常关键,第一个为这个Dex文件的起始位置,第二个为这个Dex文件的大小

接下来调用dexFileParse函数就是具体的解析这个Dex文件了。分析到这,就能明白为什么很多脱壳教程都要在dvmDexFileOpenPartial这个函数下断点了。

 

观看更多有关 的文章?

*

+
跳转到评论