题
现在我试图找到最好的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;
}
}
卡瓦伊:
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(){}最后{}更好?
其他提示
我一直在使用 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(但是网站尚不可用)。
看起来像 fernflower
和 JD Java分解器 正在生产该特定测试柜尽可能出色的分解代码。 IMO,其他两个做得不好。
您如何看待什么代码来测试分解器?
- 使用所有可用的构造编写更复杂的代码。
- 尝试使用一些真实的代码。
- 尝试使用一些已混淆的真实代码。
尝试从源中编译的代码时,请尝试使用不同的“ -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会处理它,但根本无法处理仿制药。另外,还有代码处理可变初始化完全错误。我最终发现的是一团糟。
可能没有任何正确的工作。就我而言,这只是备份,备份,备份中的另一堂课。我需要一个正确处理仿制药以进行质量恢复的杂交器。但是处理变量的某些准确性也会有所帮助。要求一个工具吐出原始代码是太多的。但是到目前为止,我所看到的会编译,但无法正常运行,泛型。所以我想这将是圣诞节前一周!