如何将我的Java应用程序打包到一个无法反编译的可执行jar中(例如,通过Jadclipse)?
答案 0 :(得分:10)
你做不到。如果JRE可以运行它,应用程序可以对其进行反编译。
你能想到的最好的事情就是让它很难阅读(用'l'和'1'和'O'和'0'组合替换所有符号,放入许多无用的代码等等) 。你会惊讶地发现,即使使用相对愚蠢的翻译工具,你也无法理解代码。 这称为混淆,虽然不完美,但有时也足够了。
请记住,除了确定的窃贼之外,你无法阻止坚定的黑客。你要做的是让偶然的攻击者变得非常困难。如果出现符号O001l1ll10O
,O001llll10O
,OO01l1ll10O
,O0Ol11ll10O
和O001l1ll1OO
,以及似乎没有做任何有用的代码,大多数人都会放弃。
答案 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
享受! 保持您的解决方案,我们需要更多。