如何保护Java代码免受反编译?

时间:2009-12-10 06:38:13

标签: java obfuscation decompiling

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

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

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

是否有任何成熟的解决方案或开源框架,将这两种方式结合起来?

另一方面与exe4j有关,它将jar包装到exe文件中,看起来它可以保护java代码,因为我们可以看到的是exe文件而不是jar文件或类文件。但实际上,当它运行时,它会将所有jar文件分解为临时目录,这意味着很容易获得反编译器的类文件。 那么从exe4j方面保护java代码的任何考虑因素?

感谢您的意见和建议。

更新

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

我将在编译时使用C语言中的“#ifdef”等技巧删除一些核心代码。在Java中,static和final布尔类变量可用于执行相同的工作。 然后,compilered类文件将不包含受需要保护的java代码。

9 个答案:

答案 0 :(得分:18)

  1. 您可以使用混淆器,如ProGard或Ygard,但解密字符串并重命名类,字段和方法并不太复杂。
  2. 您可以使用私钥加密您的类,并使用自定义类加载器在加载到内存之前使用公钥解密您的类,但是修改类加载器以将所有加载的类保存到光盘上并不太复杂
  3. 您可以尝试崩溃反编译器。 JAD是最好的反编译器之一,但如果在常量池中添加损坏的条目,则由JAD驱动的所有产品都会崩溃。但是,一些反编译器仍然在工作。
  4. 保护软件的唯一方法是将其部署在SaaS / PaaS中。

    但请保持警惕:大多数人使用反编译因为他们有技术问题并且文档很差或不存在。写一篇好文档并使用一个可靠的EULA是更好的解决方案。

答案 1 :(得分:12)

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

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

答案 2 :(得分:10)

软件即服务。

答案 3 :(得分:6)

唯一有效的方法是将您的程序作为某种Web服务提供,以便在最终用户计算机上永远不会提供已编译的代码。

下一个最有效的解决方案,即在实践中广泛使用的解决方案,是让您的程序如此糟糕,以至于没有人想要使用它或者首先花时间对其进行逆向工程。我怀疑,当发生这种情况时,通常是偶然的。

答案 4 :(得分:1)

您可以尝试开源项目 proguard

答案 5 :(得分:1)

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

我同意Saas将是最好的解决方案,让Web服务处理所有底层逻辑并提供数据建立相对安全的&隔离层到最终客户端消耗数据。

答案 6 :(得分:1)

我的建议是,如果您对此非常认真,那么您应该只向签署了具有法律约束力的保密协议的人员发布演示软件。如果他们违反协议,请准备上法庭。

一定要模糊你的演示应用程序等,但不要想象这会阻止一个坚定的黑客发现你的应用程序中的“秘密酱”。在理论和实践中,阻止这种情况不可能。如果您使用通过付费许可证模式将软件货币化,则盗版是不可避免的。

(实际上,它在理论上是可行的,但只有完全安全的平台,如TPM。这对你来说不是一个选择。相信我。)

答案 7 :(得分:0)

加密类文件和使用自定义类加载器加载类文件怎么样?

答案 8 :(得分:0)

一切都是可以破解的。只要拥有一个可靠的EULA并将努力放在那里,而不是将它们浪费在无望的保护代码上。