Java类文件加密问题

除了混淆之外,类文件加密是一种很容易想到的代码保护方法。许多方案使用代理来加密类文件并在类加载期间解密它们。然而,这些方案忽略了一个重要的点,即JVM内置的附加机制。

JVM附加机制

为了方便分析和监控程序运行情况,普通JVM都带有附件。用户可以使用jhsdb等工具附加到JVM进程,查看和分析其内存数据。而且这些内存数据是按照源文件中的数据结构进行合理组织的,这也可以理解为JVM内置的后门机制。

下面文章介绍如何使用JVM Attach机制读取并保存内存中的类文件信息。

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注入进行hook。因此,这是最无效的保护方案。