Java Obfuscator

2025年5月9日 | 阅读 6 分钟

混淆 (obfuscation) 的词典含义是使某事物变得不清晰或难以理解。在编程中,混淆器用于保护源代码免受黑客攻击。在本节中,我们将学习什么是代码混淆混淆器的作用、混淆工具,以及它的用途。此外,我们还将学习如何混淆 Java 应用程序

代码混淆

混淆这个词在计算机科学领域被广泛使用。在编程的语境下,混淆的含义是通过对可执行代码进行一些修改来使其代码不清晰,但代码仍然完全可以正常运行。使用混淆的目的是使代码对黑客不再有用。

请注意,混淆过程可能会修改方法指令或元数据,但不会改变应用程序或程序的输出。代码混淆的主要目标是使逆向工程变得困难。我们在这个过程中使用的工具称为代码混淆器

代码混淆器

在编程中,几乎所有代码都可以通过足够的时间和精力进行逆向工程。市面上有许多针对不同平台(如 Java、Android、.NET、iOS 等)的免费反编译器,可以轻松地从可执行文件或库中逆向工程源代码。因此,黑客很容易理解代码。

为了克服这个问题,我们使用代码混淆器。这些工具可以在不改变功能的情况下保护代码免受黑客攻击。

混淆器的工作原理

混淆的工作原理包括各种技术,这些技术提供了分层安全措施,以抵御逆向工程。这些技术如下:

重命名混淆

这是许多混淆器使用的基本混淆技术。它会更改方法和变量的名称。通过更改方法和变量的名称,代码更难理解。请注意,它不会改变程序的执行。重命名可以使用字母、数字、不可打印字符等。例如,考虑以下代码片段:

Java Obfuscator

字符串加密

在代码中,即使执行了重命名混淆,所有字符串仍然可以清晰地读取。字符串通常包含对用户可见的消息(如错误消息)。它会将字符串隐藏在可执行文件中,并在需要时恢复原始字符串。例如,考虑以下图示:

Java Obfuscator

控制流混淆

它创建条件分支和迭代结构。它会生成一个有效的可执行逻辑。但反编译后会产生非确定性的语义结果。这使得代码对黑客来说难以理解。请注意,该技术可能会降低方法的运行时性能。

Java Obfuscator

指令模式转换

在此技术中,编译器生成的指令被转换为其他指令。通常,这些是无法映射到高级语言的合法机器语言指令。

Java Obfuscator

插入垃圾代码

它会在可执行文件中插入垃圾代码,但不会影响应用程序的逻辑。它会破坏反编译器。通过插入垃圾代码,逆向工程后的代码更难分析。

移除未使用的代码和元数据

从应用程序中移除调试信息、非必需的元数据和未使用的代码可以使它们更小,并减少攻击者可用的信息。它还能提高应用程序的性能。

二进制链接/合并

它将多个输入的可执行文件/库合并到一个或多个输出二进制文件中。这使得应用程序更小,尤其是在与重命名和修剪结合使用时。因此,它减少了黑客可用的信息。

插入不透明谓词

它添加了条件分支,这些分支总是评估为已知结果。这些是无法通过静态分析轻易猜测或确定的结果。它提供了可能不正确但永远不会执行的代码。唯一的目的是让试图理解原始源代码的黑客感到困惑。

防篡改

混淆器可以在代码中嵌入应用程序自检机制,以确认应用程序未被修改。如果检测到修改,它可以尽可能地关闭其功能,引发随机崩溃(以掩盖崩溃的原因),或执行其他自定义操作。

防调试

混淆器可以通过注入代码来检测我们的生产应用程序是否在调试器中运行,从而提供应用程序的自我保护。如果使用了调试器,它可以销毁敏感数据(防止其被盗),引发随机崩溃(以掩盖崩溃是由于调试检查引起的),或执行其他自定义操作。

为什么我们应该使用混淆器?

在 Java 中,使用 Java 反编译器可以轻松地对应用程序进行逆向工程。Java 反编译器会暴露源代码,为了避免这种情况,我们使用混淆器。通过使用混淆器,我们可以保护我们的源代码免受黑客攻击。它是为源代码提供安全性的最佳解决方案。对于不同的平台,有不同的混淆器。有许多免费的 Java 混淆器工具。

Java 混淆工具

Java 有许多可用的混淆工具。在这里,我们列出了一些流行且广泛使用的混淆器。

Java Obfuscator
  • ProGuard Java Optimizer: 它是一个开源的 Java 类文件(字节码)混淆器、优化器、精简器和预验证器。
  • DashO Android and Java Obfuscator: 它是一个主动防护混淆工具,为 Kotlin 和 Android 应用程序提供安全保护。
  • KlassMaster Heavy Duty Protection: 它也为字节码提供安全保护。该工具的优点是它既可以混淆字符串常量,也可以混淆代码。该工具的另一个优点是,如果我们保存混淆日志,我们可以将堆栈跟踪转换回可读格式。
  • Javaguard: 它是一个简单的字节码混淆工具,文档不多。

让我们使用混淆工具来混淆字节码或 Java 类文件。

在进行代码混淆之前,我们将了解如何使用 Java 反编译器来逆向工程 Java 字节码。

使用 ProGuard 混淆 Java 应用程序

ProGuard 是一个免费的 Java 类文件精简器、优化器、混淆器和预验证器。它优化字节码,并使用简短的无意义名称重命名类、文件、方法和变量。此外,它还优化代码并检测未使用的类、方法、属性和未使用的指令。它也适用于 Android 和 Kotlin。

为了使用 ProGuard 工具,我们首先需要 下载 它。然后,按照以下步骤操作。

步骤 1:下载 proguard-ant-7.2.0-beta1.jar 文件。

Java Obfuscator

步骤 2:创建一个配置文件,其中包含有关应用程序的所有信息。在本例中,我们创建了 democofig.pro 文件。

-injars:指定 .jar 文件(已编译的 Java 应用程序)的路径。

-outjars:这是 ProGuard 在混淆后创建的 jar 文件。它包含类文件中所有混乱、晦涩的方法和变量命名约定。

-printmapping:该文件包含我们参考的所有映射信息。

-keep:在此文件中,我们指定我们不想混淆的类文件和方法。例如,在以下示例中,com.javatpoint.DemoClass 包含应用程序的入口点以及将不会被混淆的主类。

democonfig.pro

现在,我们将使用以下命令执行 ProGuard 应用程序。

执行 ProGuard 后,它会创建以下两个文件:

  • myapp-obfuscated.jar:它包含应用程序的混淆后的类文件。我们可以共享此文件,而无需担心有人轻易地对我们的应用程序进行逆向工程。
  • map:它包含我们参考的映射信息。

让我们看看演示文件。

proguard.map

该文件显示了 Java 源对象的原始名称以及对应的新的混淆名称。例如,请看以下内容:

Demo.java(混淆前)

我们得到以下 Java 源代码,该源代码是从混淆后的类文件反编译而来的。

我们注意到语句 HashSet<String> obj=new HashSet(list); 已转换为语句 A<m> o=new A(list); 因此,没有人能从上面的代码猜出实际的应用程序是什么。