2009-12-10 40 views
2

正如我们所知,有很多java反编译器工具可以将.cl​​ass转换为.java文件。如何保护Java代码免受反编译?

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

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

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

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

感谢您的意见和建议。

正在更新

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

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

+0

重复的问题? – 2009-12-10 07:11:03

+0

是的,这是一个重复的:http://stackoverflow.com/questions/49379/how-to-lock-compiled-java-classes-to-prevent-decompilation – David 2009-12-10 07:13:20

+5

使用开源框架来创建闭源产品。有趣。 – 2009-12-10 07:25:34

回答

12

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

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

+0

我们只是想提供免费的演示版本供任何人试用。但是怕黑客可以反编译并获取java代码。 因此,第一步是使用这个技巧删除一些核心数据或核心代码:http://stackoverflow.com/questions/1813853/ifdef-ifndef-in-java 第二步将考虑一些反反编译器方法。 那么我听到你说“你不能保护反编译器和恶意用户的类文件”,我会放弃任何反反编译器解决方案。 “ – Forrest 2009-12-10 07:24:16

+6

”您无法保护反编译器和恶意用户的类文件。“ :) 无法通过反编译器来解析类文件。如果是这样,它也将被保护,不会在Java-VM中运行,因此无用,因为无法将解释和反编译区分开来(从类文件的角度来看)。 – Kosi2801 2009-12-10 07:35:33

10

软件即服务。

+0

确实。现在SaaS似乎非常受欢迎。有些人甚至设想,大多数应用程序将在几年内作为Saas提供。通过像GWT,Vaadin或ICE Faces这样的工具,可以为他们的应用程序创建非常好的用户界面。 – 2009-12-10 06:53:49

6

这是特别有效的唯一办法就是:把你的程序作为某种形式的网络服务,使编译后的代码是从来没有提供对终端用户机。

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

1

事实上,不仅Java,Silverlight和Flash也有同样的问题。任何下载了该软件包的人都可以解压然后反编译来反编译你的代码。

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

+0

对于核心逻辑,可以使用C++来生成dll文件,然后Java使用JNIWrapper将其打包。 – Forrest 2009-12-10 07:36:29

1

我的建议是,如果您真的认真对待这个问题,那么您应该只向已签署具有法律约束力的保密协议的人员发布演示软件。如果他们违反了协议,准备去法庭。

通过一切手段,混淆你的演示应用程序等,但不要想象这将阻止一个确定的黑客发现你的应用程序中的“秘密酱油”。从理论上和实践上来说,不可能是以防止这种情况。如果您使用付费许可模式将软件货币化,盗版是不可避免的。

(实际上,它在理论上是可能的,但只有像TPM一个完全安全的平台,而这是不适合你的选择。相信我。)

0

希望加密的类文件,并使用自定义什么classloader加载你的类文件?

+1

不起作用(请参阅http://www.javaworld.com/javaworld/javaqa/2003-05/01-qa-0509-jcrypt.html)。这些类必须解密才能运行它们,因此您可以在此处获取未加密的版本。 – 2009-12-10 12:38:42

0

一切都是可以破解的。只需拥有一份可靠的EULA,并将努力放在那里,而不是浪费他们去保护代码的绝望尝试。

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

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

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