在上篇文章中(回顾点这)介绍了混淆的基本原理,但是那种方法实现的混淆Dex在安装的时候会报错:

经过一段时间研究后在源码(/dalvik/libdex/DexSwapVerify.cpp)中找到答案:

在加载dex文件时android系统会对dex文件做一系列的验证:

其中的关键是crossVerfyEverything这个函数,具体如下:

这个函数通过一个while循环对Dex文件中的各个结构体进行验证,其中的crossVerfyStringIdItem函数实现了对string数据的验证:

再用dex读取器读取某dex文件的string验证上面的说法:

dexsss

看到这里就很清楚了,dex中的string是按照字典序排列的,这样做可能是为了优化查找速度。在混淆之后就不再是字典序排列了,所以说用随机字符串混淆后在安装时会报错。

注:只混淆类名的话有时能够安装成功,因为类字符串为Lxxx/yyy/zzz,可能在类名前面的包名就已经排序完毕,所以用随机字符串单独混淆类名的话有可能成功。

研究到这里才知道dex混淆并不容易,要做出像proguard那样工具基本上需要重写整个dex文件。不过经过这段时间的研究学习,已经对dex文件有了很清晰的认识,对后面的加壳还是有很大帮助的。

 

观看更多有关 的文章?

*

+
跳转到评论