您的位置:首页 > 移动开发

如何去保护(防止)自己的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);

 }

}





第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包还是被反编译了 ...  ...

改天有空再试试其它混淆器,未完待续 ...  ...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: