让你的Jar不被反编译

时间:2009-05-28 07:52:51

标签: jar executable

如何将我的Java应用程序打包到一个无法反编译的可执行jar中(例如,通过Jadclipse)?

5 个答案:

答案 0 :(得分:10)

你做不到。如果JRE可以运行它,应用程序可以对其进行反编译。

你能想到的最好的事情就是让它很难阅读(用'l'和'1'和'O'和'0'组合替换所有符号,放入许多无用的代码等等) 。你会惊讶地发现,即使使用相对愚蠢的翻译工具,你也无法理解代码。 这称为混淆,虽然不完美,但有时也足够了。

请记住,除了确定的窃贼之外,你无法阻止坚定的黑客。你要做的是让偶然的攻击者变得非常困难。如果出现符号O001l1ll10OO001llll10OOO01l1ll10OO0Ol11ll10OO001l1ll1OO,以及似乎没有做任何有用的代码,大多数人都会放弃。

答案 1 :(得分:3)

首先,你无法避免人们对你的代码进行逆向工程。 JVM字节码必须是明确的,并且有几个程序可以对它进行逆向工程(同样适用于.NET CLR)。您只能越来越难以提高屏障(即成本)来查看和理解您的代码。

通常的方法是obfuscate使用某种工具来源。在整个代码库中重命名了类,方法和字段,即使您选择使用无效标识符,也会使代码无法理解。我过去在JODE取得了不错的成绩。混淆后使用反编译器来查看你的代码是什么样的......

在模糊处理旁边,您可以使用某种方法加密类文件(除了一个小的入门类之外),并使用自定义类加载器来解密它们。遗憾的是,类加载器类本身无法加密,因此人们可能会通过读取类加载器的反编译代码来找出解密算法。但攻击代码的窗口变小了。同样,这并不妨碍人们看到你的代码,只会让偶然的攻击者更难。

您还可以尝试将Java应用程序转换为某些Windows EXE,这将隐藏它的Java(在某种程度上)或者真正编译成机器代码的线索,具体取决于您对JVM功能的需求。 (我没试过。)

答案 2 :(得分:2)

GCJ是一个可以编译为字节码或本机代码的免费工具。请记住,这确实会破坏Java的目的。

答案 3 :(得分:1)

我知道有点晚了,但答案是否定的。

即使您使用C语言编写并编译为本机代码,也会有一些解析器/调试器允许人们单步执行代码。当然 - 调试没有符号信息的优化代码是一件痛苦的事情 - 但是可以做到,我有时必须这样做。

您可以采取一些措施来加强这一步骤,例如在Windows上,您可以在循环中调用IsDebuggerPresent API以查看是否有人正在调试您的进程,如果是,并且它是发布版本 - 终止该进程。当然,一个足够坚定的攻击者可以拦截你对IsDebuggerPresent的调用,并且总是返回false。

已经出现了各种各样的技术 - 想要保护某些东西的人和那些外出破坏它的人,这是一场名副其实的军备竞赛!一旦你走上这条道路 - 你将不得不不断更新/升级你的防御,没有停止。

答案 4 :(得分:1)

这不是我的实际解决方案,但是,在这里我认为好的收藏或资源和教程可以使它达到最高的满意度。

A suggestion from this website(oracle社区)

  

(干净的方式),混淆你的代码,有很多开源和免费   混淆器工具,这里有一个简单的列表: [Open source obfuscators lis t]。   这些工具使您的代码不可读(尽管您仍然可以反编译   它)通过改变名称。这是保护你的最常见方式   代码。

     

2.(不太干净)如果您有特定的目标平台(如Windows),或者您可以为不同的平台使用不同的版本,   您可以在较低级别编写复杂的算法部分   像C这样的语言(很难反编译和理解)和   在java应用程序中将它用作本机库。它不干净,   因为我们很多人都使用java来获得它的跨平台能力   这种方法淡化了这种能力。

这一步骤如下: ProtectYourJavaCode

享受! 保持您的解决方案,我们需要更多。