在分析一个程序的Java层逻辑,进行反编译时,偶尔会发现代码中所有的函数名、变量名、类名等都变成了一些杂乱无章的名字,它们没有任何规律可言,这就是程序的混淆。

Java代码混淆就是为了保护Java源代码,对编译好的class文件进行混淆处理。混淆就是对发布出去的程序进行重新组织和处理,通过一些工具,对函数名、变量名、类名、字段进行批量重命名。使得处理后的代码与处理前代码完成相同的功能,而混淆后的代码很难被反编译,即使反编译成功也很难得出程序的真正语义。

一: 混淆的例子及作用

在学习混淆之前,先来看一下没有被混淆的例子,下面是程序的反编译,如下图所示。

Java代码混淆

从图中可以发现,这里的反编译逻辑非常清楚,反编译之后的源码和当时写的代码完全相同。

保护Java源代码的第一步就是混淆,对代码进行修改,让反编译出来的代码不容易被看懂,具体的操作流程如下所示。

1.打开androidkiller工具,如下图所示。

Java代码混淆

2.打开其中一个smali文件夹,如下图所示。

Java代码混淆

打开后,发现里面内容已被修改,正常开发中不会存在这种命名,如下图所示。

Java代码混淆

3.任意打开其中一个文件,会发现代码也发生了相应的变化,如下图所示。

Java代码混淆
4.此时需要借助jdax-gui工具,将代码进行还原处理,如下图所示。

Java代码混淆
5.还可以借助一些工具,达到简单混淆的目的,点击面层菜单中的图标,它会将把代码重新混淆,如下图所示。

Java代码混淆
6.再次打开,则会对代码重新反编译并且重命名,更加方便我们进行区分,如下图所示。

Java代码混淆

注意:混淆只是增加逆向的时间,但整体的逻辑不会混淆。也就是说,代码混淆并不能一劳永逸地解决代码保护的问题,它只是把读代码的时间变得比开发代码的时间还要长。

二:ProGuard介绍以及混淆特点

ProGuard就是一个混淆代码的开源项目,能够对字节码进行混淆、缩减体积、优化等处理。ProGuard还包括以下4个功能:

  • 压缩(Shrink):检测并移除代码中无用的类、字段、方法和特性(Attribute)。

  • 优化(Optimize):对字节码进行优化,移除无用的指令。

  • 混淆(Obfuscate):使用a,b,c,d这样简短而无意义的名称,对类、字段和方法进行重命名。

  • 预检(Preveirfy):在Java平台上对处理后的代码进行预检,确保加载的class文件是可执行的。

总而言之,Proguard是一个Java类文件压缩器、优化器、混淆器、预校验器。压缩环节会检测以及移除没有用到的类、字段、方法以及属性。优化环节会分析以及优化方法的字节码。混淆环节会用无意义的短变量去重命名类、变量、方法。这些步骤让代码更精简,更高效,也更难被逆向(破解)。

ProGuard工作原理

ProGuard由shrink、optimize、obfuscate和preveirfy四个步骤组成,每个步骤都是可选的,我们可以通过配置脚本来决定执行其中的哪几个步骤。

小结

知道了混淆的概念是指通过一些工具,对函数名、变量名、类名,字段进行重命名。同时,对混淆和非混淆例子之间的区别以及混淆的特点也有了一定的了解。