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

556

我应该使用什么程序来反编译一个class文件?我会得到Java代码,还是只有JVM汇编代码?

在这个网站上关于Java性能问题的回答中,我经常看到人们从"class"文件中"反编译"出来以查看编译器如何优化某些内容。


4
“反编译”艺术也可以被视为逆向工程。但有时在逆向某些内容时,您并不总是能够获得二进制文件。 - Makach
没有人提到 https://bytecodeviewer.com/,它可以反编译为Java源代码和字节码(对于Java源代码是基于JAD的)。 - Fernando Gonzalez Sanchez
19个回答

588

2016年2月更新:

www.javadecompilers.com 列出JAD为:

最受欢迎的Java反编译器,但主要适用于旧版本。由C++编写,速度非常快。
已过时,不受支持,并且无法正确反编译Java 5及更高版本。

因此,对于最新的jdk(7、8),结果可能因版本而异。

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

Salvador Valencia评论中指出的那样(2017年9月),javadecompiler提供一种SaaS,您可以将 .class 文件上传到云中,它会返回反编译代码。


原始回答:2008年10月

  • JSR 176的最终版本已于2004年9月30日发布,定义了J2SE 5.0(Java SE 5)的主要功能。
  • 目前JAD支持的最新Java版本是Pavel Kouznetsov先生所写的著名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等)一起使用。

它还提供了一个在线实时演示版本,完全实用!你只需将jar文件拖放到页面上,即可查看反编译的源代码,无需安装任何软件。


5
值得一提的是,这个项目还采用了模块化设计,因此核心部分(使用C++实现)可以在其他地方得到利用。 - Quinn Taylor
1
如果在Eclipse Juno上安装了Eclipse Java反编译插件,并且Eclipse在Marketplace DND初始化时开始挂起,迫使您终止整个进程:只需从Eclipse插件目录中删除jd.*.jar即可解决此问题。 - LSerni
4
你可以用任何语言或平台来保护你的知识产权,关键在于雇佣优秀的律师。数字版权管理只是一个应急措施。 - Antimony
1
现在它提供SaaS服务,您可以将.class文件上传到云端,然后返回反编译代码。对于简单的POJO工作正常。 - Salvador Valencia
显示剩余7条评论

101

有几个反编译器可供使用...快速搜索结果如下:

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

还有很多其他的反编译器。

它们都能产生Java代码。Java自带一个工具,可以查看JVM字节码(javap)。


2
我能补充一下,Procyon、CFR、JAD和DJ也可以作为Web服务使用:http://www.javadecompilers.com/ - Andrew Rukin
http://www.kpdus.com/jad.html 是一些广告链接。 - marcinj
谢谢@marcinj,我找到了另一个链接,里面有下载链接。 - billjamesdev

51
要查看Java源代码,请使用某些反编译器进行检查。去寻找 jad
如果您想查看字节码,只需使用随JDK提供的 javap

5
我建议使用开源的反编译器,因为它们正在积极开发中。相比之下,你可以使用 ProcyonCFR decompiler 或者 Krakatau(Python)等程序。请尽量避免使用那些不再更新的工具。 - Janus Troelsen

29

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

以下是我尝试过的其他工具:

  • CFR
    • 前途光明,但方法反编译经常失败。我会继续关注它。也在积极开发中,支持最新的Java特性。
  • Krakatau
    • 采用不同的方法,尝试输出等效的Java代码,而不是尝试重构原始源代码,这有可能使它更适合混淆的代码。根据我的测试,它与Procyon大致相当,但有一些不同的功能。我确实需要使用-skip命令行标志,以便它不会在错误上停止。积极开发,并且有趣的是它是用Python编写的。
  • JD-GUI
  • JAD
    • 这个工具可以使用,但只支持Java 1.4及以下版本。同时也提供了一个Eclipse插件。该工具已不再继续开发。

1
请注意,IGNORE_EXCEPTIONS 已更改为命令行标志 -skip - Antimony

18

14

Procyon 包含一个反编译器,这是自由开源软件。


13

Soot是新的Java代码选项。至少它有一个优点,就是最近仍在维护...

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

最后,虽然不如其他选项那么完善,但未提及Jdec


你知道如何使用Soot反编译具体的类文件吗?我不确定这是否可能... - Janus Troelsen

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/

10

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

DJ Decompiler Mocha


注:本文不提供解释,请自行查阅相关技术资料。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接