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

Posted

技术标签:

【中文标题】如何反编译整个Jar文件? [关闭]【英文标题】:How to decompile a whole Jar file? [closed] 【发布时间】:2010-10-13 10:11:39 【问题描述】:

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

【问题讨论】:

还记得两件事:1) 仅仅提到反编译器就会导致“比你更神圣”的人出现并对你的动机做出价值判断,尽管你不知道你的计划用途是什么,所以小心你和谁说话。 2) 花哨的 JavaDecompiler 将为您提供出色的代码再现,布局合理且易于阅读 - 仅缺少 cmets。恢复一个早已丢失源代码的 JAR 文件,其中包含变量名,这非常好。当然,我们不会混淆我们内部的 JAR 文件。 另见帖子Choose and test java decompiler中的备注。 当我需要研究某人如何为 Bukkit 插件完成某事时,我已经多次在此线程上停下来......该评论总是让我微笑。我希望我每次路过都能投票赞成。 如果您不想下载任何软件,可以使用简单的在线反编译器。 javadecompilers.com 这不应该被关闭,因为反编译器游乐场会动态变化。目前,最好的可能是FernFlower。如果您正在寻找一个简单的解决方案,请下载 Windup 并在您的 .jar 上运行它的命令行版本。它将使用 FernFlower 进行反编译,最高支持 Java 8(jad 仅支持 Java 1.3,JavaDecompiler 最高支持 Java 1.5 IIRC),如果 FernFlower 失败,将回退到 Procyon。 【参考方案1】:

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

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

【讨论】:

仅供参考,java 反编译器适用于 windows、mac 和 linux。 @AlexS nice :) 下一步:版本控制 (***.com/questions/59561/…) 然后是持续集成 (***.com/questions/130592/…) 使用 Java Decompiler,您可以打开 JAR 文件并转到文件,保存所有源。它将所有类文件保存到java文件中=D 请记住它也会出错。我有一个带有成员变量的类,它将它移到函数的参数中,从而破坏了代码的效果。当心,它会抓住你的。 京东是一个很好的起点,但无法反编译复杂的代码。一个不错的选择是使用github.com/JetBrains/intellij-community/tree/master/plugins/…【参考方案2】:

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

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

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

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

【讨论】:

【参考方案3】:

如果你碰巧同时拥有 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

【讨论】:

在 ubuntu 上使用 #!/bin/bash 而不是 #!/bin/sh 因为 pushd 不适用于默认的 ubuntu shell... 我在这个基本循环结构中使用javap,它对我有用。 @mossplix 或使用 /bin/sh(更便携)与 cdcd -,这对于这个用例来说已经足够了 :-)【参考方案4】:

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

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

【讨论】:

我无法下载 Windows 或 Linux 版本的 JD-GUI。这个问题只出现在我身上吗? @JanusTroelsen 我删除了它。谢谢你通知它。让我们保持答案干净:)【参考方案5】:

类似:

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

也许?

【讨论】:

我使用 jad 已经有一段时间了,需要一种快速的方法来提取和反编译整个 jar。谢谢,这帮助很大。【参考方案6】:

将以下内容插入到 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”,因为我不想污染我的垃圾箱文件夹 任何重新编译器?将 jad 文件重新编译到 jar 中?【参考方案7】:

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

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

【讨论】:

【参考方案8】:

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

【讨论】:

我认为您不能只针对目录运行它。您必须指定 dir/**/*.class 解压jar并使用jad dir之类的东西,我刚刚测试过,在windows上不起作用

以上是关于如何反编译整个Jar文件? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在eclipsemarketplace里安装反编译

如何“反编译”Java 类文件? [关闭]

如何从 j2me .jar 应用程序中反编译、编辑和重新编译单个类文件

如何在bos中安装java反编译插件

反编译CHM后如何重新合成

如何在eclipse中配置反编译工具JadClipse