java - 反编译器字节码和混淆器

标签 java

我们可以完全从Java字节码对源代码进行反向工程吗?为什么在Java中允许使用此功能,以及Java反编译器对混淆器的成功程度如何?

最佳答案

我知道这个问题很老,但是我一直在寻找可靠的答案,直到一无所获。
因此,在这篇文章中,我总结了混淆J2EE JAR的一些工作。
似乎到2014年(撰写本文时),没有太多选择。
如果您稍后阅读此评论,则可能已更改或解决了问题。
当我想到为什么时,我开始感觉到整个混淆工作给人一种错误的安全感。不要误会我的意思。它确实增加了一定程度的安全性,但是没有我希望的那么多。
我将尝试对自己发现的内容进行预览。我的建议是个人的,其他人可能不同意。

因此,首先开始:Java中的混淆是获取字节码并使其在保持其原始功能的同时使其可读性降低的过程(当然,使用反编译器)。Java作为互操作者,必须做的事情是使字节码暴露在外。您运行混淆器是为了安全起见,以防类文件落入错误的人手中。混淆的结果是一个反向映射文件和带有混淆类的JAR。当然,反向映射文件用于执行堆栈跟踪读取(也称为重新跟踪)或将字节码恢复为其原始形状。混淆类的运行时性能影响不应超过10%(但这实际上取决于您在代码中执行的操作)。

但是有一个很大的“but”。混淆会扰乱您的代码,但不会使其受到黑客的攻击。记住,您只花时间,坚定的黑客将找到一种方法将您的字节码反向工程为纯算法。

恕我直言:隐藏敏感代码的最佳方法是将其淹没在一大堆毫无意义的代码中。

一些黑客会尝试(通过代码注入)修改您的字节码,以帮助他们实现目标。一些混淆器提供了更高级别的JAR强化,使其难以修改。

反混淆器和反编译器:我最喜欢的Java反编译器是JD-GUI。但是,当涉及去混淆器时,我发现市场相当空缺。大多数工具都要求您提供提示(使用了哪种混淆工具来加密源JAR),但它们中的任何一个都无法真正提供结果(其中一些在尝试解密JAR时甚至崩溃了)。它们是维护成本低的开源项目。我什至找不到付费的应用程序进行像样的模糊处理。如果你知道什么,请启发我。

免费解决方案

有开源的免费混淆器,它们通常简单地重命名类/方法名称,使其成为一个字母方法(即从printUsage(String params)到a(String p))。
正如此处所暗示的那样,它们甚至可能剥离调试信息以使其变得更加困难。 (调试信息保存在每个Java方法字节码的末尾,并且包含:行号,变量名等)。
这是一项不错的努力,但是具有调试器的Java开发人员经验丰富,可以在很少进行实时运行的同时轻松推断出每个参数的用途。
ProGuard是不错的开源混淆器之一,但还有更多工具。
但是,如果您确实是安全狂热者,则可能需要更强大的功能。更强大的功能需要更多的功能(和更多的金钱),这将使我们进入下一个子弹:

付费解决方案

尽管免费产品只能更改类的方法名称,但付费产品通常会提供更多功能:

  • 代码/流程混淆:这将更改方法代码,并注入空循环/死代码/令人困惑的切换表等。其中一些甚至可能加扰异常表的内容。混淆强度通常决定输出大小。
    注意:关于代码混淆:我特意避免了审查中的细节。我看到和分析的一些字节码暴露了它们的混淆方法,我希望保护它们的IP。对于谁使用更好的算法,我确实有意见。如果您想知道,请与我联系。
  • 类/方法重命名:这很明显,我们在自由混淆中讨论了它。某些产品将重命名类名称,然后递归搜索该类的反射用法并进行修复。付费产品甚至可能出于相同目的重命名Spring / Wink配置文件(在映射中重命名)。
    字符串加密:对于代码中的每个“像这样”的字符串,它将对其进行某种程度的加密并将密钥保留在某个位置(在类常量表/静态块/新方法或任何其他方式中)。
  • 调试信息:剥离零件或加扰。其中许多零件会删除行号信息。
  • 强化:各种方法,例如在类/方法的开头注入一些签名方案,以确保局外人无法轻易修改和运行JAR。对于Android或applet而言,它的重要性不高,因为它们中的大多数都是经过数字签名的。有些会结合硬化和水印来跟踪盗版副本。但是我们都知道软件的反盗版方法注定会被黑客入侵。在基于网络的订阅到达之前,游戏行业遭受了数十年的苦难。
  • 由于此处的大多数产品都使用Java,因此其中一些提供了Android集成。这意味着它不仅会混淆Java(dalvik)代码,还会操纵Android的清单文件和资源。一些提供反调试功能:在android应用中删除debug标志。
  • 不错的GUI应用程序,用于配置各种选项,并可能对给定的日志文件进行重新跟踪。 UI通常用于生成配置文件。使用此类文件,您以后甚至可以从命令行重新播放混淆。
  • 增量构建支持-这对于经常发布产品更新/修复的大型团体很有用。您可以告诉混淆器保留旧的“混淆”结果,并仅随机混淆“新”代码流。这样,您可以确保对方法签名的影响最小。没有此标志,JAR上的每个混淆周期将产生不同的输出,因为大多数好的工具在其算法中使用了一定程度的随机性。
  • CLI和分布式构建。当您独自工作时,运行混淆器并不是什么大问题。您需要将混淆器配置为相关选项并运行它。但是,在企业中,将混淆器集成到构建脚本中时,情况有所不同。复杂性还有另一个层次:构建引擎任务(如ant / maven)和许可证管理。我测试的所有混淆器都具有命令行API,这是个好消息。在分布式构建环境中,存在构建机器的集群/池以支持并发构建需求。群集是动态的和虚拟的,计算机会根据各种情况而上升或下降。某些混淆产品基于cpuID许可证文件或主机名。这可能会给构建团队集成带来很大挑战。有些人更喜欢本地浮动许可证服务器。有些可能需要公共许可证服务器(但随后:并非所有的构建场都可以访问公共互联网)。有些提供多站点许可证(我认为这是最好的)。
  • 一些提供代码优化-代数等效和无效代码删除。很好,但是我相信今天的JDK在优化字节码方面做得很好。确实,死代码使您的下载量更大,但是使用当今的带宽,这已不成问题。我也想相信,今天在软件中20:80经验法则仍然适用。在任何应用中,无论如何,20%可能都是无效代码。

  • 那么我尝试过的球员是谁?

    Zelix.com的
  • KlassMaster-行业内最古老的软件之一。但是,他们提供的固体产品每年有3-4个版本。这种情况已经持续了数十年(自1997年以来)。 Zelix提供了良好的电子邮件支持,并及时答复了我的所有电子邮件。他们有一个不错的GUI客户端,可以混淆JAR或创建配置文件以供将来混淆。简单而光滑。这里没什么特别的。他们为所有标志提供了易于阅读的在线文档。它们支持引擎混淆的“exclude”和“include”正则表达式。我最喜欢他们的流程的地方是,它还在异常表中添加了“噪音”。它使方法异常处理变得更加混乱。它们的流量混淆器强度非常好,可以在3种可能的级别(轻,中和积极)之间进行配置。我喜欢的另一个功能是它们为调试信息剥离(在线行号或在线局部变量或两者)提供的微调。 Klass Master不提供任何服务
    专用的Android标志或防篡改方法。他们的许可模型非常简单:将文本文件放在KlassMaster主JAR附近。它们还支持增量混淆。
  • secureTeam.net的
  • JFuscator:虽然secureTeam也具有.Net工具,但我还是专注于其Java工具功能。他们的(基于SWing的)GUI工具看起来不错,但是在尝试最简单的混淆任务时会崩溃。该错误始终相同:读取“/opt/sun-jdk1.7.0_55/jre\lib\rt.jar”时出错。原因:''/opt/sun-jdk1.7.0_55/jre\lib\rt.jar':没有这样的文件或目录'。当然,现在我已经在/opt/sun-jdk1.7.0_55/jre中安装了Java。您可以想象他们根本不期望linux反斜杠结构。我通过电子邮件与secureTeam.net支持人员联系,遇到了较小的“路径”问题。他们问我是否是Linux用户,在我回答我之后,他们从未答复过我的电子邮件。我也尝试了他们的网站的在线聊天:没有回应。因此,我停止了测试。没有进一步的结果,我无法检查混淆的字节码质量。从他们的网站看来,他们具有防篡改方法,字符串操作,方法重命名和其他一些功能。
  • GuartIt4J(由Arxan.com提供):Arxan在移动环境中是一个非常强大的播放器,因此,它们提供了Android混淆器,它当然对Java很好。它们具有最灵活的引擎之一。它们提供代码混淆,字符串加密等功能。您可以定义代码混淆的复杂性。它只是一个整数。越高-您的方法结果越长。当然,您必须小心不要超过每个类的JVM 64KB限制…正如我之前所说的,隐藏敏感代码的最佳策略之一不是对其进行加密,而是将其注入大量垃圾中。这正是GuardIt所做的。它也可以以与方法异常表相同的方式爆炸。我设法在其异常表中创建了一个具有100个异常的方法(混淆器之前为5)。他们错过了什么:他们的重新跟踪程序不是提供的主JAR的一部分。但是,它们足够友好,可以向我发送一个示例Java程序,该程序在给定反向映射文件和日志的情况下执行重新跟踪。它们不支持增量混淆,并且在调试信息方面没有灵活性。调试信息剥离是全部还是全部。观看输出JAR,您将看到大量的条件和跳跃。没什么大不了的,爆炸式的 class 规模影响了表现。在某些方法中,我测量了长时间混淆(在这些方法中没有I / O)时性能几乎降低了50%。因此,外推代码需要付出一定的代价。(从400个操作码开始-经过混淆后,我增加到2200个操作码)。 JD-GUI,我的反编译器无法打开此类并崩溃(IndexOutOfBoundException)。它们还提供完整的类加密。这意味着该类是使用一些对称密钥加密的,这需要特殊的(或自定义编写的)类加载器才能在内存中打开它。这是一种防篡改机制以及隐藏代码。只要记住,没有类加载器的帮助,JVM就无法运行该类。这是一个不错的功能,但是秘密密钥和引导加载程序JAR可能在那里。如果他获得了加密的JAR,黑客最终将得到他的帮助并解密这些类。普通黑客还需要克服这一障碍。我在这里不喜欢的是许可证文件策略:绑定到CPUid或需要安装浮动许可证服务器。
  • SecureIt(由Allatori.com提供):SecureIt提供所有常规代码混淆,字符串加密,重新命名等功能。除了标准的混淆方法外,它们还提供了某种水印,这是一种防篡改/盗版方法。它们支持Android和JavaME(这些天谁在使用ME ?!)。它们支持渐增混淆。有关配置SecureIt的注意事项:全部为命令行。这次没有GUI工具。就个人而言,我不介意命令行工具,只要它们附带了良好的文档资料即可。幸运的是,如果您愿意的话,他们有一个很好的文档和一个丰富的API,其中包含许多要调整的标志。您可以使用它们工具(也可以是命令行)进行跟踪。他们无法混淆异常表。我没有检查他们的许可机制。
  • DashO(由Preemptive.com提供):DashO混淆器可能被记住是您可以获得(创建配置)的最佳UI工具。像SecureIt一样,它们对异常表进行混淆处理,但是它们具有所有其余必需的功能(以及CLI,Spring框架和gradle / ant集成,甚至是eclipse插件)。好吧,他们确实记录了try-catch模糊处理程序(与异常表模糊处理程序相同),但这只是对引擎的建议。当我尝试它时,它对异常表没有任何影响。正如我所说的,GUI工具非常棒,并且内嵌了重新跟踪功能。他们还提供某种应用程序签名和水印作为一种防篡改/盗版机制。 DashO提供了出色的Android集成,并且在其产品中结合了进行分析上传的大门。您实际上可以跟踪您的应用程序。注入崩溃日志上传器并将代码报告给您的JAR。不过,这并不是混淆的范围,而是完全不同的代码注入产品。他们有很好的支持。在线和通过电话。他们的许可计划基于每月订阅或一次性购买付款。与众不同。他们正在使用浮动许可证服务器来支持大型环境。

  • 我希望这能有所帮助..

    关于java - 反编译器字节码和混淆器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13098606/

    相关文章:

    java - 实现 DialogFragment 的回调

    java - Android 有浅色主题吗?

    java - 使用方法更改现有数组的大小

    java - 在intellij idea中使用gradle构建第一个java项目,此构建中使用了已弃用的Gradle功能

    java - 使用 PDFBox 时,MS Edge 中的 PDF 字体与 Chrome 中的字体不同

    java - 相对于父类(super class)构造函数的最终可变初始化

    java - 使用 spring hibernate 从序列中获取下一个值

    java - 在 Jar 文件中运行类

    java - 从 Google Cloud Storage 检索文件

    java - 代号一 : Why am I getting "/by zero" when trying to scale an image