http://www.2cto.com/kf/201312/264455.html
【起因】
公司需要对一个web项目进行加密之后出售,
大家都知道的,class很好反编译,
所以需要对class文件先进行加密,
然后使用自己的classloader进行解密并加载。
【步骤】
大概分两步:
1.对class文件进行加密
2.写解密class文件并加载的classloader
3.将这个classloader加入到tomcat中,也就是使tomcat可以调用到这个classloader
【加密】
1.思路
字节流读取class文件,进行简单的移位
2.实现
做了一个小程序,实现了对某文件夹下所有class文件字节流读取,并+2位的加密方式
3.说明
swing是使用myeclipse的插件做的,可能比较乱
4.代码&下载
加密程序的源代码和程序打包成jar文件上传到了这里,双击可以使用。
【classloader】
1.代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
package com.uikoo9.loader; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.IOException; import org.apache.catalina.loader.WebappClassLoader; /** * 自定义的classloader * 可以解密文件并加载 * @author uikoo9 */ public class UClassLoader extends WebappClassLoader{ /** * 默认构造器 */ public UClassLoader() { super (); } /** * 默认构造器 * @param parent */ public UClassLoader(ClassLoader parent) { super (parent); } /* (non-Javadoc) * @see org.apache.catalina.loader.WebappClassLoader#findClass(java.lang.String) */ public Class<!--?--> findClass(String name) throws ClassNotFoundException { if (name.contains( "uikoo9" )){ return findClassEncrypt(name); } else { return super .findClass(name); } } /** * 查找class * @param name * @return * @throws ClassNotFoundException */ private Class<!--?--> findClassEncrypt(String name) throws ClassNotFoundException{ byte [] classBytes = null ; try { System.out.println( "++++++" + name); classBytes = loadClassBytesEncrypt(name); } catch (Exception e) { e.printStackTrace(); } Class<!--?--> cl = defineClass(name, classBytes, 0 , classBytes.length); if (cl == null ) throw new ClassNotFoundException(name); return cl; } /** * 加载加密后的class字节流 * @param name * @return * @throws IOException */ private byte [] loadClassBytesEncrypt(String name) throws IOException { String basepath = "Z:/program/workspaces/_work_03_bzb/WebRoot/WEB-INF/classes/" ; // 项目物理地址 String cname = basepath + name.replace( '.' , '/' ) + ".uikoo9" ; System.out.println(cname); FileInputStream in = new FileInputStream(cname); try { ByteArrayOutputStream buffer = new ByteArrayOutputStream(); int ch; while ((ch = in.read()) != - 1 ) { buffer.write(( byte )(ch - 2 )); } in.close(); return buffer.toByteArray(); } finally { in.close(); } } } |
【加入到tomcat】
1.context.xml
找到tomcat下contex.xml,在context之间加入以下代码:
1
|
<loader delegate= "true" loaderclass= "com.uikoo9.loader.UClassLoader" ></loader> |
其中loaderClass就是自己写loader,delegate=“true”的意思是只解密非系统的class和jar
2.添加loader
将自己写的loader的class文件放到tomcatlib下
【开始】
1.使用加密程序对classes下所有文件加密,加密之后所有的class文件后缀变为uikoo9,可以自己修改源代码
2.将原classes文件夹删除,将加密后的classes文件夹复制进去
3.修改context.xml
4.tomcatlib下添加loader.class
5.启动tomcat
经过实验是没问题的,如有疑问请留言。