选择和测试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反编译器[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在bos中安装java反编译插件

尝试使用反编译的应用程序文件打开应用程序 [关闭]

有 C++ 反编译器吗? [关闭]

Java反编译工具

如何反编译整个Jar文件? [关闭]

如何有效的防止Java程序被反编译和破解