【问题标题】:make your Jar not to be decompiled让你的 Jar 不被反编译
【发布时间】:2023-03-18 14:52:01
【问题描述】:

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

【问题讨论】:

    标签: jar executable


    【解决方案1】:

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

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

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

    【讨论】:

    • 如何,在哪里应用这样的场景,先生?
    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 如果你能分享更多关于你的发现,我将不胜感激,你是否能够在 ccoversion 之后运行,或者能够将它们称为库,或者你能够从命令行或可执行文件运行它们?跨度>
      【解决方案4】:

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

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

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

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

      【讨论】:

        【解决方案5】:

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

        A suggestion from this website(甲骨文社区)

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

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

        下面这个是一步一步的: ProtectYourJavaCode

        享受吧! 继续添加您的解决方案,我们需要更多。

        【讨论】:

        • C什么时候变得“很难反编译”了?
        猜你喜欢
        • 2012-03-26
        • 1970-01-01
        • 2020-08-22
        • 1970-01-01
        • 2017-07-03
        • 1970-01-01
        • 2021-02-20
        • 2017-08-14
        • 1970-01-01
        相关资源
        最近更新 更多