代码混淆的问题

代码混淆是最早应用于 Java 代码保护的解决方案,也是最直接的解决方案。

代码混淆通常涉及以下四种方法:

  1. 包名、类名、变量名转换
  2. 控制结构发生变化,例如控制流扁平化、添加不可变谓词等。
  3. 字符串混淆或加密
  4. 添加无用代码

代码混淆可以显著降低反编译代码的可读性,增加静态分析的难度,但无论如何进行代码混淆,程序的执行逻辑都不会改变。

JVM 字节码是一种语义清晰明确的中间代码,具有很高的可读性。对于混淆的类文件,即使无法还原成可读的 Java 源代码,仍然可以在字节码层面进行分析。由于 Java 字节码的高度语义性,这个过程实际上相对容易。

我们使用 Java 和 Kotlin 语言开发了一个 JVM 字节码执行引擎。用户可以使用此项目在 IntelliJ IDEA 中动态调试 Java 程序的字节码级别。更多信息,请参阅以下文章。

https://protector4j.com/articles/jvm-bytecode-engine-written-with-java-and-kotlin/

我们使用此引擎尝试破解一段著名的混淆代码,具体过程可参考以下文章。

http://protector4j.com/articles/deobfuscate-with-vlx-vmengine/

结论

从以上分析可以看出,由于JVM字节码语义性高,很容易被分析和读取。通过动态调试可以轻松分析其运行逻辑。编写动态调试工具并非难事,因此混淆并非可靠的保护方案。