现在我试图找到最好的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/

为了测试,我编写了非常简单的代码。您如何看待什么代码来测试分解器?也许这个想法比尝试{} catch(){}最后{}更好?

有帮助吗?

解决方案

您用于测试的代码应 测试JDK中可用的功能用于编译目标类. 。例如,如果您知道您的目标是用Java 1.5编写的,则可以合理地假设代码可能包括 仿制药, ,因此您将要确保所选的分解器正确处理它们。以我的经验,可以自由使用的分解器往往会落后于JDK发行,从而获得1-2个发行的功能。

根据个人反复试验, JD 一般而言,倾向于做最好的工作。但是,如果您要以1.3或更低的方式编写的代码,我也建议您给予 jode 尝试。

5年后编辑:

CFR, Procyon, , 和 蕨类植物 在这个空间中领先。

其他提示

我一直在使用 http://java.decompiler.free.fr/ 很长一段时间以来,发现它是最好的。特别是我用它来编译第三方罐子,并且也能够使用它修改源代码。

它易于使用,UI也很整洁且干净。

更新:Java分解器不再可用 http://java.decompiler.free.fr/. 。它有新链接 http://jd.benow.ca/ 可以从哪里下载。

如果您希望获得任何有意义的结果,那么您确实应该使用更多的非平凡代码进行测试。 Fernflower的创建是为了处理高度不寻常和混淆的字节码。因此,将如此简单的片段进行分解并没什么大不了的。顺便说一句,如果您有兴趣测试fernflower的独立版本,请在Fernflower(dot)Exompiler(at)Gmail(dot)com上给我留言。版本0.8.4现在使用半公开Beta(但是网站尚不可用)。

看起来像 fernflowerJD Java分解器 正在生产该特定测试柜尽可能出色的分解代码。 IMO,其他两个做得不好。

您如何看待什么代码来测试分解器?

  1. 使用所有可用的构造编写更复杂的代码。
  2. 尝试使用一些真实的代码。
  3. 尝试使用一些已混淆的真实代码。

尝试从源中编译的代码时,请尝试使用不同的“ -g”选项以及不同的Java编译器。

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

有关信息,JD支持Switch(ENUM),Switch(String),断言语句和面孔循环。

关于-g(Javac)选项,

  • 如果您省略了行号,JD无法重建指令的原始流:无法确定循环类型,无法再生多个评估,并且用于重新调整源代码的算法无法工作。
  • 如果您省略了局部变量数据,JD将无法确定变量的确切范围。这是有问题的。

好的,这是用我的手机写的,所以请忍受。

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

您的异常块未返回您编写的原始代码的原因是因为Javac编译并将代码转换为Java字节码的方式。

如果您想知道哪种反编译器最有效,请用一些表达式编写所有Java众所周知的语句(对于循环,IF语句,循环),并查看最佳代表您的原始代码。

祝你好运。

自此线程的任何反馈以来已经有一段时间了。但是,由于我找到了它并认真对待投入,因此我认为进行更新很重要。

我已经免费使用了Java Exompiler,并取得了良好的成功。但是,最近我不小心删除了许多生产J2EE应用程序的代码。假设JD Free会处理它,但根本无法处理仿制药。另外,还有代码处理可变初始化完全错误。我最终发现的是一团糟。

可能没有任何正确的工作。就我而言,这只是备份,备份,备份中的另一堂课。我需要一个正确处理仿制药以进行质量恢复的杂交器。但是处理变量的某些准确性也会有所帮助。要求一个工具吐出原始代码是太多的。但是到目前为止,我所看到的会编译,但无法正常运行,泛型。所以我想这将是圣诞节前一周!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top