选择和测试java反编译器[关闭]
Posted
技术标签:
【中文标题】选择和测试java反编译器[关闭]【英文标题】:Choose and test java decompiler [closed] 【发布时间】:2011-04-23 08:10:02 【问题描述】:现在我正在努力寻找最好的 java 反编译器,我找到了这些:
http://java.decompiler.free.fr/ http://www.reversed-java.com/fernflower/ http://dj.navexpress.com/ http://cavaj-java-decompiler.en.softonic.com/使用这些反编译器,我可以处理此类的字节码:
public class ss
public static void main(String args[])
try
System.out.println("try");
catch(Exception e)
System.out.println("catch");
finally
System.out.println("finally");
我得到了以下结果:
蕨花:
public class ss
public static void main(String[] var0)
try
System.out.println("try");
catch (Exception var5)
System.out.println("catch");
finally
System.out.println("finally");
DJ Java 反编译器:
import java.io.PrintStream;
public class ss
public ss()
public static void main(String args[])
System.out.println("try");
System.out.println("finally");
break MISSING_BLOCK_LABEL_50;
Exception exception;
exception;
System.out.println("catch");
System.out.println("finally");
break MISSING_BLOCK_LABEL_50;
Exception exception1;
exception1;
System.out.println("finally");
throw exception1;
cavaj:
import java.io.PrintStream;
public class ss
public ss()
public static void main(String args[])
System.out.println("try");
System.out.println("finally");
break MISSING_BLOCK_LABEL_50;
Exception exception;
exception;
System.out.println("catch");
System.out.println("finally");
break MISSING_BLOCK_LABEL_50;
Exception exception1;
exception1;
System.out.println("finally");
throw exception1;
http://java.decompiler.free.fr/:
import java.io.PrintStream;
public class ss
public static void main(String[] paramArrayOfString)
try
System.out.println("try");
catch (Exception localException)
System.out.println("catch");
finally
System.out.println("finally");
我看到反编译器的最佳结果:http://java.decompiler.free.fr/
为了测试,我写了非常简单的代码。你怎么看,写什么代码来测试反编译器?也许这个想法比 try catch() finally 更好?
【问题讨论】:
如果你在 OS X 上,我也会给 Jar Inspector 一个机会:codeland.org @Brent Nash,不幸的是,Jar Inspector 不再维护,并且在 OSX Snow Leopard 下不起作用:( 请注意,java.decompiler.free.fr 将不再工作,该项目现在在jd.benow.ca 相关***.com/questions/4375037/java-decompiler 我列了一个清单:community.jboss.org/people/ozizka/blog/2014/05/06/… 【参考方案1】:您用于测试的代码应该测试 JDK 中用于编译目标类的可用功能。例如,如果您知道您的目标是用 Java 1.5 编写的,那么假设代码可能包含generics 是合理的,因此您需要确保您选择的反编译器能够正确处理它们。根据我的经验,免费提供的反编译器在 1-2 版本支持的功能方面往往落后于 JDK 版本。
根据个人的反复试验,JD 通常会做得最好。但是,如果您要反编译以 1.3 或更低版本编写的代码,我还建议您尝试一下 JODE。
编辑,5 年后:
CFR、Procyon 和 Fernflower 在这个领域处于领先地位。
【讨论】:
【参考方案2】:Procyon 拥有it's own comparison。
【讨论】:
【参考方案3】:我已经使用http://java.decompiler.free.fr/ 很长时间了,发现它是最好的。特别是我用它反编译了一个第三方jar,我也可以用它修改源代码。
它易于使用,用户界面也整洁干净。
更新:http://java.decompiler.free.fr/ 上不再提供 Java 反编译器。它有新的链接http://jd.benow.ca/,可以从那里下载。
【讨论】:
【参考方案4】:如果您希望得到任何有意义的结果,您真的应该使用更重要的代码进行测试。创建 Fernflower 的目的是处理非常不寻常和混淆的字节码。因此,反编译如此简单的 sn-ps 没什么大不了的。顺便说一句,如果您有兴趣测试 Fernflower 的独立版本,请在 fernflower(dot)decompiler(at)gmail(dot)com 上给我留言。 0.8.4 版现在处于半公开测试阶段(但尚未在网站上提供)。
【讨论】:
【参考方案5】:看起来fernflower
和JD Java Decompiler 正在生成尽可能适合这个特定测试用例的反编译代码。另外两个做得不好,IMO。
你怎么看,写什么代码来测试反编译器?
-
使用所有可用的结构编写更复杂的代码。
在一些真实的代码上尝试一下。
在一些经过混淆的真实代码上试用它们。
在尝试从源代码编译的代码时,尝试不同的“-g”选项和不同的 Java 编译器。
【讨论】:
【参考方案6】:http://www.reversed-java.com/fernflower/,在 github.com /vorburger/ScratchApplet 上查看我的比较
【讨论】:
【参考方案7】:关于信息,JD 支持 switch(enum)、switch(string)、assert 语句和 for-each 循环。
关于 -g(javac) 选项,
如果省略行号,京东可以 不重构原始流程 说明:循环的类型可以 不确定的,倍数 分配不能重新生成,并且 用于重新对齐源的算法 代码无法工作。 如果您省略 局部变量数据,JD不行, 有时,确定确切的范围 的变量。有问题。【讨论】:
你是说京东吗?如java.decompiler.free.fr ??如果是这样,我根本找不到 -g 选项,没有它它不支持 switch(enum)。【参考方案8】:好的,这是我手机上写的,请多多包涵。
首先,每个 java 文件代码都在它们各自的 .class 文件中编译成字节码。这意味着常量被存储AS IS
(因此字符串可以很容易地被检索到)并且变量被分配给一个寄存器,然后当JVM处理类文件时,该寄存器被放入堆栈程序执行中。
您的异常块未返回到您编写的原始代码的原因是 javac 编译并将代码转换为 java 字节码的方式。
如果您想知道哪种反编译器效果最好,请使用一些表达式编写所有 java 众所周知的语句(for 循环、if 语句、while 循环),看看哪些最能代表您的原始代码。
祝你好运。
【讨论】:
局部变量直接赋值给栈槽。【参考方案9】:已经有一段时间没有对此线程的任何反馈了。但是,自从我找到它并认真对待输入后,我觉得提供更新很重要。
我已经成功使用了 Java Decompiler Free。但是,最近我不小心删除了很多生产 J2EE 应用程序的代码。假设 JD Free 会处理它,但它根本不处理泛型。此外,还有一些代码在处理变量初始化时完全错误。我最终得到的是一团糟。
可能没有任何东西可以正确完成这项工作。就我而言,这只是备份,备份,备份的另一堂课。我需要一个能够正确处理泛型的反编译器,以便进行大规模恢复。但是处理变量的一些准确性也会有所帮助。要求一个工具吐出原始代码太过分了。但是到目前为止我所看到的将编译但不会正常运行,泛型除外。所以我想这将是圣诞节前的漫长一周!
【讨论】:
又一个使用源代码管理的论据...以上是关于选择和测试java反编译器[关闭]的主要内容,如果未能解决你的问题,请参考以下文章