我很好奇考虑不要晚上用 Java 编写某些代码,因为它很容易反编译。有没有一种方法可以让我用 Java 编写而不必担心反编译器?我知道只要有足够的时间,任何事情都可以被逆向工程,所以我要问的是:Java 类混淆器是否足够有效地阻止反编译?
7 回答
Java 类混淆器是否足以阻止反编译?
我会说“不”。当我反编译源代码以试图弄清楚某人是如何做某事时,我已经知道我在寻找什么。所以我不必了解整个程序——只需了解当时我感兴趣的一个部分。对方法有足够的困惑并在调用链上回溯一点,通常可以在不付出过多努力的情况下确定引擎盖下的内容。
如果您的问题是我能否确保没有人可以破解我的代码,答案是否定的。无论是在 JAVA 还是 Visual C++ 中。只要黑客可以直接访问由字节或位组成的软件。
原因很简单。
无论您如何编码,都可以对其进行解码。
最好的策略可能是创建一个 Web 服务并在那里部署你的秘密逻辑。让其他人使用您的服务,而无需访问您的写作方式。
在 Java 和其他语言中,混淆只是一种威慑。它只是提高了攻击者的门槛。这并不意味着混淆没有价值,它只是不是保证。
你想保护什么,你的目标是什么类型的市场?
在充满盗版的市场中保护许可证算法的混淆并没有那么大的意义。但是,对于 SMB 来说,它可能足以淘汰大多数休闲盗版者。
如果您试图保护知识产权免受竞争,我看到了两个答案。这个想法,将很难保护。查看代码的有能力的工程师将找出逻辑的精髓并能够重新实现。混淆将使人们更难仅仅拿起代码并将其包含在他们自己的产品中。随着他们尝试进行更改,维护成本将继续增长(我想说干净反编译的代码也是如此)。
我为我的公司开发的 java 产品被混淆了。他们有没有保护我们免遭盗窃……我对此表示怀疑。但是,就我们的开发成本而言,混淆并没有那么昂贵。以低廉的价格获得一点保护并不是一个糟糕的权衡。
从个人反编译 Java 的经验来看,我会说混淆会使某人的反编译尝试变得非常烦人和困难。最让我恼火的是,最终构建的class文件都被命名为“a.class,b.class,c.class”等,并且大量的假人被扔进去。在代码混淆方面,尝试/catchs 可以很好地为反编译器弄乱东西。
一般来说,你反编译的任何东西都不能编译,但会给你关于程序一般工作的提示。
“足够有效”完全取决于你需要它有多有效。这取决于你保护的是什么,以及保护的对象。任何传统方法(混淆、加密字节码、编译为“exe”)都不会在足够的时间和激励下阻止熟练且坚定的攻击者。但这几乎适用于所有形式的编程。(您也可以反汇编或反编译 C/C++ 应用程序......)
防止严重逆向工程的唯一方法是使用安全的执行平台;例如使用基于TPM的东西。即使那样,如果坏人可以将逻辑分析器连接到运行您的代码的系统,他们可以(理论上)捕获正在执行的本机代码,然后开始逆向工程路径。
编辑:据报道,有人使用电子显微镜成功破解了流行的 TPM 芯片;请参阅此注册文章。有趣的是,他最初的动机是破解 Xbox 360 游戏机!
如果您阅读我的帖子https://stackoverflow.com/a/26717791/2132826,您会发现我找不到一个真正按预期工作的好的 Java 去混淆器。
所以目前的答案是:不。
坦率地说不。无论你如何混淆代码,如果有人知道他可以从你的代码中赚到一百万美元,他就会反编译你的类文件并获取代码。
不过还有其他选择:
在分发之前将您的 java 程序转换为 exe。您必须知道这里有问题。
使用密钥加密您的类文件。制作一个自定义类加载器,可以在将类文件加载到内存之前使用私钥对其进行解码。这里有两个问题,a)加载时间增加,b)你将如何隐藏私钥。