6

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

4

5 回答 5

11

你不能。如果 JRE 可以运行它,应用程序就可以反编译它。

你能期望的最好的就是让它很难阅读(用'l'和'1'和'O'和'0'的组合替换所有符号,放入大量无用的代码等等)。即使使用相对笨拙的翻译工具,您也会惊讶于编写代码的可读性。这称为混淆,虽然并不完美,但有时就足够了。

请记住,你无法阻止坚定的黑客,就像坚定的窃贼一样。你想要做的是让临时攻击者的事情变得非常困难。当出现符号O001l1ll10OO001llll10OOO01l1ll10OO0Ol11ll10OO001l1ll1OO,以及似乎没有任何用处的代码时,大多数人会放弃。

于 2009-05-28T08:08:49.990 回答
3

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

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

除了混淆之外,您可以使用某种方法加密您的类文件(除了一个小的入门类之外),并使用自定义类加载器来解密它们。不幸的是,类加载器类本身无法加密,因此人们可能会通过阅读类加载器的反编译代码来找出解密算法。但是攻击你的代码的窗口变小了。同样,这不会阻止人们看到您的代码,只会让临时攻击者更难。

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

于 2009-05-28T11:54:06.463 回答
2

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

于 2009-05-29T01:56:42.550 回答
2

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

即使您使用 C 编写并编译为本机代码,也有反汇编器/调试器允许人们逐步执行您的代码。当然——在没有符号信息的情况下调试优化代码是一件痛苦的事情——但它可以做到,我有时不得不这样做。

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

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

于 2014-12-04T20:19:09.383 回答
1

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

来自本网站(oracle 社区)的建议

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

2.(不那么干净的方式)如果你有一个特定的目标平台(比如windows)或者你可以为不同的平台有不同的版本,你可以用像C这样的低级语言编写算法的复杂部分(这很难反编译和理解)并将其用作 Java 应用程序中的本机库。它并不干净,因为我们中的许多人使用 java 是因为它的跨平台能力,而这种方法会削弱这种能力。

下面这个一步一步地跟随: ProtectYourJavaCode

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

于 2015-11-24T13:19:41.147 回答