如何“反编译” Java类文件?[关闭]


556

我可以使用什么程序反编译类文件?我实际上会得到Java代码,还是仅仅是JVM汇编代码?

关于该站点上的Java性能问题,我经常看到“反编译” Java类文件以了解编译器如何优化某些东西的人们的回答。


4
“反编译”技术也可以被认为是逆向工程。尽管有时在进行逆向工程时,您并不总是可以访问二进制文件。
Makach

没有人提到bytecodeviewer.com,它可以反编译为Java源代码和字节码(因为Java源代码基于JAD)。
费尔南多·冈萨雷斯·桑切斯

Answers:


588

2016年2月更新:

www.javadecompilers.com将JAD列出为:

最受欢迎的Java反编译器,但仅在这个时代才出现。用C ++编写,非常快。
过时,不受支持且无法正确反编译Java 5及更高版本

因此,您的里程可能会随着最近的jdk(7,8)而变化。

同一站点列出了其他工具。

萨尔瓦多·瓦伦西亚Salvador Valencia)评论中(2017年9月)所述,javadecompiler 提供了SaaS,您可以在其中将.class文件上传到云中并返回经过反编译的代码。


原始答案:2008年10月

  • 定义J2SE 5.0(Java SE 5)的主要功能的JSR 176的最终版本已于2004年9月30日发布。
  • 由Pavel Kouznetsov先生编写的著名Java反编译器JAD支持的最新Java版本是JDK 1.3
  • 今天,大多数可从Internet下载的Java反编译器(例如“ DJ Java Decompiler”或“ Cavaj Java Decompiler”)均由JAD提供支持:它们无法显示Java 5源。

Java Decompiler(还有另一个Fast Java decompiler)具有:

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

屏幕截图

它可以与从JDK 1.1.8到JDK 1.7.0以及其他(JikesJRockit等)的编译器一起使用。

它具有一个在线实时演示版本,实际上功能齐全!您只需将jar文件放在页面上,即可查看反编译的源代码,而无需安装任何内容。


5
+1值得一提的是,它也是模块化的,因此可以在其他地方利用该内核(在C ++中实现)。
奎因·泰勒

1
jd-gui-0.3.3也可在此处获得
maiidment

1
如果有人在Eclipse Juno上安装了Eclipse java decompiler插件,并且Eclipse开始挂在Marketplace DND初始化上,强制杀死整个过程:从Eclipse插件目录中删除jd。*。jar只是为我修复了它。
LSerni

4
@Rishi用任何语言或平台保护您的IP的方式相同-好的律师。DRM只是一个创可贴。
锑2013年

1
现在,它提供了SaaS,您可以在其中将.class文件上传到云中,并返回经过反编译的代码。为简单的POJO工作。
萨尔瓦多·瓦伦西亚

101

有一些反编译器...快速搜索结果:

  1. Procyon:开源(Apache 2)并积极开发
  2. Krakatau:开源(GPLv3),并积极开发
  3. CFR:开源(MIT)并积极开发
  4. 贾德
  5. DJ Java反编译器
  6. 摩卡咖啡

还有很多。

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


2
我还要补充一点,Procyon,CFR,JAD和DJ可以通过Web服务获得:javadecompilers.com
Andrew


kpdus.com/jad.html是一些广告链接
marcinj

感谢@marcinj,我找到了另一个链接,该链接具有下载它的链接。
billjamesdev

51

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

如果要查看字节码,只需使用JDK随附的javap


5
我建议使用其中之一作为开源反编译器,因为它们是积极开发的。请改用ProcyonCFR反编译器Krakatau(Python)。
Janus Troelsen

29

我尝试了几次,Procyon似乎对我来说是最好的。它正在积极开发中,并支持Java最新版本的许多功能。

这些是我尝试过的其他产品:

  • 病死率
    • 有希望的方法反编译通常是失败的。我会一直关注这个。还积极开发并支持最新的Java功能。
  • 喀拉喀托
    • 采用不同的方法,因为它尝试输出等效的Java代码,而不是尝试重建原始源,这有可能使其更适合混淆代码。根据我的测试,它与Procyon大致相当,但还是有一些不同之处。我确实必须使用-skip命令行标志,以便它不会因错误而停止。积极开发,有趣的是它是用Python编写的。
  • 图形界面
  • 贾德
    • 有效,但仅支持Java 1.4及以下版本。也可以作为Eclipse插件使用。不再开发中。

1
注意,IGNORE_EXCEPTIONS现在事物已更改为命令行标志-skip
锑2014年




12

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


11

以下是截至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和更高版本。

您可以在线测试上述反编译器,无需安装,然后自行选择进行培训。

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


1
Procyon效果最好!
MarcoZen

10

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

DJ反编译 摩卡


9

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


3
到这里为止:我刚刚发布了您答案的答案;)JDK1.5和更多支持!
VonC

“我还没有看到能够正确处理1.5个以上类的工具”-Procion,Fernflower,JDCore和CFR(该类可以处理Java 8!)
Andrew Rukin


6

到目前为止列出的所有JAD链接似乎都已损坏,因此我找到了此站点。效果很好(至少适用于Linux)!在Ubuntu 11.10上,无论出于何种原因,我都必须下载静态版本。

http://www.varaneckas.com/jad


5
  • JAD是一种有效且简单的工具。

  • 另外,如果您只想查看方法,请使用javap。


5

如果要查看Java编译器如何执行某些操作,则不需要反编译,而需要反汇编。反编译涉及将字节码转换为Java源代码,这意味着丢失了许多低级信息,并且如果您想了解编译器优化,那么这可能就是您感兴趣的信息。

无论如何,我碰巧写了一个开源Java反汇编程序。与Javap不同,它甚至可以在高度病态的类上使用,因此您也可以查看混淆工具对类的作用。它也可以反编译,尽管我不建议这样做。


4

JAD对我不起作用(Ubuntu 11.10问题),因此我向前迈进并开始使用JODO。至少它具有Open Java源代码,并且能够正确地反编译我的.class

我建议先检查“分支/常规”分支。中继线不稳定。


1
在积极开发CFR和Procyon并获得JDK 8支持的同时,偶尔会维护 JODO 。
Janus Troelsen

4

在IntelliJ IDEA平台上,您可以使用Java Decompiler IntelliJ插件。它允许您在调试过程中显示所有Java源代码,即使您没有全部源代码也是如此。它基于著名的工具JD-GUI

在此处输入图片说明


@NoOP是您的机器人吗?还是只是不关注复习主题?
naXa

抱歉,乍一看似乎只是链接的答案。也许您应该添加更多详细信息,并且您的答案仅符合问题标题而不符合问题内容。
ashiquzzaman33

这不能为问题提供答案。要批评或要求作者澄清,请在其帖子下方发表评论。
Kristijan Iliev 2015年

@Chris您是否尝试过建议的解决方案?你甚至读过这个问题吗?
naXa

1
@空操作的遗憾的是粗鲁=(我审阅谁不注重数量不堪重负。
naXa

1

使用AndroChef Java反编译器,您可以反编译apk,dex,jar和Java类文件。这很简单。AndroChef JD基于FernFlower。您可以免费使用10次来评估它。

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


1
@Dimitrius,请在审核过程中仔细阅读答案。您如何想象在此处包括FernFlower或AndroChef?
naXa

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.