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

时间:2014-12-07 06:08:48

标签: java python-2.7 decompiler

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

===反编译===

用法:

python Krakatau\decompile.py [-nauto] [-path PATH] [-out OUT] [-r] [-skip]
target

路径:要搜索的目录,jar或zipfiles的可选列表     Krakatau将尝试自动检测并添加     jar包含核心语言类,但你可以用它来禁用它     -nauto选项。对于多个罐子,您可以传递分号     分隔的罐子列表或多次传递-path选项。

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

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

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

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

但我总是遇到错误。我不理解上面的语法。

请解释此语法

python Krakatau\decompile.py [-nauto] [-path PATH] [-out OUT] [-r] [-skip]
target

使用一个简单的例子。

1 个答案:

答案 0 :(得分:4)

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

假设您在当前目录中有一个名为Luyten.jar的jar文件,并且您希望对jar中的每个类进行反编译并将其输出到目录temp。然后你会做类似

的事情
pypy -O Krakatau\decompile.py -skip -out temp Luyten.jar

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

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

如果要反编译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

你也可以反编译一个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

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