2008-11-07 207 views
542

我可以使用什么程序来反编译类文件?我真的会得到Java代码,还是只是JVM汇编代码?如何“反编译”Java类文件?

关于本站点上的Java性能问题,我经常看到有人对Java类文件进行了“反编译”,以了解编译器如何优化特定的东西。

+4

“反编译”的艺术也可以被认为是逆向工程。尽管有时在逆向工程时,您并不总是可以访问二进制文件。 – Makach 2009-06-13 10:53:08

+0

没有人提到https://bytecodeviewer.com/,它可以反编译为java源代码和字节码(对于java源代码是基于JAD的)。 – 2018-01-08 16:32:44

回答

576

更新2016年2月:

www.javadecompilers.com名单JAD的存在:

最流行的Java反编译器,但主要只是这个时代的。用C++编写,非常快速。
过时,不支持,不正确编译Java 5的,后来

所以你的里程可能与近期的JDK变化(7,8)。

相同的网站列表其他工具。

而且javadecompiler,由Salvador Valenciathe comments(9月2017)指出,提供在那里你将.class文件上传到云中的SaaS和返回你反编译的代码。


原来的答复:2008年10月

  • JSR 176的最终版本,定义J2SE 5.0(Java SE的5)的主要特点,已发表于9月30日,2004年
  • 由Pavel Kouznetsov先生编写的着名Java反编译器JAD支持的最新Java版本是JDK 1.3
  • 今天从互联网上下载的大多数Java反编译器,比如“DJ Java Decompiler”或“Cavaj Java Decompiler”,都是由JAD支持的:它们不能显示Java 5源代码。

Java Decompiler(另一种快速的Java反编译器)有:

  • 反编译和分析的Java 5+“.class”文件的明确支持。
  • 一个漂亮的GUI:

它的工作原理与JDK 1.1.8编译器高达JDK 1.7.0,和其他人(JikesJRockit等)。

它具有实际功能完全正常的在线live demo version!您只需在页面上放置一个jar文件,然后查看反编译的源代码,而无需安装任何内容。

+4

+1值得一提的是它也是模块化的,所以核心(用C++ )可以在其他地方使用。 – 2010-05-05 04:02:28

+1

jd-gui-0.3.3也可以[这里](http://code.google.com/p/innlab/downloads/detail?name=jd-gui-0.3.3.windows.zip&can=2&q=) – amaidment 2012-07-03 07:55:16

6

看看cavaj

+3

这也使用下面的`jad`。 – 2009-09-18 23:47:16

51

要查看Java源代码,请查看一些反编译器。去搜索jad

如果要查看字节码,只需使用javap随JDK提供。

+4

我会推荐其中一个开源反编译器,因为它们是积极开发的。使用[Procyon](https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler),[CFR反编译器](http://www.benf.org/other/cfr/)或[Krakatau]( https://开头github上。com/Storyyeller/Krakatau)(Python)。 – 2013-08-22 11:26:40

98

有几个反编译器有...快速搜索率:

  1. Procyon:开源(Apache 2的),并积极开发
  2. Krakatau:开源(GPL第三版)积极开发
  3. CFR:开源(MIT),并积极开发
  4. JAD
  5. DJ Java Decompiler
  6. Mocha

还有更多。

这些产生Java代码。 Java带有一些让你看到JVM字节码的东西(javap)。

+2

我还可以补充一点,Procyon,CFR,JAD和DJ可以作为网络服务使用:http://www.javadecompilers.com/ – 2015-12-12 11:21:33

+0

http://www.javadecompilers.com/ - lifesaver bro! – MarcoZen 2016-02-08 20:50:40

+0

http://www.kpdus.com/jad.html是一些广告链接 – marcinj 2016-11-07 15:15:05

10

有几个程序可以使用。您将获得实际的Java代码,但有时代码会被混淆,因此方法以一个字母或数字或随机组合的字母和数字命名。

DJ Decompiler Mocha

9

Java的大多数反编译器基于JAD。这是一个很棒的工具,但不幸的是一段时间没有更新,并且不能很好地处理Java 1.5+类。我还没有看到任何能够正确处理1.5+课程的工具。

+3

在这里你:我刚刚发布了一个答案你的答案;)支持JDK1.5和更多! – VonC 2008-11-07 16:19:16

+0

“我还没有看到任何能够正确处理1.5个以上类的工具” - Procion,Fernflower,JDCore和CFR(这个可以处理Java 8!) – 2015-08-11 15:56:41

13

Soot是较新Java代码的选项。至少它的优势仍然是最近维护...

另外,Java Decompiler是一个反编译器,同时具有独立的GUI和Eclipse集成。

最后,Jdec还没有被提及,虽然它没有像其他选项一样精致。

5
  • JAD是一个工作,很简单。

  • 另外,如果你只是想看到的方法,使用javap。

12

JD-GUI确实不错。您可以打开一个JAR文件并浏览代码,就好像您正在使用IDE的 一样。好东西。

6

到目前为止所列出的所有JAD链接似乎都被破坏了,所以我找到了这个网站。很好用(至少对于Linux来说)!在Ubuntu 11.10上,我不得不下载任何原因的静态文件。

http://www.varaneckas.com/jad

5

如果你想看到Java编译器如何做某些事情,你不想反编译,想要拆卸。反编译涉及到将字节码转换为Java源代码,这意味着很多低级信息都会丢失,如果您想知道编译器优化的问题,这可能是您感兴趣的信息。

无论如何,我会发生写了一个open source Java disassembler。与Javap不同的是,即使在高度病态的类上也是如此,所以你可以看到什么模糊处理工具正在为你的类做些什么。它也可以反编译,尽管我不推荐它。

13

Procyon包括反编译器。这是FOSS。

4

JAD不适用于我(Ubuntu 11.10版本),所以我已经向前移动并在JODO上擦拭。至少它有Open Java源代码,并且能够正确地反编译我的.class

我推荐先查看'branches/generic'分支。树干不稳定。

28

我试了几次,而Procyon似乎对我最好。它正处于积极的发展阶段,并且支持最新版本的Java的许多功能。

这是我试过的人:

  • CFR
    • 看好,但往往失败的方法反编译。我会密切关注这一点。还积极开发支持最新的Java功能。
  • Krakatau
    • 采用不同的方法,因为它会尝试,而不是试图重建原始源,它具有使之成为混淆代码更好的潜力,同等输出的Java代码。从我的测试结果来看,它大致与普罗西恩相差无几,但仍然很高兴拥有不同的东西。我确实必须使用-skip命令行标志,因此它不会因错误而停止。积极开发,有趣的是它是用Python编写的。
  • JD-GUI
  • JAD
    • 工作,但只支持Java 1.4及以下。也可作为Eclipse plugin。不再发展中。
9

这里是为2015年2月的反编译器的列表:

南河,开源,https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler

CFR,自由,没有可用的源代码,http://www.benf.org/other/cfr/

JD,免费用于非商业用途仅有英文,http://jd.benow.ca/

Fernflower,开源,https://github.com/fesh0r/fernflower

JAD - 在这里给出的只是由于历史的原因。免费,无源代码可用,http://varaneckas.com/jad/ 过时,不受支持,并且不能正确反编译Java 5及更高版本。

你可以在线测试上述反编译器,不需要安装,并做出自己的教育选择。

的Java反编译器在云:http://www.javadecompilers.com/

1

随着AndroChef Java Decompiler可以APK反编译,DEX,罐子和Java类文件。这很简单,容易。 AndroChef JD基于FernFlower。你可以评估它在10个免费的用途。

AndroChef支持Java语言功能,如泛型,枚举和注释。根据一些研究,AndroChef Java Decompiler能够反编译传统Java编译器生成的Java应用程序的98.04% - 具有非常高的恢复率。这是一个简单但功能强大的工具,它允许您将Java和Dalvik字节码(DEX,APK)反编译为可读的Java源代码。