【问题标题】:Creating non-reverse-engineerable Java programs创建不可逆向工程的 Java 程序
【发布时间】:2008-09-29 18:07:53
【问题描述】:

有没有办法以不可逆向工程的格式部署 Java 程序?

我知道如何将我的应用程序转换为可执行的 JAR 文件,但我想确保代码不能被逆向工程,或者至少不容易被逆向工程。

源代码的混淆不算...它使代码更难理解,但不会隐藏它。

一个相关的问题是How to lock compiled Java classes to prevent decompilation?


完成程序后,我仍然可以访问原始源代码,因此维护应用程序不会成为问题。如果应用程序是分布式的,我不希望任何用户能够反编译它。混淆并不能实现这一点,因为用户仍然可以对其进行反编译,虽然他们很难遵循操作流程,但他们将能够看到代码,并可能从中获取信息。

我担心的是代码中是否有任何与远程访问相关的信息。应用程序使用用户提供的用户 ID 和密码连接到一个主机。如果该地址位于源代码中,有没有办法向用户隐藏主机地址?

【问题讨论】:

标签: java jar compilation


【解决方案1】:

简短的回答是“不,它不存在”。

逆向工程是一个根本不意味着查看代码的过程。它基本上是试图理解底层机制,然后模仿它们。例如,这就是 JScript 从 MS 实验室中出现的方式,它通过复制 Netscape 的 JavaScript 行为,而无需访问代码。副本是如此完美,以至于连错误都被复制了。

【讨论】:

  • Gizmo,我认为您应该删除或编辑您的评论。任何阅读该问题的人都知道 Elie 正在寻找一种方法来防止轻松反编译。你正在分裂头发,这真的不是一个答案。或者您可以更新您的评论以包含正确的短语。请帮忙!
  • 对不起,我不会那样做。我更愿意对错误的问题给出一个好的答案,而不是对一个错误的问题给出一个错误的答案,尤其是现在 AlbertEin 的答案完全不符合真正的要求,即“防止某人在反编译代码”。
  • 您可以回答 intended 问题,并添加注释说明 literal 问题的缺点...
【解决方案2】:

您可以使用YGuard 混淆您的JAR 文件。 它不会混淆你的源代码,而是编译好的类,所以以后维护代码没有问题。

如果你想隐藏一些字符串,你可以加密它,使它更难通过查看源代码来获取它(如果你对 JAR 文件进行混淆会更好)。

【讨论】:

  • 他说源代码混淆,我是告诉他混淆生成的jar类,和源代码无关
  • 确实,二进制混淆是允许的。如果不是,那么他的问题就真的变成了,“我如何混淆我的代码?Ps,我不能使用混淆器”,这没有多大意义。二进制混淆并不完美,但它与您可能得到的一样好。
  • 我认为他的意思是对生成的字节码进行混淆,但他应该进行编辑以澄清。混淆的字节码仍然可以被逆向工程,但不能转换成漂亮的格式。
  • 信息会一直存在,只能硬着头皮,比如混淆生成的字节码
  • 有什么可以阻止他们使用其他方法来推断这些信息。例如监控来自建立连接的机器的所有传出流量。
【解决方案3】:

如果您知道自己的目标平台,请获取将您的 Java 编译为本机代码的工具,例如 Excelsior JETGCJ

除此之外,您永远无法隐藏源代码,因为用户始终拥有您的字节码并且可以Jad它。

【讨论】:

  • 有效。这就像版权“管理”。您想提供该程序,以便您的计算机可以读取它(并执行它),但不希望用户读取它(并复制它)。这是一件非常不自然的事情。
  • 将你的 Java 编译成本地代码似乎是唯一现实的解决方案,并且应该比混淆更好。
【解决方案4】:

您正在使用一种将内省作为核心语言的一部分的语言进行写作。它生成.class 文件,其规范广为人知(从而使其他供应商能够生产Java 编译器和解释器的洁净室实现)。

这意味着有公开可用的反编译器。所需要的只是一些 Google 搜索,并且您有一些 Java 代码与您的代码相同。只是没有 cmets 和一些变量名(但函数名保持不变)。

真的,混淆是你能得到的一切(尽管反编译的代码已经被稍微混淆了),而无需使用 C 或其他一些完全编译的语言。

【讨论】:

    【解决方案5】:

    不使用解释性语言?你到底想保护什么?如果它足够有价值,任何东西都可以被逆向工程。有人足够关心对大多数项目进行逆向工程的可能性很小。混淆至少提供了一个最小的障碍。

    确保您的intellectual property (IP) 受到其他机制的保护。特别是对于安全代码,人们能够检查实现非常重要,这样安全性就在算法中,而不是在源代码中。

    【讨论】:

      【解决方案6】:

      我很想问你为什么要这样做,但我就不说了...

      我看到的问题是,JVM 和 CLR 一样,需要能够解释您的代码,以便 JIT 编译和运行它。你可以让它更“复杂”,但考虑到字节码的规范是相当有据可查的,并且比 x86 汇编器规范存在更高的层次,你不太可能“隐藏”流程,因为它有让程序在第一时间运行。

      【讨论】:

        【解决方案7】:

        这是不可能的。

        任何可以编译的东西都可以反编译。你能做的最好的事情就是把它搞糊涂。

        话虽如此,量子密码学中发生了一些有趣的事情。本质上,任何阅读消息的尝试都会改变它。我不知道这是否可以应用于源代码。

        【讨论】:

        • 当然,只要您不希望您的处理器能够读取它;)
        • 嗯,那将是一个安全漏洞,不是吗。
        【解决方案8】:

        即使您将代码编译为本地机器语言,也有各种各样的程序可以让您从本质上将其反编译为汇编语言并遵循流程(OlyDbg、IDA Pro)。

        【讨论】:

          【解决方案9】:

          把它变成一个网络服务。那你就是唯一能看到源代码的人了。

          【讨论】:

            【解决方案10】:

            这是做不到的。这不是 Java 问题。任何可以编译的语言都可以为Java反编译,这更容易。

            您试图向某人展示一张图片,而没有实际展示给他们。这不可能。即使您隐藏在应用程序级别,您也无法隐藏您的主机。仍然有人可以通过Wireshark 或任何其他网络嗅探器来获取它。

            【讨论】:

              【解决方案11】:

              正如上面有人所说,逆向工程总是可以反编译您的可执行文件。保护您的源代码(或算法)的唯一方法是不分发您的可执行文件。

              将您的应用程序分为服务器代码和客户端应用程序,将算法的重要部分隐藏在服务器代码中并在云服务器中运行,只需分发仅用作数据获取器和发送器的客户端代码。

              这样,您的客户端代码也会被反编译。你不会失去任何东西。

              但这肯定会降低性能和用户便利性。

              我认为这可能不是您要寻找的答案,而只是为了提出保护源代码的不同想法。

              【讨论】:

                【解决方案12】:

                在某些时候任何解释的东西都必须“以明确的方式”处理。一旦代码通过 JAD 运行,该字符串将清楚地显示为 day。您可以在您的应用中部署加密密钥,或者使用基本的 ceasar 密码来加密主机连接信息并在运行时解密...

                但是在处理过程中的某些时候,必须明确主机连接信息,以便您的应用连接到主机...

                所以你可以静态隐藏它,但如果他们运行调试器,你就不能在运行时隐藏它

                【讨论】:

                  【解决方案13】:

                  这是不可能的。 CPU 必须执行您的程序,即您的程序必须采用 CPU 可以理解的格式。 CPU 比人类笨得多。因此,如果 CPU 可以理解您的程序,那么人类也可以。

                  【讨论】:

                    【解决方案14】:

                    担心隐藏代码,我还是会运行ProGuard

                    【讨论】:

                      猜你喜欢
                      • 2011-07-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-01-17
                      • 2011-05-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2017-06-23
                      • 2015-03-18
                      相关资源
                      最近更新 更多