如何“反编译”Java类文件?

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

在这个网站上的Java性能问题上,我经常看到那些已经“反编译”Java类文件的人的反应,看看编译器如何优化特定的东西。

2016年2月更新:

http://www.javadecompilers.com将JAD列为:;

最stream行的Java反编译器,但主要是这个年龄段。 用C ++编写,速度非常快。
过时,不受支持,不能正确反编译Java 5及更高版本

所以你的里程可能会有所不同,最近jdk(7,8)。

同一网站列出其他工具。

正如萨尔瓦多·瓦伦西亚 ( Salvador Valencia)在评论 (2017年9月)中所指出的那样,javadecompiler提供了一个SaaS,您可以将.classfile upload到云中,并返回反编译的代码。


原始答案:2008年10月

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

Java反编译器 (另一个快速Java反编译器)有:

  • 显式支持反编译和分析Java 5+ “.class”文件。
  • 一个不错的GUI:

截图

它适用于从JDK 1.1.8到JDK 1.7.0的编译器,以及其他( Jikes , JRockit等)。

它具有实际上function完整的在线实时演示版本 ! 你可以在页面上放一个jar文件,看看反编译的源代码,而不需要安装任何东西。

有几个反编译器在那里…快速search产量:

  1. Procyon :开源(Apache 2)并积极开发
  2. Krakatau :开源(GPLv3)并积极开发
  3. CFR :开源(MIT)积极开发
  4. JAD
  5. DJ Java Decompiler
  6. 摩卡

还有很多。

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

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

如果你想看字节码,只需使用JDK自带的javap

我尝试了几个,而浣熊似乎对我最好。 它正处于积极的发展阶段,并且支持最新版本的Java的许多function。

这些是我尝试的其他人:

  • CFR
    • 有前途的,但往往不能反编译的方法。 我会继续关注这个。 还积极开发支持最新的Javafunction。
  • 喀拉喀托
    • 采取不同的方法,它会尝试输出等效的Java代码,而不是尝试重构原始源代码,这有可能使其更好地处理混淆代码。 从我的testing结果来看,它大致与普罗西恩相差无几,但还是有不同的东西。 我不得不使用-skip命令行标志,以防止错误。 积极开发,有趣的是它是用Python编写的。
  • JD-GUI
    • 工作了,但是Procyon的产量要好得多。 这里是比较Procyon输出到原始和JD-GUI的页面 。 JD-GUI也可以作为一个Eclipse插件 ,根本不适合我。 似乎不是开源的,开发似乎是零星的。
  • JAD
    • 工作过,但只支持Java 1.4及以下版本。 也可以作为Eclipse插件使用 。 不再发展中。

我使用JAD Decompiler 。

有一个Eclipse插件, jadeclipse 。 这是相当不错的。

烟灰是较新的Java代码的一个选项。 至less它有最近维护的好处…

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

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

Procyon包含一个反编译器。 这是FOSS。

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

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

DJ Decompiler Mocha

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

以下是截至2015年2月的反编译器列表:

Procyon ,开放源代码, 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及更高版本。

你可以在线testing上面提到的反编译器,不需要安装,做出你自己的教育select。

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

看看cavaj 。

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

http://www.varaneckas.com/jad

  • JAD是一个工作和简单。

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

如果你想看看Java编译器如何做某些事情,你不想反编译,你想反汇编。 反编译涉及将字节码转换为Java源代码,这意味着很多低级信息都会丢失,如果您想了解编译器优化,那么这可能就是您感兴趣的信息。

无论如何,我碰巧写了一个开源的Java反汇编程序 。 与Javap不同的是,即使在高度病态的类上也是如此,所以你可以看到什么模糊处理工具正在为你的类做些什么。 它也可以反编译,但我不会推荐它。

JAD不适合我(Ubuntu 11.10的问题),所以我已经向前移动,并在JODO上采取行动 。 至less它有开放的Java源代码,并能够正确地反编译我的.class

我build议首先检查“分支/通用”分支。 树干不稳定。

在IntelliJ IDEA平台上,您可以使用Java Decompiler IntelliJ Plugin 。 它允许你在debugging过程中显示所有的Java源代码,即使你没有全部。 它基于着名的工具JD-GUI 。

在这里输入图像描述

借助AndroChef Java Decompiler,您可以反编译apk,dex,jar和java类文件。 这很简单,容易。 AndroChef JD基于FernFlower 。 你可以评估它在10个免费的用途。

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

对于OSX,我推荐:jarzilla或JD-GUI

他们都允许你查看jar子,战争等。 文件内容并反编译其中的任何类文件。

Jarzilla: https : //code.google.com/p/jarzilla/
JD-GUI: http : //jd.benow.ca/