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