Java加密Jar包和Class文件防止反编译的方法

栏目: Java · 发布时间: 8年前

内容简介:Java加密Jar包和Class文件防止反编译的方法

众所周知,Java编译后的Jar包和Class文件,可以轻而易举的使用反编译工具(如JD-GUI)进行反编译,拿到源码。为了保护自己发布的Jar包和Class文件,采用的方式大多是混淆或加密(混淆 工具 如ProGuard),本文介绍的是采用jvmti方式对Class文件进行加密,使用C++生成加密和解密库,先用加密库对Jar包进行加密,将加密后的Jar包及解密库文件发布出去,执行时候需要JVM引入解密库文件,解密后执行。PS:高手请忽略。

假设我的代码包含两个类:

package com.lxw1234.test; public class Test {	public static final String a = "This is Test Class ..";		public static void main(String[] args) {		System.out.println(a);		new Test2();	}} package com.lxw1234.test; public class Test2 {	public Test2() {		System.out.println("This is Test2 Class ..");	}}

编译后打包成Test.jar,使用jd-gui打开:

Java加密Jar包和Class文件防止反编译的方法

源代码一目了然。

接下来对Jar包进行加密处理。

下载此加密程序压缩包: 点击下载JarEncrypt2

PS:此过程适用于 Linux 操作系统,我使用的是64位的CentOS 6.5。

解压之后得到如下的目录结构及文件:

./JarEncrypt2/encrypt   ## 加密库

—– encrypt.cpp

—– Makefile

./JarEncrypt2/decrypt    ## 解密库

—–decrypt.cpp

—– Makefile

./JarEncrypt2/Encrypt.java   ## Java加密执行文件

需要注意的几个地方:

Encrypt.java

if(name.endsWith(“.class”) && name.startsWith(“com/lxw1234/”)){

//只对包名以com.lxw1234开头的文件进行加密

decrypt.cpp

if(name&&strncmp(name,”com/lxw1234/”,12)==0){ 

//只对包名以com.lxw1234开头的文件进行解密

进入encrypt目录,执行make,编译生成libencrypt.so:

[ [email protected]

encrypt]$ 

make

g++ -fPIC  -I /usr/java/default/include -I /usr/java/default/include/linux -c encrypt.cpp

g++ -fPIC  -shared  -o libencrypt.so encrypt.o

进入decrypt目录,执行make,编译生成liblinux.so:

[ [email protected]

decrypt]$ 

make

g++ -fPIC  -I /usr/java/default/include -I /usr/java/default/include/linux -c decrypt.cpp

g++ -fPIC  -shared  -o liblinux.so decrypt.o

回到上级目录,编译Encrypt.java

javac Encrypt.java

生成Encrypt.class

执行加密:

java -Djava.library.path=./encrypt/ -cp . Encrypt -src Test.jar

encode jar file: [Test.jar ==> Test_encrypt.jar ]

encrypt com.lxw1234.test.Test.class

encrypt com.lxw1234.test.Test2.class

生成了加密后的jar包:Test_encrypt.jar

可以先试运行一下这个jar包:

java -cp Test_encrypt.jar com.lxw1234.test.Test

Exception in thread “main” java.lang.ClassFormatError: Incompatible magic value 3455696313 in class file com/lxw1234/test/Test

at java.lang.ClassLoader.defineClass1(Native Method)

at java.lang.ClassLoader.defineClass(ClassLoader.java:800)

at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)

at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)

at java.net.URLClassLoader.access$100(URLClassLoader.java:71)

at java.net.URLClassLoader$1.run(URLClassLoader.java:361)

at java.net.URLClassLoader$1.run(URLClassLoader.java:355)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(URLClassLoader.java:354)

at java.lang.ClassLoader.loadClass(ClassLoader.java:425)

at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)

at java.lang.ClassLoader.loadClass(ClassLoader.java:358)

at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)

使用jd-gui反编译:

Java加密Jar包和Class文件防止反编译的方法

已经无法反编译。

使用解密库文件解密后执行:

export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/home/liuxiaowen/JarEncrypt2/decrypt

java  -agentlib:linux -cp Test_encrypt.jar com.lxw1234.test.Test

This is Test Class ..

This is Test2 Class ..

可以正常执行。

这样,再发布时候,需要把 Test_encrypt.jar 和 liblinux.so 发布出去,执行时候引入liblinux即可。

(责任编辑:小恩)


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Mobilizing Web Sites

Mobilizing Web Sites

Layon, Kristofer / 2011-12 / 266.00元

Everyone has been talking about the mobile web in recent years, and more of us are browsing the web on smartphones and similar devices than ever before. But most of what we are viewing has not yet bee......一起来看看 《Mobilizing Web Sites》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具