我知道这是一个非常常见的问题,实际上这里有一个好主题:
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文件来说足够好了
答案 0 :(得分:1)
一种非常简单的方法是将lambda添加到您的班级。许多反编译器无法处理lambdas。您可以做的另一件事是为您的类提供一个Unicode名称,尤其是使用星体字符的名称。 Unicode类名称很难正确实现,因此大多数反编译器都没有。尝试使用资源是另一件好事,因为它很复杂,并且在vanilla Java代码中没有任何等价物。
这不会打破一个好的反编译器,但这不是你要求的。
答案 1 :(得分:0)
看一下这个http://www.thegeekstuff.com/2008/06/protect-your-java-code-from-reverse-engineering。如果你以JAR的形式发送程序,你实际上会失去控制权。可以修改/复制该程序。你唯一能做的就是通过混淆代码或类似技术来使这些事情变得更难。