如何保护编译的Java类?
我知道,这里已经提出了许多类似的问题。我不是在问我是否可以保护我编译的Java类 - 因为显然你会说“不,你不能”。我在问保护Java类免受反编译的最广为人知的方法是什么?如果您知道该领域的任何研究或学术论文,请告诉我。另外,如果您使用过某些方法或软件,请分享您的经验?任何类型的信息都将非常有用。谢谢。
我知道,这里已经提出了许多类似的问题。我不是在问我是否可以保护我编译的Java类 - 因为显然你会说“不,你不能”。我在问保护Java类免受反编译的最广为人知的方法是什么?如果您知道该领域的任何研究或学术论文,请告诉我。另外,如果您使用过某些方法或软件,请分享您的经验?任何类型的信息都将非常有用。谢谢。
首先,如果您“仅”针对Windows市场,则很容易防止“.class.java”反编译:使用像Excelsior Jet这样的工具,它将在.exe中转换.jar。
这是万无一失的:如果您使用Excelsior Jet,则不可能取回.java文件(对于所有说“不可能防止.class文件反编译”的人来说,这是很长时间)。当然,攻击者可以启动SoftIce并尝试跟踪您的.exe但这比使用JAD将.class反编译为.java并且肯定不允许找到.java文件要棘手一些。
现在,也许你也瞄准了OS X和Linux,或者你没有$ $ $来为Excelsior Jet做准备。
我正在编写一个用Java编写的商业软件。该软件只有在有互联网连接时才有意义。因此,我们通过在服务器端进行部分计算来“保护”我们的软件:我们有几个.class除非它们从服务器端生成并且我们沿着线路发送它们,否则它们将无法正常工作(并且在线上发送的内容总是不同的:我们在服务器端生成唯一的,一次性.class文件)。
这需要互联网连接,但如果用户不喜欢我们的软件的工作方式,那么他可以自由地购买竞争对手的劣质产品;)
反编译不会有太大的好处:你积极地需要破解软件(即重现服务器端发生的事情),否则你将无法使用它。
在使用Proguard之前,我们使用自己的“字符串混淆”。我们还进行源代码检测(我们也可以进行字节码输入),从代码中删除很多东西(例如我们注释掉的“断言”),并引入一些随机的“代码流混淆”[软件可以采取不同的路径但获得相同的结果,这确实使软件难以跟踪])。
然后,我们使用Proguard(是免费的)来扁平化我们所有的OO层次结构,并对已经代码流和字符串混淆的代码进行模糊处理。
所以我们的流程是:
除此之外,我们还发布了非常定期(和自动)的更新,这些更新始终确保修改我们的客户端/服务器保护方案(因此,每次发布时,假设攻击者必须主要从头开始)。
当然,扔掉毛巾并思考:“我无能为力,无法使攻击者的生活更加艰难,因为JAD无论如何都可以找到.java文件”(如果您使用.class来.exe转换器来保护.class免受反编译,这是非常值得商榷的,而且明显是错误的)。