如何反编译整个Jar文件?

有人知道可以反编译整个Jar文件而不是单个类的免费反编译器吗?我有一个问题的子类,如名称$1.类名称$2.类名称

697415 次浏览

你提取它,然后对dir使用jad。

2022年更新:< >强QuiltMC / quiltflower < / >强是最新的最先进的Java反编译器:

Quiltflower是一个现代的、通用的反编译器,专注于提高代码质量、速度和可用性。
Quiltflower是Fernflower和Forgeflower的fork .

变化包括:

  • 新的语言特性(尝试使用资源、切换表达式、模式匹配等)
  • 更好的控制流生成(循环、尝试捕获和切换等)
  • 更多的可配置性
  • 更好的错误消息
  • Javadoc应用程序
  • 多线程
  • 优化
  • 许多其他杂项特性和修复

Quiltflower最初只是为了与Minecraft的QuiltMC工具链一起使用,Quiltflower很快扩展为一个通用的java反编译器,旨在创建尽可能准确和干净的代码。

如果这个名字听起来很熟悉,那是因为Quiltflower是Fernflower的一个分支,Fernflower是由Stiver开发的著名的反编译器,由Jetbrains维护,并成为Intellij IDEA的默认反编译器。

. Fernflower也很快被应用到许多其他工具中

在过去的一年里,Quiltflower增加了对一些特性的支持,如现代字符串连接、代码格式化器、密封类、模式匹配、切换表达式、try-with-resources等等。Quiltflower还关注反编译输出的代码质量,并非常重视可读性。

看到输出示例

jbang一起运行很好

https://github.com/QuiltMC/quiltflower/releases/download/1.8.1/quiltflower-1.8.1.jar

或者:

java -jar quiltflower.jar -dgs=1 c:\Temp\binary\library.jar c:\Temp\binary\Boot.class c:\Temp\source\

2009: JavaDecompiler可以很好地处理jar:从0.2.5开始,将显示jar文件中的所有文件。

http://java.decompiler.free.fr/sites/default/screenshots/screenshot1.png

另见问题“如何“反编译”Java类文件?”

JD-Eclipse自2009年底以来似乎没有改变(参见变化)。
因此,它与最新的Eclipse(3.8, 4.2+)的集成可能存在问题

积极维护JD-Core。

两者都是(SO user) < >强Emmanuel Dupuy称:"现在< / >强出色工作的结果。


2018:一个更现代的选项,由大卫·肯尼迪·阿劳霍提到在评论中:

JetBrains/intellij-community/plugins/java-decompiler/engine

Fernflower是Java的第一个实际工作的分析反编译器,可能对于一般的高级编程语言也是如此。

java -jar fernflower.jar [-<option>=<value>]* [<source>]+ <destination>


java -jar fernflower.jar -hes=0 -hdc=0 c:\Temp\binary\ -e=c:\Java\rt.jar c:\Temp\source\

另请参阅如何反编译到java文件intellij idea,以获得与最近的IntelliJ IDEA一起工作的命令。


2022年更新:Florian Wendelborn建议在的评论

这个很好:jdec.app from 莱昂纳多桑托斯

如果你碰巧有bash shell和jad:

JAR=(your jar file name)
unzip -d $JAR.tmp $JAR
pushd $JAR.tmp
for f in `find . -name '*.class'`; do
jad -d $(dirname $f) -s java -lnc $f
done
popd

我可能有一点点,一点点的偏差,但它应该或多或少像宣传的那样有效。你应该以包含反编译文件的$JAR.tmp结束。

首先,值得记住的是,所有Java归档文件(.jar/.war/等等…)都是所有这些基本上都只是fancy.zip文件,并添加了一些清单和元数据。

其次,为了解决这个问题,我个人使用了几个可以在各个层面处理这个问题的工具:

前面提到的优点是,我不需要持有任何其他外部工具,使我的工作环境混乱。我从这些文件中需要的任何东西都可以在我的IDE中处理,或者与其他文件本地进行区别。

注意:此解决方案仅适用于Mac和*nix用户。

我也试过找杰德,但一无所获。我的快速解决方案是下载包含jad的MacJad。一旦你下载了它,你可以在[where-you-download - MacJAD]/MacJAD/Contents/Resources/jad中找到jad。

我使用一个名为(令人沮丧的)“Java反编译器”。

我发现它比大多数反编译器当处理为Java 5或更高版本编译的类时更好。不幸的是,在JAD通常会成功的地方,它仍然会有一些问题。

喜欢的东西:

jar -xf foo.jar && find . -iname "*.class" | xargs /opt/local/bin/jad -r

也许?

将以下内容插入到decompile.jar.sh中

# Usage: decompile.jar.sh some.jar [-d]


# clean target folders
function clean_target {
rm -rf $unjar $src $jad_log
}


# clean all debug stuff
function clean_stuff {
rm -rf $unjar $jad_log
}


# the main function
function work {
jar=$1
unjar=`basename $jar.unjar`
src=`basename $jar.src`
jad_log=jad.log


clean_target


unzip -q $jar -d $unjar
jad -d $src -ff -r -lnc -o -s java $unjar/**/*.class > $jad_log 2>&1


if [ ! $debug ]; then
clean_stuff
fi


if [ -d $src ]
then
echo "$jar has been decompiled to $src"
else
echo "Got some problems check output or run in debug mode"
fi
}


function usage {
echo "This script extract and decompile JAR file"
echo "Usage: $0 some.jar [-d]"
echo "    where: some.jar is the target to decompile"
echo "    use -d for debug mode"
}


# check params
if [ -n "$1" ]
then
if [ "$2" == "-d" ]; then
debug=true
set -x
fi
work $1
else
usage
fi
  • Chmod +x compile .jar.sh //可执行文件
  • Ln -s ./ compile .jar。年代/usr/bin/dj

准备好使用,只需输入dj your.jar,你就会得到带有源代码的your.jar.src文件夹。调试模式使用-d选项。