Java类文件加密问题
除了混淆之外,类文件加密是一种很容易想到的代码保护方法。许多方案使用代理来加密类文件并在类加载期间解密它们。然而,这些方案忽略了一个重要的点,即JVM内置的附加机制。
JVM附加机制
为了方便分析和监控程序运行情况,普通JVM都带有附件。用户可以使用jhsdb等工具附加到JVM进程,查看和分析其内存数据。而且这些内存数据是按照源文件中的数据结构进行合理组织的,这也可以理解为JVM内置的后门机制。
下面文章介绍如何使用JVM Attach机制读取并保存内存中的类文件信息。
https://protector4j.com/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。因此,这是最无效的保护方案。