如何反编译整个Jar文件?[关闭]


283

有人知道免费的反编译器可以反编译整个Jar文件而不是单个类吗?我对诸如name $ 1.class name $ 2.class name.class之类的子类有问题


127
请记住另外两件事:1)尽管不知道计划的用途是什么,仅提及反编译器就会使“比您更聪明”出来,并对您的动机进行价值判断,因此请谨慎与之交谈。2)花哨的JavaDecompiler将为您提供出色的代码再现,布局合理且易于阅读-仅缺少注释。令人惊奇的是,它恢复了一个长期丢失了完整的变量名的JAR文件。当然,我们不会混淆内部的JAR文件。
安德鲁


8
当我需要研究某人如何为Bukkit插件完成某件事时,我已经被这个线程停下了很多次。我希望我每次来都可以投票。
Jane Panda 2012年


如果您不想下载任何软件,请使用简单的在线反编译器。javadecompilers.com
尼克·格雷厄姆

Answers:


312

2009年:JavaDecompiler可以用jar很好地工作:由于0.2.5,因此显示JAR文件中的所有文件。

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

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

不过,自2009年下半年以来,JD-Eclipse似乎并未发生变化(请参阅“ 更改”)。
因此,将其与最新的Eclipse(3.8,4.2+)集成可能会出现问题。

JD-Core会得到积极维护。

两者都是(SO用户)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\

另请参阅如何使用最新的IntelliJ IDEA将命令反编译为Java文件intellij idea


5
仅供参考,java decompiler可在Windows,Mac和Linux上运行。
yanokwa 2011年

4
@AlexS好:)下一步:版本控制(stackoverflow.com/questions/59561/...)然后持续集成(stackoverflow.com/questions/130592/...
VonC

3
使用Java Decompiler,您可以打开JAR文件,然后转到文件,保存所有源。它将所有类文件保存到Java文件中= D
山本彰(Akira Yamamoto)

2
请记住,它也会出错。我有一个带有Member变量的类,并将其移至函数的参数,这破坏了代码的效果。当心,它将帮助您。
CharlesW 2014年

1
JD是一个很好的起点,但是无法反编译复杂的代码。一个很好的选择是使用github.com/JetBrains/intellij-community/tree/master/plugins/...
大卫·肯尼迪

37

首先,值得记住的是,所有Java存档文件(.jar/ .war/ etc ...)基本上都是花哨的.zip文件,其中包含一些清单和元数据。

其次,为解决此问题,我个人使用了几种工具来处理所有级别的问题:

  • Jad + Jadclipse在IDE中用于反编译.class文件时
  • 我最喜欢的压缩工具 WinRAR本机支持Java存档(同样请参见第一段)。
  • 在Compare之外,我最喜欢的diff工具,如果配置正确,就可以在任何存档文件(包括jars)之间进行即时比较。非常值得一试。

前面提到的所有优点是,我不需要拿着任何其他会使我的工作环境混乱的外部工具。这些文件之一所需要的一切都可以在IDE内处理,也可以与其他文件本地比较。


哈哈,我一直在解压缩chrome和firefox扩展名,而我也忘记了.jar也是zip :)
Carter Cole 2010年

36

如果您碰巧同时拥有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包含已反编译的文件。


1
在ubuntu上使用#!/ bin / bash而不是#!/ bin / sh,因为默认的ubuntu外壳
无法使用pushacausw pushed

1
javap在这个基本的循环结构中使用它,并且对我有用。
克里斯·普林斯

25

我使用(令人沮丧地)名为“ JD:Java Decompiler ” 的工具取得了合理的成功。

在处理针对Java 5及更高版本的类时,我发现它比大多数反编译器要好。不幸的是,它仍然可能会妨碍JAD通常会成功。


我无法下载Windows或Linux版本的JD-GUI。这个问题只出现在我身上吗?
mmdemirbas 2012年

@JanusTroelsen我删除了它。感谢您通知。让答案保持干净:)
pramodc84

@ ZERO3:更新
的Gowtham戈帕拉克里希南

11

就像是:

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

也许?


1
我使用jad已有一段时间了,需要一种快速的方法来提取和反编译整个jar。谢谢,这极大地帮助了我。
Alper Akture,2012年

5

将以下内容插入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 decomplie.jar.sh //可执行
  • ln -s ./decomplie.jar.s / usr / bin / dj

准备使用,只需键入dj your.jar,您将获得your.jar.src带有源的文件夹。使用-d调试模式选项。


谢谢,但是必须在第23行将“ jad”更改为“ ./jad”并运行“ bash decompile.jar.sh foo.jar -d”,因为我不想污染我的bin文件夹
Sam

任何重新编译器?将jad文件重新编译到jar中?
N杰伊

2

jar文件只是具有jar扩展名的zip文件。您应该能够像压缩文件一样解压缩(winzip)jar。


1

您提取它,然后对目录使用jad。


我认为您不能直接针对目录运行它。您将必须指定{dir} / ** / *。class
Vihung 2012年

提取罐子并使用诸如jad {dir}之类的东西,我刚刚对其进行了测试,并且无法在Windows上运行
Jaime Hablutzel 2013年

1

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

我也试图找到没有运气的贾德。我的快速解决方案是下载包含jad的MacJad。下载后,您可以在[where-you-downloaded-macjad] / MacJAD / Contents / Resources / jad中找到jad。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.