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

Posted

技术标签:

【中文标题】如何“反编译”Java 类文件? [关闭]【英文标题】:How do I "decompile" Java class files? [closed] 【发布时间】:2010-09-21 07:32:16 【问题描述】:

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

关于本网站上的 Java 性能问题,我经常看到有人“反编译”了 Java 类文件以了解编译器如何优化某些内容。

【问题讨论】:

“反编译”的艺术也可以被认为是逆向工程。尽管有时在对某些东西进行逆向工程时,您并不总是可以访问二进制文件。 没人提到bytecodeviewer.com,可以反编译成java源码和字节码(java源码是基于JAD的)。 【参考方案1】:

2016 年 2 月更新:

www.javadecompilers.com 将 JAD 列为:

最流行的 Java 反编译器,但主要仅限于这个时代。用 C++ 编写,速度非常快。 Java 5 及更高版本已过时、不受支持且无法正确反编译

所以你的里程可能会随着最近的 jdk (7, 8) 而变化。

同一站点列出其他工具。

正如Salvador Valencia 在the comments(2017 年 9 月)中所指出的,javadecompiler 提供了一个 SaaS,您可以在其中将 .class 文件上传到云端,它会返回反编译的代码。


原始答案:2008 年 10 月

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

Java Decompiler(又一个 Fast Java 反编译器)有:

明确支持反编译和分析 Java 5+“.class”文件。 一个不错的图形用户界面:

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

它具有在线live demo version,实际上功能齐全!你可以在页面上放一个jar文件,不用安装任何东西就可以看到反编译的源代码。

【讨论】:

+1 值得一提的是,它也是模块化的,因此核心(用 C++ 实现)可以在其他地方使用。 jd-gui-0.3.3 也可用here 如果在 Eclipse Juno 上安装了 Eclipse java 反编译器插件,并且 Eclipse 开始挂在 Marketplace DND Initialization 强制终止整个过程:从 Eclipse 插件目录中删除 jd.*.jar 刚刚修复它对我来说。 @Rishi 就像您在任何语言或平台上保护您的知识产权一样——优秀的律师。 DRM 只是一个创可贴。 它现在提供 SaaS,您可以在其中将 .class 文件上传到云端,并返回反编译的代码。为一个简单的 POJO 工作。【参考方案2】:

那里有一些反编译器...快速搜索会产生:

    Procyon:开源(Apache 2)并积极开发 Krakatau:开源 (GPLv3) 并积极开发 CFR:开源 (MIT) 并积极开发 JAD DJ Java Decompiler Mocha

还有更多。

这些生成 Java 代码。 Java 自带的东西可以让你看到 JVM 字节码 (javap)。

【讨论】:

我还要补充一点,Procyon、CFR、JAD 和 DJ 可作为网络服务使用:javadecompilers.com javadecompilers.com - 救命哥! kpdus.com/jad.html 是一些广告链接 谢谢@marcinj,我找到了另一个有下载链接的链接。【参考方案3】:

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

如果您想查看字节码,只需使用 JDK 附带的 javap

【讨论】:

我会推荐其中一种开源反编译器,因为它们正在积极开发中。请改用Procyon、CFR decompiler 或Krakatau (Python)。【参考方案4】:

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

这些是我尝试过的其他:

CFR 很有希望,但方法反编译经常失败。我会一直关注这个。还积极开发并支持最新的 Java 功能。 Krakatau 采用不同的方法,它尝试输出等效的 Java 代码,而不是尝试重构原始源代码,这有可能使其更适合混淆代码。根据我的测试,它与 Procyon 大致相当,但有一些不同的东西仍然很好。我确实必须使用-skip 命令行标志,这样它就不会因错误而停止。积极开发,有趣的是它是用 Python 编写的。 JD-GUI 工作,但南河三的输出要好得多。这是page comparing Procyon output to the original and JD-GUI。 JD-GUI 也可以作为Eclipse plugin 使用,这对我来说根本不起作用。似乎不是开源的,开发似乎是零星的。 JAD 已工作,但仅支持 Java 1.4 及更低版本。也可作为Eclipse plugin 使用。不再处于开发阶段。

【讨论】:

请注意,IGNORE_EXCEPTIONS 现在已更改为命令行标志 -skip【参考方案5】:

我使用JAD Decompiler。

有一个Eclipse 插件,jadeclipse。挺好看的。

【讨论】:

【参考方案6】:

Procyon 包含反编译器。它是 FOSS。

【讨论】:

【参考方案7】:

Soot 是较新 Java 代码的一个选项。至少它还有最近还在维护的优势……

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

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

【讨论】:

你知道如何用Soot反编译一个具体的类文件吗?我不确定这是否可能......【参考方案8】:

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

【讨论】:

【参考方案9】:

以下是截至 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/

【讨论】:

Procyon 效果最好!!!!【参考方案10】:

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

DJ Decompiler Mocha

【讨论】:

【参考方案11】:

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

【讨论】:

给你:我刚刚发布了你的答案;) JDK1.5 和更多支持! “我还没有看到任何可以正确处理 1.5+ 类的工具” - Procion、Fernflower、JDCore 和 CFR(这个可以处理 Java 8!)【参考方案12】:

看看cavaj。

【讨论】:

下面也使用jad【参考方案13】:

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

http://www.varaneckas.com/jad

【讨论】:

【参考方案14】:

JAD 是一种有效且简单的方法。

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

【讨论】:

【参考方案15】:

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

不管怎样,我碰巧写了一个open source Java disassembler。与 Javap 不同,这甚至适用于高度病态的类,因此您也可以看到混淆工具对您的类做了什么。它也可以进行反编译,虽然我不推荐它。

【讨论】:

【参考方案16】:

JAD 对我不起作用(Ubuntu 11.10 问题),所以我继续前进并使用JODO。至少它有 Open Java 源代码并且能够正确地反编译我的 .class

我建议先检查 'branches/generic' 分支。树干不稳定。

【讨论】:

JODO 是 sporadically maintained,而 CFR 和 Procyon 正在积极开发并支持 JDK 8。【参考方案17】:

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

【讨论】:

@NoOP's 你是机器人吗?或者只是不注意审查的主题? 抱歉,乍一看似乎只有链接的答案。也许您应该添加更多详细信息,并且您的答案仅符合问题标题而不符合问题内容。 这没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。 @Chris 您尝试过建议的解决方案吗?你有没有读过这个问题 @NoOP 对我的粗鲁表示抱歉 =( 不注意的审稿人数量让我不知所措。【参考方案18】:

使用AndroChef Java Decompiler,您可以反编译 apk、dex、jar 和 java 类文件。这很简单。 AndroChef JD 基于FernFlower。您可以在 10 次免费使用中对其进行评估。

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

【讨论】:

@Dimitrius,请在审核期间仔细阅读答案。您如何想象在此处加入 FernFlower 或 AndroChef?【参考方案19】:

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

它们都允许您查看 jar、war 等。文件内容并反编译其中的任何类文件。

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

【讨论】:

以上是关于如何“反编译”Java 类文件? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

你如何反编译一个swf文件[关闭]

如何关闭 Rider 中文件的反编译?

如何将java中的.class文件反编译

如何将java中的.class文件反编译

如何反编译 Android Studio 生成的 Apk 文件

java反编译