javaee加密部署,tomcat使用自己的classloader解密

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

 

经过实验是没问题的,如有疑问请留言。

众所周知,Java编译后的Jar包和Class文件,可以轻而易举的使用反编译工具(如JD-GUI)进行反编译,拿到源码。为了保护自己发布的Jar包和Class文件,采用的方式大多是混淆方式,这种方式对于Class文件的加密是不彻底的,还是能够通过分析得出核心算法。本工具是采用jvmti方式对Class文件进行加密使用C++生成加密解密库,先用加密库对Jar包进行加密,将加密后的Jar包及解密库文件发布出去,执行时候需要JVM引入解密库文件,解密后执行。c++的.dll文件和.so文件的破解难度是很大的,这就能有效的保护软件和代码的知识产权. 使用方法: 1.打开windows命令行(运行=>cmd=>回车),在命令行中 进入 EncryptJar目录 2.执行 java -jar encrypt.jar 3.输入h,然后回车,可以看到帮助菜单 4.输入3,然后按回车键,进入加入jar文件功能 5.输入要加密的jar文件的路径 6.提示输入秘钥(key)的时候,直接回车,不要输入任何字符(否则后面classhook将不可解密加密后的jar包) 7.输入目标路径(加密后的jar文件路径,此处要注意:jar文件名要保持相同,将加密后的文件保存到不同的目录) 8.将加密后的jar包,替换原来的没有加密的jar包,与要发布的程序一起进行发布.(一般替换lib目录下对应的jar包即可) 9.加密后的jar包运行方法: windows下: 拷贝libClassHook.dll文件到程序的根目录(通常为要执行的jar程序的根目录) 使用以下命令启动程序: java -agentlib:libClassHook -jar xxxxxxxxxxx.jar 则在运行过程中会自动进行解密操作(解密过程是运行过程中用c++的dll进行解密的,可以有效防止破解class文件) 如果执行过程报错,可将程序根目录添加到环境变量path中去 Linux下: 拷贝libClassHook.so到程序的根目录(通常为要执行的jar程序的根目录) 使用以下命令启动程序: java -agentlib:ClassHook -jar xxxxxxxxxxx.jar (这里要删除掉lib,linux系统下会自动补全) 则在运行过程中会自动进行解密操作(解密过程是运行过程中用c++的dll进行解密的,可以有效防止破解class文件) 如果执行过程报错,可以在程序根目录下执行以下语句:export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH 或将libClassHook.so 拷贝到/usr/lib目录中去。 支持操作系统:加密请在windows64位系统并安装了64位jdk环境下进行。 需要解密运行的程序支持LINUX(64位)和windows(64位)安装了JDK1.8以上的系统。 测试程序: (t_lib目录下的jar包为经过加密的jar包) java -agentlib:libClassHook -jar test.jar
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值