【问题标题】:How to protect Java codes against decompiler? [closed]如何保护 Java 代码免受反编译器的影响? [关闭]
【发布时间】:2010-12-25 03:26:59
【问题描述】:

众所周知,有很多java反编译工具可以将.cl​​ass转换为.java文件。

因此,我们需要保护我们的 .java 文件免受反编译器的影响。我知道这是一个很大的话题,也许没有结局。

通常有两种方式:混淆器和自定义类加载器。

有没有成熟的解决方案或开源框架,结合了这两种方式?

另一个方面和exe4j有关,它把jar打包成exe文件,好像可以保护java代码,因为我们看到的是exe文件,而不是jar或class文件。但实际上,当它运行时,它会将所有 jars 文件分解到临时目录中,这意味着很容易获取类文件以供反编译器使用。 那么从 exe4j 方面保护 java 代码有什么注意事项吗?

感谢您的 cmets 和建议。

更新

感谢大家的建议或经验分享。这对我很有帮助。 作为结论,我将放弃任何带有加密功能的混淆器或自定义类加载器。因为终于可以在聪明的黑客面前公开 Java 代码了。

我将在编译期间使用 C 语言中的“#ifdef”等技巧删除一些核心代码。在 Java 中,静态和最终布尔类变量可用于完成相同的工作。 那么编译的类文件将不包含需要保护的java代码。

【问题讨论】:

  • 是的,这是重复的:stackoverflow.com/questions/49379/…
  • 使用开源框架创建闭源产品。很有趣。
  • @Piligrim:在这种情况下甚至比平时更“封闭”的源代码;-)

标签: java obfuscation decompiling


【解决方案1】:

软件即服务。

【讨论】:

  • 确实如此。如今,SaaS 似乎非常流行。一些人甚至设想,大多数应用程序将在几年内以 Saas 的形式提供。借助 GWT、Vaadin 或 ICE Faces 等工具,您可以为他们的应用程序制作非常好的用户界面。
【解决方案2】:

您无法保护类文件免受反编译器和恶意用户的侵害。但是反编译器的输出可能不是有效的java。

最好的方法是很好地记录您的 API(假设您的客户可以使用)和应用程序。并让您的支持人员能够解决 API 和应用程序问题。那么您的客户将没有理由想要使用反编译器来探索为什么事情不能正常工作。

【讨论】:

  • 我们只是想提供免费的演示版供大家试用。但怕黑客能反编译得到java代码。因此,第一步是使用这个技巧去除一些核心数据或核心代码:stackoverflow.com/questions/1813853/ifdef-ifndef-in-java 第二步将考虑一些反反编译器的方法。好吧,在听到您说“您无法保护类文件免受反编译器和恶意用户的侵害”之后,我将放弃任何反反编译器解决方案。
  • "您无法保护类文件免受反编译器和恶意用户的侵害。" :) 不可能以反编译器无法解释的方式保护您的类文件。如果是这样,它也将被保护不能在 Java-VM 中运行,因此无用,因为您无法区分解释和反编译(从类文件的角度来看)。
【解决方案3】:

你可以试试开源项目proguard

【讨论】:

    【解决方案4】:

    唯一特别有效的方法是将您的程序作为某种 Web 服务提供,这样编译后的代码甚至永远不会在最终用户计算机上可用。

    下一个最有效的解决方案(在实践中广泛使用的解决方案)是让您的程序变得如此糟糕,以至于没有人愿意使用它或一开始就花时间对它进行逆向工程。不过,我怀疑发生这种情况通常是偶然的。

    【讨论】:

      【解决方案5】:

      其实不只是Java,silverlight和flash也有同样的问题。任何下载该软件包的人都可以解压缩然后反编译以对您的代码进行逆向工程。

      我同意 Saas 将是最好的解决方案,让 Web 服务处理所有底层逻辑并提供数据,从而为最终客户端建立一个相对安全和隔离的层来使用数据。

      【讨论】:

      • 核心逻辑可以用C++生成dll文件,然后Java用JNIWrapper包装。
      【解决方案6】:

      我的建议是,如果您对此非常认真,则应仅将演示软件发布给已签署具有法律约束力的保密协议的人员。如果他们违反协议,请准备好上法庭。

      无论如何,也要混淆您的演示应用程序等,但不要以为这会阻止坚定的黑客在您的应用程序中发现“秘密武器”。在理论上和实践中,不可能防止这种情况发生。如果您使用付费许可模式通过软件获利,盗版是不可避免的。

      (实际上,理论上是可行的,但只能使用像TPM 这样的完全安全的平台。这不是你的选择。相信我。)

      【讨论】:

        【解决方案7】:

        加密你的类文件并使用定制的类加载器来加载你的类文件怎么样?

        【讨论】:

        【解决方案8】:

        一切都可以破解。只需拥有可靠的 EULA 并投入其中,而不是将它们浪费在保护代码的无望尝试上。

        【讨论】:

          【解决方案9】:
          1. 您可以使用混淆器,例如 ProGard 或 Ygard,但解密字符串和重命名类、字段和方法并不太复杂。
          2. 您可以使用私钥加密您的类,并使用自定义类加载器在加载到内存之前使用公钥解密您的类,但是修改类加载器以将所有加载的类保存到磁盘上并不太复杂.
          3. 您可以尝试崩溃反编译器。 JAD 是最好的反编译器之一,但如果您在常量池中添加损坏的条目,所有由 JAD 提供支持的产品都会崩溃。但是,一些反编译器仍在工作。

          保护您的软件的唯一方法是将其部署在 SaaS/PaaS 中。

          但请注意:大多数人使用反编译器是因为他们有技术问题,而且文档很差或根本不存在。编写好的文档并使用可靠的 EULA 是更好的解决方案。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-03-26
            • 2018-07-24
            • 1970-01-01
            • 2022-07-15
            相关资源
            最近更新 更多