【问题标题】:Choose and test java decompiler [closed]选择和测试java反编译器[关闭]
【发布时间】:2011-04-23 08:10:02
【问题描述】:

现在我正在努力寻找最好的 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;
    }
}

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

【问题讨论】:

标签: java decompiler


【解决方案1】:

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

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

编辑,5 年后:

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

【讨论】:

    【解决方案2】:

    【讨论】:

      【解决方案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】:

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

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

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

          在尝试从源代码编译的代码时,尝试不同的“-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 会处理它,但它根本不处理泛型。此外,还有一些代码在处理变量初始化时完全错误。我最终得到的是一团糟。

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

              【讨论】:

              • 又一个使用源代码管理的论据...
              猜你喜欢
              • 2014-08-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-12-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多