Java Class 文件加密的问题
除了混淆之外,class 文件加密是一种容易想到的代码保护方法。许多方案使用代理来加密 class 文件,并在类加载时解密。然而,这些方案忽视了一个重要的点——JVM 的内置附加机制。
JVM 附加机制
为了方便分析和监控程序运行,普通 JVM 都带有附加功能。用户可以使用 jhsdb 等工具附加到 JVM 进程,查看和分析其内存数据。而且这些内存数据按照源文件中的数据结构进行了妥善组织,也可以理解为 JVM 的内置后门机制。
以下文章介绍了如何使用 JVM 附加机制读取和保存内存中的 class 文件信息。
https://protector4j.com/zh/articles/cracking-encrypted-java-applications-jhsdb/
除了使用 JDK 提供的 jhsdb 工具外,您还可以使用阿里巴巴的 Arthas 来分析正在运行的 Java 进程。
HOOK 相关函数获取动态加载的类信息
一些保护方案通过反射动态加载类信息,这种方式也可以通过 DLL 注入来获取实时加载的类信息。更多详情请参考以下两个项目。
https://github.com/ViRb3/jvm-dump-proxy
https://github.com/zorftw/JVM-Native-Classdumping
结论
由于 JVM 附加机制或二进制 HOOK 机制的存在,所有未脱离正常 JVM 运行的所谓加密代码都可以通过附加工具轻松读取或通过 DLL 注入进行 hook。因此,这是最无效的保护方案。