nbauma109/jd-gui-duo
GitHub: nbauma109/jd-gui-duo
一款集成了七款主流 Java 反编译引擎的桌面 GUI 工具,支持多引擎交叉对比、字节码查看、JAR 差异分析和 Maven Central 源码检索,为 Java 逆向工程与安全分析提供了全面而灵活的工作环境。
Stars: 218 | Forks: 24
[](https://github.com/nbauma109/jd-gui-duo/network/updates)
[](https://jitpack.io/#nbauma109/jd-gui-duo)
[](https://jitci.com/gh/nbauma109/jd-gui-duo)
[](https://github.com/nbauma109/jd-gui-duo/actions/workflows/codeql-analysis.yml)
[](https://github.com/nbauma109/jd-gui-duo/actions/workflows/maven.yml)
[](https://github.com/nbauma109/jd-gui-duo/actions/workflows/release.yml)
Github releases 下载量:
[]()
[]()
Jitpack 下载量:
[](https://jitpack.io/#nbauma109/jd-gui-duo)
[](https://jitpack.io/#nbauma109/jd-gui-duo)
Sourceforge 下载量:
[](https://sourceforge.net/projects/jd-gui-duo/files/latest/download)
[](https://sourceforge.net/projects/jd-gui-duo/files/latest/download)
[](https://sourceforge.net/projects/jd-gui-duo/files/latest/download)
[](https://sourceforge.net/projects/jd-gui-duo/files/latest/download)
[](https://sourceforge.net/projects/jd-gui-duo/files/latest/download)
在寻找 Eclipse 插件?试试 [ECD++](https://github.com/nbauma109/ecd)
# jd-gui-duo
一个基于 JD-CORE v0 和 v1 的二合一 JAVA 反编译器。
最初仅支持双反编译器(JD-Core v0 和 v1),但现在通过 [transformer-api](https://github.com/nbauma109/transformer-api) 项目也支持其他反编译器。
JD-Core v0 和 v1 是两个完全不同的反编译器,而不是同一个反编译器的两个不同版本。它们使用了不同的算法:
- [JD-Core v0](https://github.com/nbauma109/jd-core-v0) 像第一个 Java 反编译器 [JAD](http://www.kpdus.com/jad.html) 一样使用字节码模式匹配
- [JD-Core v1](https://github.com/nbauma109/jd-core) 像第一个分析型反编译器 [Fernflower](https://github.com/fesh0r/fernflower) 一样使用分析算法
此项目构建在由 [Emmanuel Dupuy](https://github.com/emmanue1) 编写的原版 [JD-GUI](https://github.com/java-decompiler/jd-gui) 之上。
二进制文件在 [jitpack.io](https://jitpack.io/p/nbauma109/jd-gui-duo)(可通过火箭 Logo 识别)上构建和托管,下面的下载按钮直接从 Jitpack 服务器获取发行版:
# 功能概览
## 支持的格式
* `APK`
* `DEX`
* `AAR`
* `CLASS`
* `EAR`
* `JAR`
* `JAVA`
* `JMOD`
* `KAR`
* `WAR`
* `ZIP`
## 打开类型
在打开 jar、APK 或类似归档文件后,点击“Open Type”来反编译一个类(提示:使用 $ 来匹配类名的结尾)

## 打开类型层次结构
打开类型层次结构会根据当前打开的容器的索引构建父类型和子类型树。当一个类分布在多个归档文件中,或者当您想在不离开反编译视图的情况下检查继承关系时,这非常有用;如果存在多个匹配的位置,位置选择器将允许您在打开目标容器之前进行选择。
# 大纲树
使用大纲树选择反编译的方法:

## Maven Central
在 Help -> Preferences 菜单中,如果您想显示原始源代码(如果可用),请使用在 [Maven Central](https://search.maven.org/) 上搜索源代码的功能:


## Maven Central 搜索和安全首选项
可以在代理或私有 Nexus 存储库背后进行 Maven Central 搜索。
在 Help -> Secured preferences 中配置设置。


这些首选项受您在保存后选择的主密码保护,每次重新打开此面板时都会要求输入该密码。
您可以根据是否需要这些设置,在有或没有这些设置的情况下进行 Maven 搜索:


## 搜索
使用搜索按钮搜索方法、字符串常量等。

搜索对话框是基于索引的,可以执行比纯文本查找更多的操作。它可以搜索类型、构造函数、方法、字段、字符串常量和 Java 模块的声明或引用,支持 `*` 和 `?` 通配符,并重新打开带有高亮信息的匹配条目,以便在目标源代码视图中保持相关匹配项的标记。
## 反编译所有类
使用 File -> Save All Sources 将所有源代码反编译到一个 sources jar 中(选择一个您拥有权限的目标目录)

## 键盘快捷键
- CTRL+F 查找文本

- CTRL+L 跳转到行

## 按键绑定
Help 菜单还提供了一个专用的按键绑定对话框。它允许您重新映射文件操作、导航、搜索、大纲、行导航和其他命令的快捷键,在需要时恢复默认设置,并在主窗口和增量查找 UI 中应用新的绑定,而无需手动编辑配置文件。
## 显示字节码
右键单击大纲树中的方法,并在上下文菜单中选择“Show Byte Code”。


要查看 JD-Core v1 用于每个反编译步骤的控制流图的可视化,请选择“Show Control Flow Graph ...”菜单之一。
该图由 [plantuml](https://plantuml.com/) 构建。


## 方法补丁
有时 JD-Core v1 无法反编译某个方法。在这种情况下,如果可能的话,该方法将从 JD-Core v0 进行补丁,并且会出现注释“Patched from JD-Core v0”:

## 比较
使用修改版的 [JarComp](https://activityworkshop.net/software/jarcomp/index.html) 来比较 jar,并使用 netbeans diff 模块进行类比较(参见 https://github.com/nbauma109/netbeans-visual-diff-standalone)。

选择要比较的 2 个文件,或将文件拖放到输入框中:

将显示大小和 CRC 校验和的差异:

双击要比较的行:

或者,如果两个 jar 都已打开,您可以打开要比较的类型:

如果您选择否,系统将要求您选择要打开的文件

## 比较 JD-Core V0 与 V1
除了文件级别的比较,File 菜单还可以对当前打开的类比较 JD-Core V0 和 JD-Core V1。这会为两个内置引擎打开一个并排的差异视图,这在调查反编译回归问题、了解两个核心之间的算法差异或检查为什么需要方法补丁时非常有用。
## 构建骨架生成
当您拖放三个或更多的库时,JD-GUI-DUO 可以生成 Maven/Gradle 构建骨架,而不仅仅是打开它们。生成器在可能的情况下会从 Maven Central 解析 SHA-1 值,在无法解析时会回退到文件名和清单元数据,并打开一个包含 `pom.xml`、`build.gradle` 和 `mvn_deploy.bat` 的生成归档文件。
## 超链接
可导航的链接显示为带下划线的文本。单击可导航到定义(无需 CTRL 点击,也无需双击)。
## 复制限定名和内部名
上下文操作还允许您复制当前类型、字段或方法的 Java 限定名或 JVM 内部名。这在反编译源代码、堆栈跟踪、字节码工具和需要斜杠分隔内部名的 API 之间切换时非常有用。
## 粘贴日志
Edit -> Paste Log 将剪贴板内容转换为内存中的 `.log` 页面。Java 堆栈跟踪帧被解析为超链接,因此单击一个帧可以直接打开匹配的反编译类型,或者在日志中提供该信息时跳转到报告的行号。
## 选择反编译器
在首选项窗口中选择另一个反编译器,一旦您按下 OK,该类将立即使用新选择的反编译器进行反编译。


点击 Configure 按钮选择反编译器设置(每个反编译器都有各自不同的面板):

## 编译器
编译器报告错误和警告。在 Eclipse 首选项页面中选择是否要报告它们。



## 高级类查找
选中此选项后,位于同一目录中的 jar 和 JAVA_HOME 的 jmods(或 rt.jar)将被反编译器用于更好的类型解析。
目前,支持此功能的反编译器有 CFR、JD-Core v1、Procyon。
为获得最佳效果,请将您的 JAVA_HOME 设置为与用于构建要反编译的 jar 相同的 JDK(如有疑问,请检查 jar 内的 META-INF/MANIFEST.MF)。
jd-gui-duo 的运行 JRE 不会造成干扰。
此选项不支持 war 中的 jar。
## JRE 系统库
此选项适用于 Eclipse AST 解析器,它用于各种上下文中以提供:
- 导航到源文件 (*.java) 的超链接
- 在源文件 (*.java) 中进行搜索的索引
- 反编译源 (\*.class) 和源文件 (\*.java) 中的编译器错误和警告
默认情况下,它使用 jd-gui-duo 正在运行的 VM,但您可以通过取消勾选“Include running VM boot classpath”来选择另一个 JRE 系统库。
您还可以选择兼容的 Source 和 Compliance。

## 重新对齐行号
这是原版 JD-GUI 中一个众所周知的选项,如果类文件中存在调试信息,它可以对齐代码以进行调试。
目前,仅 JD-Core v0 和 v1 支持此功能。
如果代码未对齐,行号将显示为红色。


## 移除不必要的类型转换
此选项使用与 Eclipse 相同的功能清理不必要的类型转换。
## 暗黑模式

## 快速大纲
快速大纲 (CTRL+SHIFT+O) 是 jd-gui C++ 0.3.x 版本中曾有的功能,现在在 jd-gui-duo 中可用。
它现在包含“输入即过滤”功能。

### 作为留念,jd-gui 0.3.6:

## 会话恢复
当 JD-GUI-DUO 在没有显式输入文件的情况下启动时,它可以重新打开在上一次会话中记住的文件。
## 单实例
在非 macOS 平台上,还有一个主窗口的单实例首选项。启用后,在第二次启动中打开文件会将其转发到已运行的窗口,而不是创建另一个应用程序实例。
# 致谢
反编译器|作者|链接|许可证
--- | --- | --- | ---
CFR|Lee Benfield|https://github.com/leibnitz27/cfr|MIT
Procyon|Mike Strobel|https://github.com/mstrobel/procyon|Apache v2
Fernflower|Jetbrains|https://github.com/JetBrains/intellij-community/tree/master/plugins/java-decompiler/engine|Apache v2
Vineflower|Vineflower|https://github.com/Vineflower/vineflower|Apache v2
JADX|Skylot|https://github.com/skylot/jadx|Apache v2
JD-GUI|Emmanuel Dupuy|https://github.com/java-decompiler/jd-gui|GPL v3
## 赞助商
| Free code signing on Windows provided by SignPath.io, certificate by SignPath Foundation |
标签:Android分析, CFR, Fernflower, Jadx, Java反编译器, JD-Core, JD-GUI, JS文件枚举, Procyon, URL提取, Vineflower, 二进制发布, 代码分析, 凭证管理, 反编译, 域名枚举, 字节码查看器, 开源工具, 桌面GUI, 软件开发套件, 软件逆向工程