42

现在我试图找到最好的 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");}
}
}

我得到了以下结果:

蕨类植物:

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

卡瓦伊:

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

4

9 回答 9

26

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

基于个人的反复试验,京东总体上往往做得最好。但是,如果您要反编译以 1.3 或更低版本编写的代码,我还建议您尝试一下JODE

编辑,5年后:

CFRProcyonFernflower在这个领域处于领先地位。

于 2010-10-12T15:33:20.270 回答
10

Procyon它自己的比较

于 2013-06-12T09:04:43.040 回答
8

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

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

更新:http: //java.decompiler.free.fr/上不再提供 Java 反编译器。它有新的链接http://jd.benow.ca/可以从那里下载。

于 2010-11-30T08:57:30.797 回答
6

看起来JD Java Decompilerfernflower正在为这个特定的测试用例生成尽可能好的反编译代码。另外两个做得不好,IMO。

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

  1. 使用所有可用的结构编写更复杂的代码。
  2. 在一些真实的代码上试用它们。
  3. 在一些被混淆的真实代码上试用它们。

在尝试从源代码编译的代码时,请尝试不同的“-g”选项和不同的 Java 编译器。

于 2010-10-10T05:49:42.383 回答
6

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

于 2010-10-15T08:49:04.420 回答
5

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

于 2010-11-27T00:34:21.453 回答
4

有关信息,JD 支持 switch(enum)、switch(string)、assert 语句和 for-each 循环。

关于 -g(javac) 选项,

  • 如果省略行号,JD 将无法重建原始指令流:无法确定循环类型,无法重新生成多个分配,用于重新对齐源代码的算法无法工作。
  • 如果省略局部变量数据,JD 有时无法确定变量的确切范围。这是有问题的。
于 2010-10-12T19:43:16.837 回答
1

好的,这是用我的手机写的,请多多包涵。

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

您的异常块未返回到您编写的原始代码的原因是由于 javac 编译并将代码转换为 java 字节码的方式。

如果您想知道哪种反编译器效果最好,请使用一些表达式编写所有 java 众所周知的语句(for 循环、if 语句、while 循环)并查看最能代表您的原始代码的语句。

祝你好运。

于 2010-10-10T00:16:57.487 回答
0

已经有一段时间没有对该线程的任何反馈了。但是,自从我找到它并认真对待输入后,我觉得进行更新很重要。

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

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

于 2012-12-19T17:26:12.040 回答