如何反编译整个Jar文件?

时间:2009-03-15 02:08:43

标签: java jar decompiler

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

9 个答案:

答案 0 :(得分:294)

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

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

另见the question "How do I “decompile” Java class files?"

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

JD-Core得到积极维护。

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


2018:一个更现代的选项,in the comments提到了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\

另请参阅How to decompile to java files intellij idea了解使用最新IntelliJ IDEA的命令。

答案 1 :(得分: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

答案 2 :(得分:36)

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

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

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

上述所有优点是,我不需要保留任何其他外部工具,这会使我的工作环境变得混乱。我需要从其中一个文件中获取的所有内容都可以在我的IDE中处理,或者本地与其他文件进行区分。

答案 3 :(得分:24)

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

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

答案 4 :(得分:10)

类似的东西:

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

可能?

答案 5 :(得分: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选项进行调试模式。

答案 6 :(得分:2)

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

答案 7 :(得分:1)

你提取它然后使用jad对抗目录。

答案 8 :(得分:1)

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

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