我知道这是一个很常见的问题,实际上这里有一个很好的主题:
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/