保护您的java代码不受反向工程的影响

举报
Tiamo_T 发表于 2021/11/24 21:34:01 2021/11/24
【摘要】 如果您正在开发java应用程序,重要的是要了解java类文件可以使用java反编译器轻松地进行反向工程。在本文中,让我们探讨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 反编译工具对类文件进行逆向工程的人没有任何意义。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。