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

     2023-02-25     19

关键词:

【中文标题】如何“反编译”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/

【讨论】:

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

】如何关闭Rider中文件的反编译?【英文标题】:HowcouldIturnoffdecompilationofthefilesintheRider?【发布时间】:2018-04-1615:46:04【问题描述】:每次我在某处放置断点并开始向上移动堆栈跟踪时,骑手都会为我提供文件的反编译版本而不... 查看详情

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

】你如何反编译一个swf文件[关闭]【英文标题】:Howdoyoudecompileaswffile[closed]【发布时间】:2010-09-1022:53:20【问题描述】:我是一个网站的维护者,该网站据称“丢失”了Flashswf文件的源代码。如何反编译这个源?我可以使用任何... 查看详情

如何有效的防止java程序被反编译和破解

由于Java字节码的抽象级别较高,因此它们较容易被反编译。下面介绍了几种常用的方法,用于保护Java字节码不被反编译。通常,这些方法不能够绝对防止程序被反编译,而是加大反编译的难度而已,因为这些方法都有自己的使... 查看详情

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

】如何反编译AndroidStudio生成的Apk文件【英文标题】:HowtoDecompilingApkfilesthatGeneratedByAndroidStudio【发布时间】:2015-04-1506:22:59【问题描述】:我完全丢失了我的androidstudio项目,没有办法找回它。现在,我正在尝试反编译我的apk文件... 查看详情

如何修改反编译的apk的包名? [关闭]

】如何修改反编译的apk的包名?[关闭]【英文标题】:howcanimodifypackagenameofdecompiledapk?[closed]【发布时间】:2015-07-2803:07:32【问题描述】:我已经用Apktool反编译了一个voip调用apk文件,我试图更改itz包名称...但我收到错误,不幸的... 查看详情

java示例代码_将字节数组保存为java中的类文件,然后进行反编译

java示例代码_将字节数组保存为java中的类文件,然后进行反编译 查看详情

如何从 j2me .jar 应用程序中反编译、编辑和重新编译单个类文件

】如何从j2me.jar应用程序中反编译、编辑和重新编译单个类文件【英文标题】:Howtodecompile,editandrecompileasingleclassfilefromaj2me.jarapplication【发布时间】:2012-01-0910:06:27【问题描述】:.jar(mobile)应用程序包含许多类文件,我想从中反... 查看详情

尝试使用反编译的应用程序文件打开应用程序 [关闭]

】尝试使用反编译的应用程序文件打开应用程序[关闭]【英文标题】:Tryingtoopenanappwithdecompiledappfiles[closed]【发布时间】:2018-10-0704:04:35【问题描述】:我发现了一个名为(TinyTelnetClient)的应用程序,它是一个适用于android的开源teln... 查看详情

从 Java 项目生成 UML 类图 [关闭]

...工具可以帮助将Java类逆向工程为UML,以显示我的类之间如何相互关联的概述?它不需要从JAR文件中反编译,因为我有源代码。我知道那里有很多,但其中大多数只能生成单独的类。我希望有一个工具可以生成类图,概述我当前... 查看详情

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

参考技术A安装Javajdk后看安装目录里有没有jad.exe,没有要下载,一般都有的配置Java环境变量开始-运行-cmd-回车-进入命令行窗口:cd+空格+class文件所在路径:按下面的命令进行反编译:例如:[2]jad-sjavaexample.class回车在目录里可以... 查看详情

如何反编译结构未知的protobuff文件

】如何反编译结构未知的protobuff文件【英文标题】:Howtodecompileprotobufffileswithunknownstructure【发布时间】:2016-12-2909:51:55【问题描述】:我正在尝试从protobuff文件中获取原始数据。我找到了一些在线存储库(例如Protobuffdotnet),但... 查看详情

java虚拟机原理dalvik虚拟机(打包jar文件和dex文件|反编译dex文件|分析dex文件反编译结果)(代码片段)

...和Dex文件1、示例代码2、打包Jar文件3、打包Dex文件二、反编译Dex文件三、分析Dex文件1、Student类相关信息2、User类相关信息前言Dalvik虚拟机运行的是Dex文件;Dex文件并不是最终DVM运行的文件,Dex文件还需要再次优化为Odex文件,这才是... 查看详情

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

安装Javajdk后看安装目录里有没有jad.exe,没有要下载,一般都有的配置Java环境变量开始-运行-cmd-回车-进入命令行窗口:cd+空格+class文件所在路径:按下面的命令进行反编译:例如:[2]jad-sjavaexample.class回车在目录里可以看到example... 查看详情

选择和测试java反编译器[关闭]

】选择和测试java反编译器[关闭]【英文标题】:Chooseandtestjavadecompiler[closed]【发布时间】:2011-04-2308:10:02【问题描述】:现在我正在努力寻找最好的java反编译器,我找到了这些:http://java.decompiler.free.fr/http://www.reversed-java.com/fernfl... 查看详情

Android - 如何解码和反编译任何 APK 文件?

】Android-如何解码和反编译任何APK文件?【英文标题】:Android-HowtodecodeanddecompileanyAPKfile?【发布时间】:2013-02-0504:54:20【问题描述】:我正在处理广告:我的客户给了我一些他们应用程序的APK文件。我的工作包括在其中插入广告... 查看详情

关于反编译java字节码文件

第一步:新建一个类:第二步:运行main方法,然后通过命令行进入.class文件目录下,执行javap-v字节码文件名称。 查看详情

如何反汇编 Pro*C/C++ 程序? [关闭]

】如何反汇编Pro*C/C++程序?[关闭]【英文标题】:HowdoesonedisassemblePro*C/C++programs?[closed]【发布时间】:2010-10-0807:16:02【问题描述】:有没有办法反汇编Pro*C/C++可执行文件?【问题讨论】:投票结束作为离题:要么工具推荐,要么... 查看详情

反编译受保护的 C# [关闭]

】反编译受保护的C#[关闭]【英文标题】:DecompileprotectedC#[closed]【发布时间】:2017-03-2620:08:18【问题描述】:我有一个C#程序,我想反编译它,我使用了[ILSpy&NetReflector],一切正常,程序被反编译,但源代码被加密或以某种方... 查看详情