回顾

本系列文章到这里就已经到尾声了,在第二章时,我给大家介绍了很多相关的知识,这些知识是学习本系列文章的基础。接着在第三章中,我介绍了目前流行的相似度识别方案,并针对网上没开源的方案进行简单模拟实现。之后在第四章中,我介绍了一些代码混淆的方案,这些方案只是给大家个引子,希望大家能够举一反三,想出更多更好的方案。

分析

现在我们已经能够把代码混淆得面目全非了,但是怎么才能知道它的混淆效果了呢?一般做法有两种,一是人工分析,二是通过工具自动化分析。

人工分析很难有个衡量标准,所以这里我打算使用工具自动化分析。在第三章中,我介绍了一些相似度分析工具,这里我就用那三个相似度分析工具进行分析,并比较。

接下来使用的混淆工具,都进行了随机混淆处理,也就是说两次分别处理的应用,混淆效果是不一样的,而后面的分析结果,除重打包是基于处理前后的应用外,其它都是基于两次分别处理的应用。

下面是开源中国的测试结果:

基于代码流 基于变量计数 基于API序列
重打包 92.414% 98.317% 99.991%
加密字符串 80.703% 98.635% 99.880%
反射属性 79.878% 97.770% 91.986%
反射方法 69.122% 94.892% 76.282%
指令替换 92.718% 99.802% 100%
代码乱序 86.923% 100% 100%
重构方法 73.614% 95.752% 99.857%
重构并合并方法 74.938% 93.792% 98.704%
重构到本地方法 84.638% 97.053% 80.781%
使用全部 38.593% 72.844% 57.539%

我们看到反射调用的效果基本都比较不错,但反射调用对效率影响非常大,这里是5%左右的随机转换得出的结果,如果比例更高,效果更明显。

这里的测试并没给出花指令,我们说过,代码乱序实际也是花指令的一种,这里也可以看到花指令对于基于代码流的方式有比较大的影响,而对基于变量与基于API序列看似没影响,实际是由于代码乱序所用的指令比较特殊,如果换成其它花指令,影响肯定是会有的。

这里只对开源中国进行测试,有兴趣的可以测下其它应用,不过如果是比较大的应用的话,基于代码流的测试可能会失败,这一般是内存不足的原因。