java - 如何保护jar不被 "simple/easy"反编译

标签 java jar decompiler

我知道这是一个很常见的问题,实际上这里有一个很好的主题:
How to lock compiled Java classes to prevent decompilation?

但我要求的是不同的东西,不是绝对的保护,但至少是针对反编译器的一些基本保护。

我尝试过一些反编译器,例如 JD 和 Jode 以及一些 .jar 文件,但它们无法反编译所有 .java 类,其中许多类我收到错误,而其他许多类只是非常基本的代码。
他们如何保护 jar 文件免受反编译器的侵害?当我在我的 jar 中使用相同的反编译器时,所有类都会被完整详细地反编译。

所以基本上我的问题是,什么可能导致这些反编译器出现此错误?是因为java类被加密了吗?

编辑:
我注意到 Jode 在某些 java 文件中显示了此错误:

Exception while decompiling:java.lang.NoClassDefFoundError: [package.ClassName]
    at jode.bytecode.ClassInfo.loadInfo(ClassInfo.java:631)
    at jode.decompiler.ClassAnalyzer.<init>(ClassAnalyzer.java:86)
    at jode.decompiler.ClassAnalyzer.<init>(ClassAnalyzer.java:123)
    at jode.decompiler.Decompiler.decompile(Decompiler.java:191)
    at jode.swingui.Main.run(Main.java:204)
    at java.lang.Thread.run(Unknown Source)

还尝试使用 FernFlower 反编译器,但出现以下错误:

java.lang.ClassCastException: g cannot be cast to T
        at bK.a(Unknown Source)
        at T.a(Unknown Source)
        at bK.<init>(Unknown Source)
        at bW.a(Unknown Source)
        at bW.<init>(Unknown Source)
        at bW.<init>(Unknown Source)
        at i.a(Unknown Source)
        at i.a(Unknown Source)
        at i.a(Unknown Source)
        at de.fernflower.main.decompiler.ConsoleDecompiler.addSpace(Unknown Source)
        at de.fernflower.main.decompiler.ConsoleDecompiler.main(Unknown Source)

那里有什么保护措施?我认为这对于我的 jar 文件来说已经足够了

最佳答案

一种非常简单的方法是将 lambda 添加到您的类中。许多反编译器无法处理 lambda。您可以做的另一件事是为您的类指定一个 Unicode 名称,尤其是使用星体字符的名称。 Unicode 类名很难正确实现,因此大多数反编译器都不会这样做。 Try-with-resources 是另一个值得尝试的好东西,因为它很复杂并且在普通 Java 代码中没有任何等效项。

这不会破坏一个好的反编译器,但这不是您所要求的。

关于java - 如何保护jar不被 "simple/easy"反编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44099855/

相关文章:

java - 如何从字符串数组中删除前几项?

jar - Gradle,合并来自根和子项目的类

带有 imageview 的 Java Runnable jar 不显示 GUI

flash - 如何查看 Flash 源代码?

flutter - 从 release apk 中提取 flutter 源代码

java - Eclipse PDE 中未找到 View 描述符异常

Java,do while循环运行两次,然后再次请求输入

android - 将库/JAR 添加到 Eclipse Android 项目

java - "java decompiler"JD-Core 0.6.0/JD-GUI 0.3.3反编译代码含义

java - 使用 icu4j 格式化数字(拼写)