JAVA代码保护从入门到放弃
java语言开发的产品,需要部署到客户现场服务器.产生了对代码进行保护的需求,开始研究代码加密方式.
经过研究分析后有两种思路,混淆和加密.两者各自适应不同的情况.
由于大量spring注解功能,并且无明显的核心功能.因此首先放弃了混淆的方式.
然后开始研究ClassLoader和JVMTI,研究了老半天之后发现,Spring的注解扫描机制需要在项目启动时候扫描相关的class,通过asm自行解析class文件,加密class后导致读取类信息报错.
又开始把思路转向到class文件格式,考虑解析文件格式对其中方法body指令进行加密,保证类的名称接口注解都能被正常读取.研究期间发现不管用JNI还是JAVA代码实现解密过程,最终产生的byte[]都能被拦截获取到.
最终发现,通过获取loadedClass和字节码工具javassist直接能从内存中读取已加载的类,并保存成为class,再反编译成为源码.
到这里还没放弃,想着不行了自己拉取jvm源代码定制一个jvm,屏蔽掉jvmti等接口.
最终--放弃了编译jvm,这个想法是如此的扯淡.
然后又考虑使用混淆
翻了翻代码,没有核心代码,没有哪里是需要加密的.