如何去保护(防止)自己的Java应用程序源码(JAR, SERVLET, CLASS, APPLET)不被其他人逆向工程?
2017-03-30 11:48
627 查看
一. 反编译Java类文件
在了解如何去混淆Java代码之前,让我们首先了解一下别人是如何逆向你的Java应用程序的,
以下范例3步可以说明一个.class文件是如何被逆向工程,最终完整地还原输出您辛苦编写的Java原始源码
第1步:创建一个测试范例类文件 HelloWorld.java,以下代码是用Eclipse开发工具创建,
直接在开发工具环境运行代码, HelloWorld.class这个编译输出的.class文件输出目录在E:\ReverseEngineering\bin下面
获得HelloWorld.class编译文件,上面那么干最简单了,当然也可以在命令提示符环境下敲编译指令来手动编译,稍后呈现这一个过程
package com.example;
import java.math.BigInteger;
public class HelloWorld {
public static void main(String[] args) {
String message = "Hello World!";
Integer intMax = Integer.MAX_VALUE;
System.out.println("Integer.MAX_VALUE = "+intMax.toString());
BigInteger start = new BigInteger(intMax.toString());
BigInteger end = new BigInteger("2147483651");
BigInteger one = new BigInteger("1");
BigInteger sum = new BigInteger("0");
for (BigInteger i = start; i.compareTo(end) < 0; i = i.add(one)) {
sum = sum.add(i);
}
System.out.println(message);
System.out.println("2147483647 + 2147483648 + 2147483649 + 2147483650 = " + sum);
}
}
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/23/94f38b7d9dbda5f1a34a61b7237350ea)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/23/bfd77311257c3c4bd360ac29e27bd143)
第2步:编译HelloWorld.java并且执行该程序,如果你在编译之前发现已经生成了E:\ReverseEngineering\bin 这个文件夹,
在Eclipse开发工具环境运行该项目自然会生成bin目录,编译输出HelloWorld.class文就自然也有,那就删掉bin目录,
当然也可以先进去看看里面有很多层文件夹(因为用了包名称com.example),手动编译过程截图如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/23/275158f4c9ee59e05d99b953aa0af8a6)
Microsoft Windows [版本 10.0.10586]
(c) 2015 Microsoft Corporation。保留所有权利。
C:\Users\Administrator>E:
E:\>cd E:\ReverseEngineering
E:\ReverseEngineering>mkdir bin
E:\ReverseEngineering>C:
C:\Users\Administrator>cd C:\Program Files\Java\jdk1.8.0_121\bin
C:\Program Files\Java\jdk1.8.0_121\bin>javac -d E:\ReverseEngineering\bin E:\ReverseEngineering\src\com\example\HelloWorld.java
C:\Program Files\Java\jdk1.8.0_121\bin>E:
E:\ReverseEngineering>cd bin
E:\ReverseEngineering\bin>java com/example/HelloWorld
Integer.MAX_VALUE = 2147483647
Hello World!
2147483647 + 2147483648 + 2147483649 + 2147483650 = 8589934594
E:\ReverseEngineering\bin>
接下来查看一下HelloWorld.class文件的内容,你可以用记事本直接打开,看到的肯定是乱七八糟的东西,
但是,用反编译工具可以把这个HelloWorld.class文件的本来面目还原,看得清清楚楚,
这样的编译输出结果没有任何源码保护功能,请不要把这样的东西给别人测试,因为你这样就很慷慨地把源码也给别人了,要是给别人的是可执行jar包,
相当于你把所有的东西都送给别人了,后面我也会展示打包发布本项目,然后用反编译工具把可执行的jar包程序所有的源码还原出来
如果你接的是私活,对方要求测试,测试完,后来说不要了... ... 估计他啥都拿到了,还付你啥钱啊 。。。 那不是傻子吗?
使用命令提示符查看编译输出的文件HelloWorld.class,看看下面乱七八糟是些什么东西:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/23/4ef43063bb2b3d7fc0f0bf2ea3e0aef2)
第3步:反编译HelloWorld.class文件,查看输出的原始代码:
先下载http://www.benf.org/other/cfr/cfr_0_120.jar 保存到E:\Decompile文件夹下,你的电脑里肯定没有这个文件夹,那就手动建立一个吧
记得把需要反编译的HelloWorld.class文件复制到E:\Decompile文件夹下
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/23/667923da14c3bd5577089c04012e07df)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/23/b30caf1e2acf6d3ad5a79d68d30f5c17)
你以为给程序穿衣服了,java编译器编译的项目文件其实是在裸奔 ,啥都看到了... ...
再举例说明反编译可执行jar包
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/23/1f614fc34d515266d8b6a4b2ad5437b8)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/23/d4521db20cb4dc450926d4ea636266dc)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/23/119bf72858c8b8ce62a90c96d1ad478f)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/23/7cdd5ca38e58ddbb73f8f1dc2bfb6e46)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/23/2680bf51f67fea7de14271a3bbad0f75)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/23/c627466b42ed380da42bd651de9a24d3)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/23/135bf7f1fb754ec669a0e9681484e874)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/23/f2d11916fe2c6fc55653727387c2a141)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/23/4ff4f4e9bf0b3461990aad1d0dc33f15)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/23/7f9beb8703d75594bf72bae4acc5aadb)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/23/6bc88f326dd1d754cc6c16c89890b1e2)
接下来展示ProGuard混淆代码的工具应该如何使用
下载ProGuard:https://downloads.sourceforge.net/project/proguard/proguard/5.3/proguard5.3.2.zip?fromerrorjs=1
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/23/cb8499ab663c1d482d0ca3a841d6e334)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/23/a990f3cd52322dde91880dd9eb337e4e)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/23/8e8a22d8b88063b662f2dfaaed8d4f03)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/23/b063676695882daf1d5bc2a085cc79e4)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/23/a04dce6961de7b8a7dfa84ca7fa0fe22)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/23/6066bb3a4383b7754b95bc97dab337e1)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/23/435fda6026989c9ae1fd5064b6a55180)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/23/da9ac3e978b1c4c985e74be1b090cb2a)
结论:ProGuard混淆器输出的jar包还是被反编译了 ... ...
改天有空再试试其它混淆器,未完待续 ... ...
在了解如何去混淆Java代码之前,让我们首先了解一下别人是如何逆向你的Java应用程序的,
以下范例3步可以说明一个.class文件是如何被逆向工程,最终完整地还原输出您辛苦编写的Java原始源码
第1步:创建一个测试范例类文件 HelloWorld.java,以下代码是用Eclipse开发工具创建,
直接在开发工具环境运行代码, HelloWorld.class这个编译输出的.class文件输出目录在E:\ReverseEngineering\bin下面
获得HelloWorld.class编译文件,上面那么干最简单了,当然也可以在命令提示符环境下敲编译指令来手动编译,稍后呈现这一个过程
package com.example;
import java.math.BigInteger;
public class HelloWorld {
public static void main(String[] args) {
String message = "Hello World!";
Integer intMax = Integer.MAX_VALUE;
System.out.println("Integer.MAX_VALUE = "+intMax.toString());
BigInteger start = new BigInteger(intMax.toString());
BigInteger end = new BigInteger("2147483651");
BigInteger one = new BigInteger("1");
BigInteger sum = new BigInteger("0");
for (BigInteger i = start; i.compareTo(end) < 0; i = i.add(one)) {
sum = sum.add(i);
}
System.out.println(message);
System.out.println("2147483647 + 2147483648 + 2147483649 + 2147483650 = " + sum);
}
}
第2步:编译HelloWorld.java并且执行该程序,如果你在编译之前发现已经生成了E:\ReverseEngineering\bin 这个文件夹,
在Eclipse开发工具环境运行该项目自然会生成bin目录,编译输出HelloWorld.class文就自然也有,那就删掉bin目录,
当然也可以先进去看看里面有很多层文件夹(因为用了包名称com.example),手动编译过程截图如下:
Microsoft Windows [版本 10.0.10586]
(c) 2015 Microsoft Corporation。保留所有权利。
C:\Users\Administrator>E:
E:\>cd E:\ReverseEngineering
E:\ReverseEngineering>mkdir bin
E:\ReverseEngineering>C:
C:\Users\Administrator>cd C:\Program Files\Java\jdk1.8.0_121\bin
C:\Program Files\Java\jdk1.8.0_121\bin>javac -d E:\ReverseEngineering\bin E:\ReverseEngineering\src\com\example\HelloWorld.java
C:\Program Files\Java\jdk1.8.0_121\bin>E:
E:\ReverseEngineering>cd bin
E:\ReverseEngineering\bin>java com/example/HelloWorld
Integer.MAX_VALUE = 2147483647
Hello World!
2147483647 + 2147483648 + 2147483649 + 2147483650 = 8589934594
E:\ReverseEngineering\bin>
接下来查看一下HelloWorld.class文件的内容,你可以用记事本直接打开,看到的肯定是乱七八糟的东西,
但是,用反编译工具可以把这个HelloWorld.class文件的本来面目还原,看得清清楚楚,
这样的编译输出结果没有任何源码保护功能,请不要把这样的东西给别人测试,因为你这样就很慷慨地把源码也给别人了,要是给别人的是可执行jar包,
相当于你把所有的东西都送给别人了,后面我也会展示打包发布本项目,然后用反编译工具把可执行的jar包程序所有的源码还原出来
如果你接的是私活,对方要求测试,测试完,后来说不要了... ... 估计他啥都拿到了,还付你啥钱啊 。。。 那不是傻子吗?
使用命令提示符查看编译输出的文件HelloWorld.class,看看下面乱七八糟是些什么东西:
第3步:反编译HelloWorld.class文件,查看输出的原始代码:
先下载http://www.benf.org/other/cfr/cfr_0_120.jar 保存到E:\Decompile文件夹下,你的电脑里肯定没有这个文件夹,那就手动建立一个吧
记得把需要反编译的HelloWorld.class文件复制到E:\Decompile文件夹下
你以为给程序穿衣服了,java编译器编译的项目文件其实是在裸奔 ,啥都看到了... ...
再举例说明反编译可执行jar包
接下来展示ProGuard混淆代码的工具应该如何使用
下载ProGuard:https://downloads.sourceforge.net/project/proguard/proguard/5.3/proguard5.3.2.zip?fromerrorjs=1
结论:ProGuard混淆器输出的jar包还是被反编译了 ... ...
改天有空再试试其它混淆器,未完待续 ... ...
相关文章推荐
- java如何下载一些自己需要的jar/Class 文件?
- JAVA——Eclipse中如何快速查看jar包中 的class源码
- [转] 如何双击jar文件启动java应用程序
- V8源码工程如何布局到自己的Visual Studio 2005上
- 如何有效防止Java程序源码被人偷窥(zhuan)
- android工程中引入第三方JAR包后安装APK时老是提示找不到库文件 || Android如何将程序打成jar包 || 运行java.lang.noclassdeffounderror错误
- 【Log4j】如何让自己的java web工程使用log4j?
- 如何有效防止Java程序源码被人偷窥(1)
- 如何双击jar文件启动java应用程序
- JAVA 之如何运行applet应用程序
- JAVA应用程序如何打印出自己的回溯栈
- 如何保护Java程序 防止Java反编译
- 如何有效防止Java程序源码被人偷窥
- 探讨如何保护Java应用程序图像资源
- 如何用jar命令对java工程进行打包
- 如何有效防止Java程序源码被人偷窥?
- JAVA Applet教程-如何在Applet中引用jar中的资源文件 作者:admin
- 如何在eclipse的android工程中添加外部javadoc.jar包,方便开发
- 如何让自己的java web工程使用log4j?
- 关于防止Java免受逆向工程攻击的集中措施