Java 类文件加密问题

除了混淆之外,类文件加密也是一种易于理解的代码保护方法。许多方案都采用代理来加密类文件,并在类加载期间对其进行解密。然而,这些方案忽略了一个重要方面:JVM 内置的附加机制。

JVM 挂载机制

为了便于分析和监控程序运行情况,普通的JVM都带有附加功能。用户可以使用jhsdb等工具附加到JVM进程,查看和分析其内存数据。此外,这些内存数据会根据源文件中的数据结构进行妥善组织,这也可以理解为JVM内置的一种后门机制。

以下文章介绍了如何使用 JVM 附加机制在内存中读取和保存类文件信息。

https://protector4j.com/articles/cracking-encrypted-java-applications-jhsdb/

除了使用 JDK 提供的 jhsdb 工具外,还可以使用阿里巴巴的 Arthas 来分析正在运行的 Java 进程。

一些保护方法通过反射动态加载类信息,这种方法也可以通过 DLL 注入来获取实时加载的类信息。更多详情请参考以下两个项目。

https://github.com/ViRb3/jvm-dump-proxy

https://github.com/zorftw/JVM-Native-Classdumping

结论

由于存在 JVM 附加机制或二进制 HOOK 机制,所有未与正常 JVM 操作分离的所谓加密代码都可以使用附加工具轻松读取,或者通过 DLL 注入进行钩取。因此,这是最无效的保护方案。