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

4

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

=== 反编译 ===

用法:

python Krakatau\decompile.py [-nauto] [-path PATH] [-out OUT] [-r] [-skip]
target
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

使用一个简单的示例。


使用以下网址下载反编译器:https://github.com/Storyyeller/Krakatau - Niranga Sandaruwan
1个回答

5

使用Krakatau反编译的最简单和普通方法是反编译一个jar文件。

假设当前目录中有一个名为Luyten.jar的jar文件,您想要反编译其中的每个类并将其输出到目录temp中。那么您需要执行以下操作:

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

根据您是否已安装JDK以及其位置的不同,您可能需要在路径参数中显式传递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包之外的class文件,但是更为麻烦,因为你需要确保目录结构正确。你需要指定相对于类所在位置的根目录。例如,假设你有一个位于./Foo/Bar/com/beust/jcommander/FuzzyMap$IKey.class的class文件。
pypy -O Krakatau\decompile.py -skip -out temp -path Foo/Bar com.beust.jcommander.FuzzyMap$IKey

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

1
感谢您的解决方案,也感谢您花费宝贵的时间,Antimony。 - Niranga Sandaruwan
这个反编译器不太好,它无法产生正确的输出。 - Niranga Sandaruwan
@NirangaSandaruwan 有什么问题吗?缺乏糖衣语法?对于未混淆的代码,您可能会更喜欢Procyon,但如果您正在尝试反编译混淆的代码,则Krakatau是最好的选择。 - Antimony
问题是,有些方法无法正常反编译,但使用Procyon则可以。另外一些在Procyon中无法很好反编译的方法,则可以通过Krakatau来反编译。我对此感到高兴,但反编译后的代码包含许多中断、循环和标签语句,所以有时很难理解代码。如果这些问题能进一步得到解决,那么这将是一个非常有价值的反编译器。 - Niranga Sandaruwan
1
我确实会时常努力改进它,但问题在于输出必须至少与输入一样复杂。因此,如果你试图反编译的代码已经很复杂了,在这方面你就没什么办法了。 - Antimony

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接