代码混淆的问题

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

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

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

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

JVM字节码是一种语义非常清晰、明确、可读性很强的中间代码。对于混淆后的类文件,即使无法恢复为可读的Java源代码,仍然可以在字节码级别进行分析。由于Java字节码的高语义性质,这个过程实际上相对容易。

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

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

我们使用这个引擎来尝试破解一个众所周知的混淆代码,具体过程可以参考下面的文章

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

结论

从上面的分析可以看出,由于JVM字节码的语义性很高,非常容易被分析和阅读。通过动态调试可以方便地分析运行逻辑。编写动态调试工具并不是一项非常复杂的任务,因此混淆并不是可靠的保护解决方案。