代码混淆的问题
代码混淆是最早应用于Java代码保护的解决方案,也是最直接的解决方案。
代码混淆通常涉及以下四种方法:
- 包名、类名、变量名转换
- 控制结构发生变化,例如控制流扁平化、添加不可变谓词等。
- 字符串混淆或加密
- 添加无用代码
代码混淆会显着降低反编译代码的可读性,增加静态分析的难度,但无论如何进行代码混淆,都不会改变程序的执行逻辑。
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字节码的语义性很高,非常容易被分析和阅读。通过动态调试可以方便地分析运行逻辑。编写动态调试工具并不是一项非常复杂的任务,因此混淆并不是可靠的保护解决方案。