保护您的java代码不受反向工程的影响
如果您正在开发java应用程序,重要的是要了解java类文件可以使用java反编译器轻松地进行反向工程。在本文中,让我们探讨java类文件是如何进行反向工程的,以及如何保护源代码不被他人反向工程。
Java源代码被编译成包含字节码的类文件,Java虚拟机只需要类文件即可执行。问题在于,可以使用java反编译工具轻松地将类文件反编译为原始源代码。防止反向工程的最佳解决方案是混淆类文件,这样将很难进行反向工程。根据字典,模糊的意思是“使模糊或不清楚”。这正是许多java模糊处理工具将要做的,如下所述。
一、反编译Java类文件。
在了解如何混淆 java 代码之前,让我们首先尝试了解有人如何对您的 java 应用程序进行逆向工程。以下 3 个步骤解释了如何将类文件反向工程为原始 Java 源代码。
1.创建HelloWorld.java,如下图。
public class HelloWorld {
public static void main (String args[]) {
String userMessage = "Hello World!";
int userCount = 100;
userCount = userCount + 1;
System.out.println(userMessage);
System.out.println(userCount);
}
}
2.编译HelloWorld.java程序并执行它以确保它正常工作。
$ javac HelloWorld.java
$ java HelloWorld
Hello World!
101
Java 类文件只包含字节码。如果您尝试查看类文件,它将无法读取,如下所示。
$ vi HelloWorld.class
Ãþº¾^@^@^@2^@
^@^G^@^P^H^@^Q ^@^R^@^S
^@^T^@^V^G^@^W^G^@^X^A^@^F<init>^A^@^C()V^A^@^DCode^A^@^OLineNumberTable
^A^@^Dmain^A^@^V([Ljava/lang/String;)V^A^@
SourceFile^A^@^OHelloWorld.java^L^@^H^@ ^A^@^LHello World!^G^@^Y^L^@^Z^@^[^G^@^\^L^@^]^@^^^L^@^]^@^_^A^@
HelloWorld^A^@^Pjava/lang/Object^A^@^Pjava/lang/System^A^@^Cout^A^@^ULjava/io/PrintStream;^A
^@^Sjava/io/PrintStream^A^@^Gprintln^A^@^U(Ljava/lang/String;)V^A^@^D(I)V^@!^@^F^@^G^@^@^@^@^@^B^@^A^@^H^@ ^@^A^@
3、反编译HelloWorld.class文件,查看原始源码。
对于这个演示,让我们使用Jad反编译器,它可以免费用于非商业用途。下载适合您平台的 jad。使用jad对HelloWorld.class文件进行逆向工程,得到如下图所示的原始源码。
$ unzip jadls158.zip
$ ./jad HelloWorld.class
Parsing HelloWorld.class...
Generating HelloWorld.jad
$ vi HelloWorld.jad <This will show the reverse engineered original source code>
二、混淆你的 Java 应用程序
让我们回顾一下如何使用免费的 GPL 许可软件ProGuard来混淆和保护您的源代码免遭逆向工程。
1.下载并安装 ProGuard
$ cd /home/tiamo
$ unzip proguard4.2.zip
2.创建一个proguard配置文件
创建包含有关 Java 应用程序的所有信息的 myconfig.pro。
- -injar :指定 jar 文件的位置。即包含类文件的已编译 java 应用程序
- -outjar:这是混淆后混淆器将创建的 jar 文件。如果有人试图进行逆向工程,这将包含类文件中方法和变量的所有混乱的、模糊的命名约定。
- -printmapping:ProGurad 输出此文件中的所有映射信息供您参考。
- -keep:指示您不希望 ProGuard 混淆的类文件或方法。例如,mypkg.MainAppFrame 包含具有主类的应用程序的入口点,在本例中不会被混淆。
$ cat myconfig.pro
-injars /home/tiamo/myapp.jar
-outjars /home/tiamo/myapp-obfuscated.jar This is the obfuscated jar file
-libraryjars /usr/java/jdk1.5.0_14/jre/lib/rt.jar
-printmapping proguard.map
-verbose
-keep public class mypkg.MainAppFrame
3. 执行 ProGuard。
$ cd /home/tiamo/proguard4.2/lib
$ java -jar proguard.jar @myconfig.pro
这将创建以下两个文件:
- myapp-obfuscated.jar:包含应用程序的混淆类文件。您可以分发它,而不必担心有人轻松地对您的应用程序进行逆向工程。
- proguard.map:此文件包含映射信息供您参考。
4. 示例 proguard.map 文件
这是一个示例 proguard.map 文件,它指示 java 源对象(类文件、方法、变量等)的原始名称和新的混淆名称。
myapp.AppToolBar -> myapp.ae:
javax.swing.JButton btnNew -> d
javax.swing.JButton btnOpen -> e
5. 混淆前的示例java源代码(myapp.AppToolBar)。
btnNew = changeButtonLabel(btnNew, language.getText("new"));
btnOpen = changeButtonLabel(btnOpen, language.getText("open"));
6. 混淆后从类文件(myapp.ae)反编译的示例java源代码。
d = a(d, n.a("new"));
e = a(e, n.a("open"));
你可以看到“ btnNew = changeButtonLabel(btnNew, language.getText(“new”)); ” 被ProGuard翻译为“ d = a(d, na(“new”)) ;”,这对于使用 Java 反编译工具对类文件进行逆向工程的人没有任何意义。
- 点赞
- 收藏
- 关注作者
评论(0)