上次我们提到了还有另外一个脱壳点,这个脱壳点就是DexClassLoader
根据上次我们写到的脱壳:正确的时机,dex起始位置的大小
前人已经指出来时DexClassLoader,那么我们只要跟踪就好了
从这里我们可以看到DexClassLoader也是继承BaseDexClassLoader,构造方法也是从BaseDexClassLoader来到的
查找BaseDexClassLoader
可以看到又来到了DexPathList,DexPathList跟原来上篇文章写的很像
从DexPathList到了 makeDexElements。
跟踪 makeDexElements
从for循环里面了,无论是if 还是else都走了 loadDexFile,看着这个应该是加载Dex文件的
查找loadDexFile
loadDexFile如果if最终就是走到了DexFile构造函数无下文,如果是else就是走到了loadDex
跟踪loadDex,最终都是回到了DexFile
查看DexFile,DexFile又是回到了我们第一个脱壳点,但是这个脱壳点和第一个是不一样的。从这里可以看到DexFile里面已经存在了2个脱壳点
可以可以看到在经过一个try catch是没有做任何调整的。第一个调整的地方在openDexFile。跟踪openDexFile
openDexFile最终到了 openDexFileNative。Native函数,这个时候进入到c里面查看这个函数
openDexFileNative
dalvik_system_DexFile.cc
第一个对dex相关的是OpenDexFilesFromOat,查看OpenDexFilesFromOat
从这个里面已经看到了dex location,意味着我们已经接近了dex的起始位置
第一对dex有相关动作的是oat_file_assistant
跟踪oat_file_assistant在oat_file_manager.cc
又是回到了Open函数,这个地方就和上次的Open一样了,只不过调用的不一样
第一个与file相关的就是OpenAndReadMagic
跟踪OpenAndReadMagic,与脱壳点能够对应上了
本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者及本公众号不为此承担任何责任。
欢迎关注公众号“呼啦啦安全”,原创技术文章第一时间推送。
原文始发于微信公众号(呼啦啦安全):安卓逆向系列七-脱壳点原理(二)