如何“反编译”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,您可以将.class
file 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产量:
- Procyon :开源(Apache 2)并积极开发
- Krakatau :开源(GPLv3)并积极开发
- CFR :开源(MIT)积极开发
- JAD
- DJ Java Decompiler
- 摩卡
还有很多。
这些产生Java代码。 Java带有一些让你看到JVM字节码( javap )的东西。
要查看Java源代码,请查看一些反编译器。 去寻找jad 。
如果你想看字节码,只需使用JDK自带的javap 。
我尝试了几个,而浣熊似乎对我最好。 它正处于积极的发展阶段,并且支持最新版本的Java的许多function。
这些是我尝试的其他人:
- CFR
- 有前途的,但往往不能反编译的方法。 我会继续关注这个。 还积极开发支持最新的Javafunction。
- 喀拉喀托
- 采取不同的方法,它会尝试输出等效的Java代码,而不是尝试重构原始源代码,这有可能使其更好地处理混淆代码。 从我的testing结果来看,它大致与普罗西恩相差无几,但还是有不同的东西。 我不得不使用
-skip
命令行标志,以防止错误。 积极开发,有趣的是它是用Python编写的。
- 采取不同的方法,它会尝试输出等效的Java代码,而不是尝试重构原始源代码,这有可能使其更好地处理混淆代码。 从我的testing结果来看,它大致与普罗西恩相差无几,但还是有不同的东西。 我不得不使用
- 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上,我不得不下载任何原因的静态文件。
-
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/