选择并测试java反编译器

时间:2010-10-09 23:58:19

标签: java decompiler

现在我正在尝试找到最好的java反编译器,我找到了这些:

使用这些反编译器,我处理这个类的字节代码:

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");}
}
}

我得到了以下结果:

fernflower:

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 Decompiler:

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 {}?

更好

9 个答案:

答案 0 :(得分:25)

用于测试的代码应该测试用于编译目标类的JDK中可用的功能。例如,如果您知道目标是用Java 1.5编写的,那么可以合理地假设代码可能包含generics,因此您需要确保所选择的反编译器正确处理它们。根据我的经验,免费提供的反编译器在1-2版本支持的功能方面往往落后于JDK版本。

根据个人的反复试验,JD往往会做得最好。但是,如果您正在反编译以1.3或更低版本编写的代码,我还建议您尝试JODE

编辑,5年后:

CFRProcyonFernflower在此领域处于领先地位。

答案 1 :(得分:10)

答案 2 :(得分:8)

我已经使用http://java.decompiler.free.fr/很长一段时间了,发现它是最好的。特别是我用它来反编译第三方jar,我也可以用它来修改源代码。

易于使用,用户界面整洁干净。

更新:http://java.decompiler.free.fr/上不再提供Java Decompiler。它有新的链接http://jd.benow.ca/,可从中下载。

答案 3 :(得分:6)

看起来fernflowerJD Java Decompiler生成的反编译代码与此特定测试用例一样好。另外两个人做得不好,IMO。

  

你怎么看,用什么代码来测试反编译器?

  1. 使用所有可用的构造编写更复杂的代码。
  2. 尝试一些真实的代码。
  3. 尝试一些已被混淆的真实代码。
  4. 在尝试从源代码编译的代码时,尝试使用不同的“-g”选项,并使用不同的Java编译器。

答案 4 :(得分:6)

如果您希望获得任何有意义的结果,那么您真的应该使用更多非平凡的代码进行测试。 Fernflower的创建旨在处理极不寻常和混淆的字节码。因此,反编译这样简单的片段并不是什么大问题。顺便说一句,如果你有兴趣测试Fernflower的独立版本,请给我发一个注意:fernflower(dot)decompiler(at)gmail(dot)com。版本0.8.4现在处于半公开测试阶段(但尚未在网站上提供)。

答案 5 :(得分:5)

http://www.reversed-java.com/fernflower/,请参阅我在github.com / vorburger / ScratchApplet上的比较

答案 6 :(得分:4)

有关信息,JD支持switch(enum),switch(字符串),断言语句和for-each循环。

关于-g(javac)选项,

  • 如果省略行号,JD可以 没有重建原始的流动 说明:循环的类型可以 不确定,多重 分配不能再生,并且 用于重新调整源的算法 代码无法正常工作。
  • 如果你省略了 局部变量数据,JD不行, 有时,确定确切的范围 变量。这有问题。

答案 7 :(得分:1)

好的,这是用我的手机写的,所以请耐心等待。

首先,每个java文件代码都在其各自的 .class 文件中以字节码编译。这意味着常量存储AS IS(因此可以轻松检索字符串),并将变量分配给寄存器,然后在JVM处理类文件时将其置于堆栈程序执行中。

您的异常块未返回到您编写的原始代码的原因是因为javac编译的方式&将代码翻译成java字节码。

如果你想知道哪个反编译器工作得最好,可以用一些表达式&amp ;;写出所有java众所周知的语句(for循环,if语句,while循环)。看看最能代表原始代码的内容。

祝你好运。

答案 8 :(得分:0)

自从对此主题发表任何反馈以来已经有一段时间了。但是,自从我发现它并认真对待输入后,我觉得提供更新非常重要。

我使用Java Decompiler Free取得了很好的成功。但是,最近我不小心删除了生产J2EE应用程序的相当多的代码。假设JD Free会处理它,但它根本不处理泛型。还有代码,它处理变量初始化完全错误。我最终得到的是一团糟。

可能没有任何东西可以正确地完成工作。就我而言,它只是备份,备份,备份的另一课。我需要一个可以正确处理泛型的解编译器,以便进行大规模恢复。但处理变量的一些准确性也会有所帮助。要求工具吐出原始代码太过分了。但到目前为止我所看到的将会编译但不能正常运行,除了泛型。所以我想这将是圣诞节前的一个漫长的一周!!