【问题标题】:How to protect jar from "simple/easy" decompilation如何保护 jar 免受“简单/容易”的反编译
【发布时间】:2017-05-21 17:35:44
【问题描述】:

我知道这是一个很常见的问题,一个很好的话题其实就在这里:
How to lock compiled Java classes to prevent decompilation?

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

我用一些 .jar 文件尝试了一些像 JD 和 Jode 这样的反编译器,但它们无法反编译所有 .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 文件来说已经足够了

【问题讨论】:

  • 使用 Java 8 会使不支持它的反编译器感到困惑。 Fernflower(内置于 InteliJ)似乎可以很好地处理 Java 8。

标签: java jar decompiler


【解决方案1】:

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

这不会破坏一个好的反编译器,但这不是你想要的。

【讨论】:

  • Lambda 与 Java 8 Lambda 中的一样。如果您能举个例子,将不胜感激。
【解决方案2】:

看看这个http://www.thegeekstuff.com/2008/06/protect-your-java-code-from-reverse-engineering。如果你以 JAR 的形式发布一个程序,你实际上会失去控制。该程序可以修改/复制。您唯一能做的就是通过混淆代码或类似技术使此类事情变得更难。

【讨论】:

  • 请阅读我的问题的编辑,这些程序是作为 jar 文件提供的,而反编译器无法处理它们,它们是如何实现的?
  • 能否请您列出jar文件中的所有类,看看它是否包含引发错误的类名?
猜你喜欢
  • 2012-07-27
  • 2011-01-29
  • 2012-06-17
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-25
相关资源
最近更新 更多