代码混淆的问题
代码混淆是最早应用于 Java 代码保护的方案,也是最直接的方案。
代码混淆通常包括以下四种方法:
- 包名、类名、变量名转换
- 控制结构变换,如控制流扁平化、添加不变谓词等
- 字符串混淆或加密
- 添加无用代码
代码混淆可以显著降低反编译代码的可读性,增加静态分析的难度,但无论如何混淆,程序的执行逻辑都不会被改变。
JVM 字节码是一种非常清晰明确的语义中间代码,具有很高的可读性。对于混淆后的 class 文件,即使无法还原为可读的 Java 源代码,仍然可以在字节码层面进行分析。由于 Java 字节码的高度语义化特性,这个过程实际上相对容易。
我们使用 Java 和 Kotlin 语言开发了一个 JVM 字节码执行引擎。用户可以使用这个项目在 IntelliJ IDEA 中对 Java 程序进行字节码级别的动态调试。更多信息请参阅以下文章。
https://protector4j.com/zh/articles/jvm-bytecode-engine-written-with-java-and-kotlin/
我们还使用该引擎尝试破解一个知名的混淆代码,具体过程可以参考以下文章
https://protector4j.com/zh/articles/deobfuscate-with-vlx-vmengine/
结论
从以上分析可以看出,由于 JVM 字节码的高度语义化特性,非常容易被分析和阅读。通过动态调试可以轻松分析其运行逻辑。编写动态调试工具并不是非常复杂的任务,因此混淆不是一种可靠的保护方案。