315

有谁知道可以反编译整个 Jar 文件而不是单个类的免费反编译器?我对像 name$1.class name$2.class name.class 这样的子类有疑问

4

8 回答 8

337

2009:JavaDecompiler可以很好地使用 jar:从 0.2.5 开始,显示 JAR 文件中的所有文件。

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

另请参阅问题“我如何“反编译”Java 类文件?” .

不过,自 2009 年底以来,JD-Eclipse 似乎没有发生任何变化(请参阅Changes)。
因此,它与最新的 Eclipse(3.8、4.2+)的集成可能会出现问题。

JD-Core 得到积极维护。

两者都是(SO 用户)Emmanuel Dupuy出色工作的结果。


2018:更现代的选择,在David Kennedy Araujo的评论中提到:

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 的命令。

于 2009-03-15T02:21:34.233 回答
40

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

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

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

上述所有内容的优点是我不需要持有任何其他使我的工作环境混乱的外部工具。我从其中一个文件中需要的所有东西都可以在我的 IDE 中处理,也可以与其他文件进行本地区分。

于 2009-03-15T09:00:33.947 回答
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包含您的反编译文件。

于 2009-03-15T04:40:06.290 回答
28

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

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

于 2009-03-27T11:37:51.023 回答
12

就像是:

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

也许?

于 2010-02-05T16:47:18.240 回答
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调试模式选项。

于 2011-04-12T09:37:54.290 回答
1

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

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

于 2009-03-27T11:31:03.147 回答
0

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

于 2009-03-15T02:14:01.100 回答