Krakatau 提供了 Java 字节码的汇编器和反汇编器,使你可以将二进制类文件转换为人类可读的文本格式,进行修改,然后转换回类文件,即使是混淆代码也能处理。你也可以通过手动编写字节码从头创建自己的类文件,并检查和比较 Java 二进制文件的底层细节。与 javap 不同,Krakatau 反汇编器甚至可以处理高度混淆的代码,并且反汇编后的输出可以重新汇编成类文件。
Krakatau 还提供了一个反编译器,用于将 Java 二进制文件转换为可读的源代码。与其他反编译器不同,Krakatau 反编译器专门设计用于处理混淆代码,并能轻松应对其他反编译器无法处理的技巧。然而,Krakatau 反编译器不支持某些 Java 8+ 特性(如 lambda),因此它在处理较旧代码时表现最佳。
Krakatau 的汇编器语法主要是 Jasmin 语法的超集,存在一些小的不兼容性,但与 Jasmin 不同,Krakatau 完全支持 Java 19 字节码规范,甚至支持旧版本 JVM 中的一些未文档化特性。有关汇编器语法的概述,请参阅教程或完整规范。
首先,你需要安装 Rust 和 Cargo。然后克隆此仓库并运行 cargo build --release。这将在 target/release/krak2 中生成一个二进制文件,你可以直接调用、添加到 PATH、创建符号链接等。
反汇编器有两种模式:默认模式和往返模式。默认模式优化了结果汇编文件的可读性和易修改性。重新汇编时,生成的类文件在 JVM 规范角度上与原始文件行为等价,但不一定逐位相同(例如,常量池项可能被重新排序)。往返模式生成的输出将重新汇编成与原始文件逐位相同的类文件,但这意味着汇编文件保留了低层编码信息,使其更难阅读,例如常量池项的确切顺序。在处理依赖非标准属性(如 CLDC 代码或 Scala 代码)的代码时,建议使用往返模式。
使用示例:
krak2 dis --out temp RecordTest.class
krak2 dis --out disassembled.zip --roundtrip r0lling-challenge.jar
你可以反汇编单个类文件或整个 jar 文件。如果输入文件名以 .jar 或 .zip 结尾,则会被视为 jar 文件,并且 jar 内的每个 .class 文件都会被反汇编。
--out 选项控制输出位置。如果 --out 值是一个目录,输出将以单独文件形式放在该目录下。否则,如果 --out 值以 .jar 或 .zip 结尾,输出将被打包成单个 zip 文件放在该位置。如果 --out 值以 .j 结尾,输出将写入该文件(注意:单个 .j 文件可以包含多个类——所有类都会被反汇编并依次写入同一文件)。如果省略 --out 选项,反汇编后的类将输出到标准输出。
要按上述描述使用往返模式反汇编,请传递 --roundtrip 选项(或简写 -r)。
Krakatau 汇编器允许你以人类友好的文本格式编写 Java 字节码,并将其转换为二进制 Java 类文件。
krak2 asm --out temp Krakatau/tests/assembler/good/strictfp.j
你可以汇编单个 .j 文件或整个 jar 文件。如果输入文件名以 .jar 或 .zip 结尾,则会被视为 zip 存档,并且存档内的每个 .j 文件都会被汇编。
--out 选项控制输出位置。如果 --out 值是一个目录,输出将以单独文件形式放在该目录下。否则,如果 --out 值以 .jar 或 .zip 结尾,输出将被打包成单个 zip 文件放在该位置。如果 --out 值以 .class 结尾,单个输出类文件将写入该文件(在这种情况下,如果输入包含多个类,则会报错)。
v2 反编译器仍在开发中。目前,要使用反编译功能,你需要使用 Krakatau v1。