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文件放到tomcat\lib下
【开始】
1.使用加密程序对classes下所有文件加密,加密之后所有的class文件后缀变为uikoo9,可以自己修改源代码
2.将原classes文件夹删除,将加密后的classes文件夹复制进去
3.修改context.xml
4.tomcat\lib下添加loader.class
5.启动tomcat
经过实验是没问题的,如有疑问请留言。