这是看别人的文章学习的,当然还有加点自己的思考,截图用自己的,这样的学习才有效果啊
学习附件及文档:(这是别人的)http://pan.baidu.com/s/1nuyxc9N 密码:d29f
本文链接:http://blog.csdn.net/u012763794/article/details/52511788
原理篇
dvmDexFileOpenPartial这是函数是关键,据说在这下 断点就可以了,看名字就是虚拟机去打开Dexfile的意思,应该那时已经解壳完成了吧
函数原型:
int dvmDexFileOpenPartial(const void* addr, int len, DvmDex** ppDvmDex);
第一个参数就是dex内存起始地址,第二个参数就是dex大小。所以在这个函数下断点可以直接dump出明文dex.
int dvmDexFileOpenPartial(const void* addr, int len, DvmDex** ppDvmDex);
第一个参数就是dex内存起始地址,第二个参数就是dex大小。所以在这个函数下断点可以直接dump出明文dex.
为了深入学习我们去看看安卓源码
,这个参考底部有个大神的

这个应该是优化dex的,odex相关的东西,小白我不懂的
这里分别对三种不同类型的文件做不同的处理,传进去的参数是--dex就走中间那一步了,我们跟进去
根据log信息,我们知道,显示初始化VM虚拟机(应该是dalvik虚拟机吧)
跟着就执行优化,我们看看那个优化
可以看到上面的英文注释:重写文件,字节重排,结构重排,类验证,字节优化都在那个rewriteDex函数中,优化成功下面才去调用我们的dvmDexFileOpenPartial
可以看到第三个参数为NULL
既然这样,我们继续跟进
可以看到里面调用了dexFileParse,就是解析dex文件的了,既然都开始解析dex文件了,那么壳肯定已经对dex解密完成了,不然也无法解析啊
顺手简单看看是如何解析