Java 反编译和混淆 - bfchengnuo/MyRecord GitHub Wiki

Java 的字节码里记录了变量名,类名,函数名等等,所以,反编译 Java 是很容易的。悲愤的人们发明了 混淆 Java 代码 的方法。

混淆 Java 代码是门科学,也是门艺术。最初,人们将变量名、方法名和类名替换成无意义的字符串。这大大降低了代码的可读性。不过,如果耐心一点,并且在 Eclipse 等工具的帮助下,还是能读懂,并且将这些代码修改为自己所用。

他们混淆类名的时候还专门使坏,将类名替换成为A以及a,那么对应的文件名也是区分大小写的A和a,那么 Windows 系统就悲剧了。这种方法将一大部分程序员挡在了 Java 反编译的大门之外,因为他们发现不了少了几个文件。

后来,有些人发现了一个秘密, Java 字节码文件将同名同参,但返回值类型不同的函数看作是不同的函数。但 Java 源代码是不许这么做的。如果将函数混淆为这样同名的函数,之后再反编译出来的 Java 源文件将通不过编译。这招好狠毒好狠毒,他们把这招叫做侵略性重载,因为这一招过度利用了 Java 的重载功能。如果说以前的混淆都是在源代码层面上改改,那么这个混淆就是在字节码的层面动刀。重构工具在这一招面前也全部瘫痪。不过还是有人想出了对策(理论上,实际上我并没有实验成功),见附文。

现在 Android 的 apk 就默认使用了代码混淆术,所以反编译 apk 将变得比较困难。

混淆术不止这么简单,还有混淆包名、混淆包结构、增加无意义类等等方法。听说最近的前沿技术是更改程序流程,但不改变程序功能。这样的招数就更先进了。