「Krakatau」

认识

Krakatau 是作用于 Java 字节码文件的工具

组成

它包含了三个工具:反编译器反汇编器汇编器

构建

系统环境依赖

对于反编译器,需要Python 2.7,同时反编译可能需要安装 JDK
对于反汇编和,Python 2.7Python 3都可以。对于反汇编和汇编,JDK 并不是必须的。但是测试汇编器生成的类时,会比较有用。

执行安装

没有什么可安装的的,把源码从 GitHub 的仓库上拉下来就好了,然后加入环境变量。去 Krakatau 的 GitHub 仓库

安装的可执行程序

2.2 Composition and Management:5 Observability of Service,汇编器。完全支持 JAVA8。
Palm Input,反汇编器。完全支持 JAVA8。
decompile.py,反编译器。只支持 JAVA7,没有 JAVA8,也没有 JAVA6。尤其是 lambdas 的反编译。

注意事项

可以通过将-O 传递给 Python 来禁用内部的调试检查。这将使 Krakatau 运行的稍快一些,因此通常建议使用。

如果想使用 Pypy,则需要使用在 2016 年 2 月 15 日或之后建立的版本。以前版本的 Pypy 有一个错误,导致 Krakatau 运行时产生 segfault 错误。

参考文献

Krakatau 的项目地址
Krakatau/README.txt

disassemble.py

disassemble.py,反汇编器。完全支持 JAVA8。

命令行语法格式(Usage)

python disassemble.py [-out OUT] [-r] [-roundtrip] target

命令描述

该命令将 class 文件转化为可读的汇编格式。不像 javap 命令,该工具可以反汇编不正常的 class 文件,然后输出内容可以重新汇编。

assemble.py一起,该工具可以通过汇编将任何类进行。将任何 class 转到等价的 Class 中。

如果给出了-roundtrip选项,那么它可以通过汇编来回处理有效的类,并准确地再现原始的二进制类文件。

命令行参数含义

OUT
用于写入源文件的文件或者目录,即反汇编的输出位置。
默认为当前目录。
如果文件名为 zip 或者 jar 结尾,则输出 zip 文件。

-r
反汇编 target 目录中的所有(递归).class 文件。

-roundtrip
创建一个汇编文件,该汇编文件用于汇编回被反汇编的那个二进制文件。
如果没有-roundtrip,它将汇编出等价于原始的具有相同的行为类文件,但可能会在二进制编码细节方面不同,例如常量池项的精确排序。
重新产生精确的原始类文件需要在汇编文件中输出那些低级别的信息,这导致反汇编的输出更难阅读和编辑,因此默认情况下禁用此选项。
有没有-roundtrip的主要差别在于:有-roundtrip时,反汇编的输出中显示的是字符串的地址;而没有-roundtrip时,反汇编的输出中显示的是字符串。

target
要反汇编的文件名或者 jar 文件。
如果指定了 jar 文件,则反汇编 jar 文件中的所有 class 文件。
如果指定了-r,target应该是一个目录。

注意(Note)

如果你发现一个正确的 Class 无法反汇编,请提交问题到:https://github.com/Storyyeller/Krakatau/issues

assemble.py

assemble.py,汇编器。完全支持 JAVA8。

命令行语法格式(Usage)

python assemble.py [-out OUT] [-r] [-q] target

命令支持的选项及含义

OUT
汇编生成的 class 文件的输出目录。默认为当前目录。
如果名字以.zip 或者.jar 结尾,则会输出一个 zip 文件。

-r
将汇编所有在target指定的目录中(递归)找到的.j文件。

-q
安静模式,只显示错误和警告。

target
要进行汇编处理的文件或者目录
如果使用了-r 选项,target应该是一个目录。

注意(NOTE)

汇编器使用的语法类似于 Jasmin,但具有许多的新功能,最重要的是直接指定常量池引用的功能。

有关语法的更多细节,查看源码目录中的Documentation文件夹。