如何保护已编译的Java类?

Reg*_*ser 23 java decompiling source-code-protection

我知道,这里有很多类似的问题.我不是在问我是否可以保护我编译的Java类 - 因为很明显你会说"不,你不能".我在问什么是保护Java类不被反编译的最着名的方法?如果您知道该领域的任何研究或学术论文,请告诉我.如果您使用过某些方法或软件,请分享您的经验吗?任何类型的信息都非常有用.谢谢.

Syn*_*r0r 16

首先,如果你的目标"只" Windows的市场有一个非常简单的防止"的.class来的.java"编译:使用像怡东喷气一种工具,将改变的.jar中的.exe文件.

这是万无一失的:如果你使用Excelsior Jet,那么就不可能得到.java文件了(所以人们都说"不可能阻止反编译.class文件").当然,攻击者可以启动SoftIce并尝试跟踪你的.exe,但这比使用JAD将.class反编译为.java有点棘手,它肯定不会允许找回.java文件.

现在也许你的目标是OS X和Linux,或者你没有为Excelsior Jet解决问题.

我正在写一个用Java编写的商业软件.如果有互联网连接,该软件才有意义.因此,我们"保护"我们的软件,其中包括在服务器端进行部分计算:我们有几个.class,除非它们是从服务器端生成的,我们将它们发送到线路上不能工作(并且在线上发送的内容总是不同的:我们在服务器端生成唯一的,一次性的.class文件.

这需要互联网连接,但如果用户不喜欢我们的软件如何工作,那么他可以自由购买我们的竞争对手的劣质产品;)

反编译不会有太大的好处:你主动需要破解软件(即重现服务器端发生的事情),否则你将无法使用它.

使用Proguard 之前,我们使用自己的"字符串混淆" .我们还做了源代码检测(我们也可以完成字节码的检测),我们从代码中删除了很多东西(比如我们注释掉的"断言")并引入一些随机的"代码流混淆"[该软件可以采取不同的路径,但获得相同的结果,这是真正使软件难以追踪的东西]).

然后我们使用Proguard(它是免费的)来展平我们所有的OO层次结构并混淆已经代码流和字符串混淆的代码.

所以我们的流程是:

  • 字符串混淆
  • 随机码流混淆
  • Proguard的
  • 最终的.jar依赖于在服务器端动态生成(不同)的.class.

除此之外,我们发布非常规则(和自动化)更新,总是确保修改我们的客户端/服务器保护方案(因此每次发布时,一个低位的攻击者必须从头开始).

当然,更容易放弃并思考:"我无法做任何事情来让攻击者的生活变得更加艰难,因为JAD无论如何都能找回.java文件"(在这种情况下,这是非常有争议和明显错误的情况)您使用.class到.exe转换器来保护您的.class免于反编译).

  • @Yan Cheng CHEOK:Excelsior JET不是.jar的包装器:它在原生Windows(或Linux)可执行文件中转换Java字节码.所以它并非"万无一失",当然,人们仍然可以尝试反编译它.但是*没有办法*他们会回来.java文件允许编译.class(因为不再有.class文件,不再是字节码,它都是原生.exe [或Linux可执行文件]).这根本不像izpack或Launch4J等包装器. (3认同)
  • @ SyntaxT3rr0r:迟到总比没有好:http://www.excelsiorjet.com/osx (2认同)

Ita*_*man 6

混淆器(请参阅http://java-source.net/open-source/obfuscators)将"扰乱"代码,以便在解编时不会有任何意义.


Dmi*_*kov 6

有几种方法:

所有这些都在我的文章" 保护您的Java代码 - 通过混淆器和超越"中详细讨论过