我知道,这里已经有很多类似的问题了。我并不是在问我能否保护我的编译后的Java类 - 因为显而易见你会说“不行”。我想问的是,保护Java类免受反编译的最佳方法是什么?如果您了解这个领域的任何研究或学术论文,请告诉我。同样,如果您使用过某些方法或软件,请分享您的经验。任何信息都将非常有用。谢谢。
我知道,这里已经有很多类似的问题了。我并不是在问我能否保护我的编译后的Java类 - 因为显而易见你会说“不行”。我想问的是,保护Java类免受反编译的最佳方法是什么?如果您了解这个领域的任何研究或学术论文,请告诉我。同样,如果您使用过某些方法或软件,请分享您的经验。任何信息都将非常有用。谢谢。
如果你的目标市场仅限于Windows,那么有一种非常容易防止 ".class转为.java" 反编译的方法:使用像Excelsior Jet这样的工具将 .jar 转换为 .exe。
这是绝对可靠的:如果使用 Excelsior Jet,就 不可能 获取 .java 文件(因此所有声称 "无法防止 .class 文件反编译" 的人都错了)。当然,攻击者可以启动 SoftIce 并尝试跟踪你的 .exe,但这比使用 JAD 反编译 .class 为 .java 难多了,而且肯定无法找回 .java 文件。
现在也许你的目标市场还包括 macOS 和 Linux,或者你没有足够的资金购买 Excelsior Jet。
我正在编写一款用 Java 编写的商业软件。只有在有互联网连接时才有意义。因此,我们通过在服务器端进行部分计算来“保护”我们的软件:我们有几个 .class 文件,除非它们从服务器端生成并发送到客户端,否则无法正常工作(而且发送到客户端的内容始终是不同的:我们在服务器端生成唯一的、一次性的 .class 文件)。
这需要互联网连接,但如果用户不喜欢我们软件的工作方式,他可以自由地购买我们竞争对手的劣质产品 ;)
反编译没有什么用:你需要积极破解软件(即复制服务器端发生的情况),否则就无法使用它。
在使用Proguard之前,我们会先使用自己的"字符串混淆"技术。另外,我们进行源代码注入(也可以进行字节码注入),从代码中删除很多内容(如我们注释掉的"assert"),并引入一些随机的"代码流混淆"技术[软件可以采用不同的路径得出相同的结果,这使得软件非常难以追踪]。
然后我们使用免费的Proguard对所有OO层次结构进行优化,并对已经进行了代码流和字符串混淆的代码进行混淆。
因此,我们的流程是:
除此之外,我们还定期(且自动化)地发布更新,始终确保修改一下客户端/服务器端的保护方案(这样每次发布都需要重新开始攻击)。
当然,放弃并认为:“我无法让攻击者的生活更加艰难,因为JAD仍然可以找回.java文件"(这在你使用.class到.exe转换器来保护你的.class文件免受反编译时显然是错误的)是更容易的。
那么如何保护你的类不被反编译呢?一个答案是Crema。Crema会混淆你的.class文件中的符号信息,使它们变得不那么容易被反编译。Crema混淆的符号信息包括类名、超类、接口、变量名、方法等。这些符号名称是Java虚拟机(JVM)用来将你的类与库包链接起来所需的。Crema会混淆这些符号名称,并以相同的方式引用它们,以便JVM仍然可以在类和包之间实现正确的链接。
那么Crema是如何工作的呢?基本上,在将你的类文件分发到互联网上之前,先运行Crema。Crema会混淆其中包含的符号信息,并将每个新类放入文件1.crema中。然后你需要将1.crema重命名为类似于filename.class的东西,然后再将其分发到互联网上。