【发布时间】:2023-03-18 14:52:01
【问题描述】:
如何将我的 Java 应用程序打包到无法反编译的可执行 jar 中(例如,通过 Jadclipse)?
【问题讨论】:
标签: jar executable
如何将我的 Java 应用程序打包到无法反编译的可执行 jar 中(例如,通过 Jadclipse)?
【问题讨论】:
标签: jar executable
你不能。如果 JRE 可以运行它,应用程序就可以对其进行反编译。
你能期望的最好的就是让它变得非常难以阅读(用'l'和'1'以及'O'和'0'的组合替换所有符号,放入大量无用的代码等等) .即使使用相对笨拙的翻译工具,您也会对编写代码的可读性感到惊讶。 这称为混淆,虽然并不完美,但有时就足够了。
请记住,你无法阻止坚定的黑客和坚定的窃贼。你想要做的是让临时攻击者的事情变得非常困难。当出现O001l1ll10O、O001llll10O、OO01l1ll10O、O0Ol11ll10O 和O001l1ll1OO 符号以及似乎没有任何用处的代码时,大多数人会放弃。
【讨论】:
首先,您无法避免人们对您的代码进行逆向工程。 JVM 字节码必须是简单的才能执行,并且有几个程序可以对其进行逆向工程(同样适用于 .NET CLR)。您只会让查看和理解代码的障碍(即成本)变得越来越困难。
通常的方法是使用一些工具obfuscate 源。类、方法和字段在整个代码库中被重命名,即使您选择使用无效的标识符,也使得代码几乎无法理解。过去我使用JODE 取得了不错的成绩。混淆后使用反编译器查看您的代码是什么样子...
除了混淆之外,您可以使用某种方法加密您的类文件(除了一个小的入门类之外),并使用自定义类加载器来解密它们。不幸的是,类加载器类本身无法加密,因此人们可能会通过阅读类加载器的反编译代码来找出解密算法。但是攻击你的代码的窗口变小了。同样,这不会阻止人们看到您的代码,只会让临时攻击者更难。
您还可以尝试将 Java 应用程序转换为一些 Windows EXE,这将隐藏它是 Java 的线索(在某种程度上)或真正编译成机器代码,这取决于您对 JVM 功能的需要。 (我没试过。)
【讨论】:
GCJ 是一个免费工具,可以编译为字节码或本机代码。请记住,这确实违背了 Java 的目的。
【讨论】:
我知道有点晚了,但答案是否定的。
即使您使用 C 编写并编译为本机代码,也有反汇编器/调试器允许人们逐步执行您的代码。诚然——在没有符号信息的情况下调试优化代码是一件痛苦的事——但它可以做到,我有时不得不这样做。
您可以采取一些步骤来增加难度 - 例如在 Windows 上,您可以在循环中调用 IsDebuggerPresent API 以查看是否有人正在调试您的进程,如果是并且它是发布版本 - 终止进程。当然,足够坚定的攻击者可以拦截您对 IsDebuggerPresent 的调用并始终返回 false。
出现了各种各样的技术 - 想要保护某物的人和想要彻底破解它的人,这是一场名副其实的军备竞赛!一旦你走上这条路 - 你将不得不不断更新/升级你的防御,没有停止。
【讨论】:
这不是我的实际解决方案,但是,我认为这里有很好的收藏或资源和教程,可以让它达到最高的满意度。
A suggestion from this website(甲骨文社区)
(干净的方式),混淆你的代码,有很多开源和免费的 混淆器工具,这里有一个简单的列表: [Open source obfuscators list]。 这些工具使您的代码不可读(尽管您仍然可以反编译 它)通过更改名称。这是保护您的最常用的方法 代码。
2.(不那么干净的方式)如果您有特定的目标平台(如Windows),或者您可以为不同的平台提供不同的版本, 您可以在低级别编写算法的复杂部分 像 C 这样的语言(很难反编译和理解)和 在您的 Java 应用程序中将其用作本机库。它不干净, 因为我们中的许多人使用 java 是因为它的跨平台能力,并且 这种方法会削弱这种能力。
下面这个是一步一步的: ProtectYourJavaCode
享受吧! 继续添加您的解决方案,我们需要更多。
【讨论】: