如何使用 Storyyeller/Krakatau 反编译 .class 和 jar 文件

Nir*_*wan 4 java decompiler python-2.7

我正在尝试使用 Storyyeller/Krakatau 反编译器反编译文件。我已经下载了相关文件并将其放在一个文件夹中。我尝试使用命令提示符使用以下语法反编译文件。

===反编译===

用法:

python Krakatau\decompile.py [-nauto] [-path PATH] [-out OUT] [-r] [-skip]
target
Run Code Online (Sandbox Code Playgroud)

PATH:用于在其中搜索类的目录、jar 或 zip 文件的可选列表。Krakatau 将尝试自动检测并添加包含核心语言类的 jar,但您可以使用该选项禁用此功能-nauto。对于多个 jar,您可以传递以分号分隔的 jar 列表,也可以-path多次传递该选项。

OUT:要写入源文件的目录名称。默认为当前目录。如果名称以 .zip 或 .jar 结尾,则输出将是 zip 文件。

-r:反编译在目录目标中找到的所有.class文件(递归地)

-skip:出现错误时继续。如果在反编译特定方法时发生错误,则回溯将作为注释打印在源文件中。如果在类级别反编译时发生错误,则不会发出源文件,并且会将错误消息打印到控制台。

target:要反编译的类名或jar名。如果指定了jar,则该jar中的所有类都将被反编译。如果-r指定,这应该是一个目录。

但我总是遇到错误。我不明白上面的语法。

请解释一下这个语法

python Krakatau\decompile.py [-nauto] [-path PATH] [-out OUT] [-r] [-skip]
target
Run Code Online (Sandbox Code Playgroud)

使用一个简单的例子。

Ant*_*ony 5

使用 Krakatau 反编译的最简单且正常的方法是反编译 jar。

假设您有一个Luyten.jar在当前目录中命名的 jar 文件,并且您想要反编译该 jar 中的每个类并将其输出到该目录temp。然后你会做类似的事情

pypy -O Krakatau\decompile.py -skip -out temp Luyten.jar
Run Code Online (Sandbox Code Playgroud)

根据您是否安装了 JDK 以及安装位置,您可能需要在路径参数中显式传递 jre 的位置。例如

pypy -O Krakatau\decompile.py -skip -out temp -path "C:\Program Files (x86)\Java\jre7\lib\rt.jar" Luyten.jar
Run Code Online (Sandbox Code Playgroud)

如果要反编译jar中的特定类,可以将jar添加到路径并指定类名。如果您需要像前面的示例一样指定 rt.jar 的路径,则可以-path多次传递参数或以分号分隔一次。例如仅反编译 com.beust.jcommander.FuzzyMap$IKey 类,

pypy -O Krakatau\decompile.py -skip -out temp -path Luyten.jar com.beust.jcommander.FuzzyMap$IKey
Run Code Online (Sandbox Code Playgroud)

您还可以反编译 jar 之外的类文件,但这更烦人,因为您必须确保目录布局正确。您需要指定相对于找到类的根目录。

例如,假设您有一个类文件位于 ./Foo/Bar/com/beust/jcommander/FuzzyMap$IKey.class

pypy -O Krakatau\decompile.py -skip -out temp -path Foo/Bar com.beust.jcommander.FuzzyMap$IKey
Run Code Online (Sandbox Code Playgroud)

在这种情况下,目录必须与完全限定的类名完全匹配。一个常见的错误是尝试使用错误的根目录进行反编译。jar 的好处是自动拥有正确的目录结构。