我知道,这里已经提出了许多类似的问题。我不是在问我是否可以保护我编译的 Java 类——因为显然你会说“不,你不能”。我在问保护 Java 类免受反编译的最著名方法是什么?如果您知道该领域的任何研究或学术论文,请告诉我。另外,如果您使用过一些方法或软件,请分享您的经验?任何类型的信息都会非常有用。谢谢你。
6 回答
首先,如果您“仅”针对 Windows 市场,则很容易防止“.class to .java”反编译:使用 Excelsior Jet 之类的工具,它将.jar转换为.exe。
这是万无一失的:如果您使用 Excelsior Jet,就不可能取回 .java 文件(只要所有人都说“不可能防止反编译.class文件”)。当然,攻击者可以启动SoftIce并尝试跟踪您的.exe,但这会比使用 JAD 将.class反编译为.java更棘手,而且它肯定不会允许找回.java文件。
现在,也许您也针对 OS X 和 Linux,或者您没有 $$$ 可用于 Excelsior Jet。
我正在编写一个用 Java 编写的商业软件。该软件仅在有 Internet 连接时才有意义。因此,除其他外,我们通过在服务器端进行部分计算来“保护”我们的软件:我们有几个.class除非它们是从服务器端生成的,否则它们将无法工作并且我们将它们发送到网络(并且在线发送的内容总是不同的:我们在服务器端生成唯一的一次性.class文件)。
这需要互联网连接,但如果用户不喜欢我们软件的工作方式,那么他可以自由购买我们竞争对手的劣质产品;)
反编译不会有多大好处:您需要主动破解软件(即重现服务器端正在发生的事情),否则您将无法使用它。
在使用 Proguard之前,我们使用自己的“字符串混淆” 。我们还做源代码检测(我们也可以做字节码检测),我们从代码中删除很多东西(比如我们注释掉的“断言”)并引入一些随机的“代码流混淆”[软件可以采取不同的路径却获得相同的结果,这确实使软件难以追踪])。
然后我们使用 Proguard(它是免费的)来展平我们所有的 OO 层次结构并混淆已经代码流和字符串混淆的代码。
所以我们的流程是:
- 字符串混淆
- 随机码流混淆
- 保卫
- 最终的.jar依赖于在服务器端(不同地)动态生成的.class 。
除此之外,我们发布了非常定期(和自动)的更新,始终确保修改我们的客户端/服务器保护方案(因此每次发布时,假设的攻击者都必须从头开始)。
当然,更容易放弃并思考:“我无能为力让攻击者的生活更加艰难,因为 JAD 无论如何都可以找回 .java 文件”(这在以下情况下非常有争议且明显错误您使用 .class 到 .exe 转换器来保护您的 .class 免受反编译)。
混淆器(请参阅http://java-source.net/open-source/obfuscators)将“打乱”代码,使其在反编译时没有任何意义。
那么如何保护你的类不被反编译呢?一个答案是克丽玛。Crema 对您的 .class 文件中的符号信息进行打乱,以便它们不易被反编译。Crema 打乱的符号信息包括类的名称、它的超类、接口、变量名、方法等。Java 虚拟机 (JVM) 需要这些符号名称来将您的类与库包链接。Crema 打乱这些符号名称并以相同的方式对它们进行引用,以便 JVM 仍然可以实现类和包之间的正确链接。
那么克丽玛是如何工作的呢?基本上,在 Internet 上分发您的类文件之前,在它们上运行 Crema。Crema 将打乱其中包含的符号信息,并将每个新类放在文件 1.crema 中。然后,您的工作是将 1.crema 重命名为 filename.class 之类的名称,然后再将其发布到 Internet 上。
你可以试试Java Protector。这是一种比混淆更好的方法。它通过修改 OpenJDK 的源代码来制作 Native ClassLoader,可以加密你想要通过 AES 保护的类并在他们的自定义 JRE 中解析它们。你可以使用 JRE 发布你的软件并分发您的软件安全。
如果你使用 Linux 和 x86-64 CPU,你可以试试PackerLX。
它是一个免费的基于 Web 的打包程序解决方案。将 jar 文件打包到 ELF 可执行文件中并对其进行保护。ELF 文件有一些保护技术,如加密和反编译保护。PackerLX 是一种新的解决方案,它可以保护所有类型的 linux 可执行文件免受非专业逆向工程的影响。