最好的Java混淆器是什么?

114

我正在开发一款安全软件,希望对我的Java代码进行混淆,以使它无法被反向工程。哪种Java混淆器是最可靠的?


264
我曾有一些同事编写了一些极度混淆的代码,但这并非他们的本意。 - Steve McLeod
11
足以使你的应用程序逆向工程成本不可承受。 - Dmitry Leskov
5
@Robert Harvey:不确定为什么您认为这个问题没有建设性。它与编程有关,我认为这是一个与其他任何编程问题一样好的问题。 - Xinus
10个回答

110

首先,你需要牢记的是,没有什么是绝对不可能被逆向工程化的。一切都可以被黑客攻击。一个聪明的开发者使用聪明的IDE(集成开发环境)已经可以做得足够好了。

嗯,你可以在这里找到一个列表。ProGuard相当不错。我自己也用它来“缩小”Java代码。


1
@BalusC:那么你用什么工具混淆Java代码?你确实混淆你的Java代码,不是吗? - Thinhbk
@Thinhbk 混淆使得获取有用的堆栈跟踪更加困难。 - Thorbjørn Ravn Andersen
@ThorbjørnRavnAndersen:同意。在我看来,混淆会使堆栈跟踪变得几乎无用。在这种情况下,我使用一些日志消息的技巧,可以帮助解决问题。 - Thinhbk
3
Proguard会生成一个映射表,将混淆后的堆栈跟踪信息翻译回原始代码。否则,就像你说的那样,堆栈跟踪信息会变得无用(但是谁会遇到未捕获的异常呢... ;-))。 - Matthieu
@Matthieu 在出现意外情况(无论是否被捕获)时,您仍需要堆栈跟踪。 - Thorbjørn Ravn Andersen
显示剩余3条评论

41

只要电脑可以运行它,一个足够有动力的人就可以对其进行逆向工程。


3
有多少人可以阅读混淆的代码并理解其逻辑?我有许多工程师朋友,他们都无法做到。只有约翰·纳什可以做到这一点 ;) - kodmanyagha
5
如果他们有足够的动力,他们就可以学会它。这并不难。 - Thorbjørn Ravn Andersen
2
在数学意义上,可以在没有逆向工程的情况下运行。这就是同态加密的含义,但是要使其在计算机软件上实际可用而不是SaaS,需要解决相当多的障碍。我们正在缓慢地朝着这个方向前进。Gentry的全同态加密和Amit Sahai等人的“数学拼图”开创性的工作在这个方向上取得了巨大的飞跃。只有一个缺失的元素(我称之为“屏障函数”)会使整个方案变得可行。现在看来不可能的事情将来会成为可能。 - ogggre
如果动机足够强烈,人类可以阅读和分析任何混淆的代码。甚至有人编写了一个程序,可以阅读Java/Javascript语法,并将所有变量重命名为更可读的名称,然后重新阅读修改后的源代码。我认为混淆不能真正保护代码。 - Scott Chu

30

1
这正是我需要的。我想为我的项目编写PHP混淆器。逻辑在任何地方都是相同的。谢谢... - kodmanyagha
1
关于Java混淆和软件集合的酷炫而广泛的文章。 - m3nda

15

我认为Proguard是最好的选择。它也可以与你的IDE(例如NetBeans)集成。但是需要注意,如果你混淆了代码,可能会在日志中跟踪问题时变得更加困难。


6
如果你混淆你的代码,那么在日志中跟踪问题可能会变得困难,+1。当你认为调试已经够难了的时候…… - Adam Paynter
7
一款良好的混淆器应该能够更改名称和行号信息,并生成一个日志文件以便于还原该过程。这样,至少可以使堆栈跟踪对混淆的二进制文件仍然有用。 - Joachim Sauer
4
ProGuard 会创建这种反向文件以供调试。 :-) - Malax

11

10

我使用了Allatori,它的效果非常好。


8

确实,像保护房屋免受盗窃一样,总有可能逆向工程某些代码。

但这并不妨碍我锁门。

实际上,我不在Java世界中,我使用BitHelmet来处理.net。


7
+1表示加一点,让你回到净值为零。这个答案并不没有帮助。 - HaloWebMaster

7

我之前在公司使用过Klassmaster,它的表现非常出色,并且可以很好地与构建系统集成(尤其是maven支持非常优秀)。但它并不免费。


6

我们发现加密JAR文件比混淆更有效。我们使用Classguard


7
如果您还没有阅读弗拉基米尔·鲁布佐夫(Vladimir Roubtsov)的“破解Java字节码加密”(http://www.javaworld.com/javaworld/javaqa/2003-05/01-qa-0509-jcrypt.html),现在您可能希望这样做。 - Dmitry Leskov
1
链接已经失效。 - Ali Bigdeli

6

另一个使用本地代码而不是defineClass的替代方案是JarCrypt - Renato
一篇关于如何破解ClassGuard的文章:http://setrst.blogspot.com/2010/04/classguard-unguarded.html。我不确定这是否适用于最新版本。 - Renato
机器人链接不再有效。 - Ali Bigdeli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接