内容简介: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打开:
源代码一目了然。
接下来对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:
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:
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反编译:
已经无法反编译。
使用解密库文件解密后执行:
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即可。
(责任编辑:小恩)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Android Apk的反编译和加密
- 加密原理详解:对称式加密 VS 非对称式加密
- 编码、摘要和加密(三)——数据加密
- 聊聊对称加密与非对称加密
- 手机游戏加密之2d资源加密
- RSA加密原理:非对称加密鼻祖
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
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》 这本书的介绍吧!