代码混淆存在的问题

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

代码混淆通常有下面四种方法:

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

代码混淆可以大幅降低反编译代码的可读性,提升静态分析的难度,但是无论如何进行代码混淆,程序的运行逻辑是不会改变的。

JVM字节码上是一种语义很清晰明确,且极为阅读的中间代码,对于被混淆的class文件,即使无法还原成可读的Java源代码,仍然可以在字节码层面进行分析,由于Java字节码的高语义性,这个过程其实还是比较容易的

我们曾使用Java与Kotlin语言开发了一个JVM字节码执行引擎,用户可以使用这个项目在IDEA中对Java程序进行字节码级别的动态调试。具体可参考下面这篇文章

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

并且我们使用这个引擎尝试破解一个较为有名的混淆引擎混淆后的代码,具体过程可参见下面这篇文章

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

结论

从上面的分析中可以看到,由于JVM字节码的高语义性,使得期极为容易被分析与阅读,使用动态调试的方式可以很容易分析出其运行逻辑,而动态调试工具的编写并不是一件十分复杂的事情,因此混淆并不是一种可靠的保护方案。