sourceguard
项目记录了本人对java源码保护的一些探索实践.
项目结构
sourceguard-repack
实现原始jar文件的解包,对目标class文件加密和还原成jar文件
sourceguard-dencrypt
使用jni实现的字节码加密和解密逻辑
sourceguard-hook
利用jvmti的类加载回调函数实现字节码的解密
说明
以字节码加密来实现源码保护遇到最大障碍便是是spring体系中大量使用的asm技术.spring aop会利用asm直接读取加密过的字节码,绕过了jvmti机制,使得程序报错。以本人的某个基于spring-boot 2.1.4的项目为例,需要额外更改下边的函数
org.springframework.asm.ClassReader.ClassReader(byte[], int, boolean)
org.springframework.cglib.core.AbstractClassGenerator.generate(ClassLoaderData)
更改的原理无非是在原始逻辑调用读取到字节码之前对其进行还原
使用
编译sourceguard-hook项目生成动态库,将该动态库放置在java.library.path对应的目录,使用如下命令启动jar
java -agentlib:sourcegaurd-hook -jar test.jar