Skip to content

反编译 Java 与 .NET

在编译后的文件上按 F3,看到的是源代码而不是字节。做这件事的是两个插件——一个用于 Java(.class、.jar、.apk、.dex),一个用于 .NET(.dll、.exe、.winmd、.netmodule)——它们的行为一致,所以本页同时涵盖两者。每一个都可以在配置 ▸ 插件…中单独关闭或移除。

压缩包显示为其类的目录树;单个类显示为一个文件。“命令”菜单中的反编译为源代码会把结果写出并放进一个面板,于是你可以像在任何其他源代码文件夹里那样搜索、比较和拷贝。

引擎由你自己安装

不附带任何反编译器,也不会替你下载任何东西。这有两层考虑:最有名的 Java 反编译器 JD-Core 采用 GPLv3,无法随一个 Apache-2.0 的应用一起分发;而且引擎会不断改进,更换引擎不该需要 Peach Commander 出新版本。

查看器中的引擎文件夹…会打开它们应放置的文件夹。那里的 README 列出每个引擎及其许可证。

Java CFR、Vineflower、Procyon、jadx(用于 Android 的 .dex 和 .apk),以及用于纯字节码的 javap
.NET ILSpy,以及用于 IL 的 monodis

检查引擎会运行每个引擎的版本命令,并区分三种情况:已安装且可用、未安装,以及已安装但无法运行——没有 JDK 的 Java 工具虽然文件在那里却启动不了,只有真正运行一次才会暴露。

引擎由数据而不是代码来描述,所以你可以自己添加一个:

[cfr]
kinds  = class, jar
tool   = java
args   = -jar {engine} {input}
engine = ~/Library/Application Support/PeachCommander/decompilers/cfr.jar
output = stdout

当不止一个引擎能处理某个文件时,除非你指定,否则使用第一个可用的。装了两个时,比较会并排显示两份结果——当一个引擎在某个方法上放弃而另一个能处理时很有用。

在编译后的代码中搜索

搜索所有类查看的是反编译后的文本而不是字节,所以你能在 JAR 里找到字符串字面量或方法名。

在跨多个文件的内容搜索中进行反编译是一个单独的开关,默认关闭:生成文本可能意味着每个类都要运行一次引擎,在慢机器上这不是值得花在搜索上的开销。主搜索对话框会单独询问;这里同样拒绝。

缓存与限制

结果会被缓存,因为把同一个类反编译两次纯粹是在等待。设置里有结果保留天数和缓存的大小上限;立即清除缓存会清空它并报告释放了多少空间。

两个超时用于防范迟迟不结束的引擎:一个针对单个类或类型,一个针对整个压缩包。两者都接受 0,意思是“使用引擎自己的默认值”。