web-dev-qa-db-ja.com

Jarファイル全体を逆コンパイルする方法

誰もが単一のクラスではなくJarファイル全体を逆コンパイルできる無料の逆コンパイラを知っていますか? $ 1.class name $ 2.class name.classのようなサブクラスに問題があります

258
StoneHeart

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年:より近代的な選択肢、コメントの中で と述べた by David Kennedy Araujo

JetBrains/intellij-community/plugins/Javaデコンパイラー/ 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 も参照してください。

294
VonC

まず第一に、すべてのJavaアーカイブファイル(.jar/.war/etc ...)は 基本的には単なるfancy.Zipファイル で、いくつかのマニフェストとメタデータが追加されています。

次に、この問題に取り組むために、私は個人的にすべてのレベルでこの問題を処理するいくつかのツールを使用します。

  • Jad + Jadclipse で作業中.classファイルを逆コンパイルするためのIDE
  • WinRAR 、私のお気に入りの圧縮ツールはネイティブにJavaアーカイブをサポートしています(これも最初の段落を参照してください)。
  • 比較を超えて 、私のお気に入りのdiffツールは、正しく設定すると、jarsを含むあらゆるアーカイブファイル間でその場での比較ができます。試してみる価値があります。

前述のすべての利点は、私が自分の作業環境を乱雑にするような他の外部ツールを保持する必要がないということです。これらのファイルの1つから必要となるすべてのものは、私のIDE内で処理することも、他のファイルとネイティブに比較することもできます。

36
Yuval Adam

もしあなたがたまたま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で終わらなければなりません。

36
Chris R

私は(イライラするように) " JD:Java Decompiler "という名前のツールで妥当な成功を収めました。

Java 5以降用にコンパイルされたクラスを扱う場合は、ほとんどの逆コンパイラよりも優れていることがわかりました。残念なことに、それはまだJADが通常成功するであろういくつかのしゃっくりを持つことができます。

24
Adam Paynter

何かのようなもの:

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

多分?

10
cybertoast

以下を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オプションを使用してください。

5
merzod

Jarファイルは、拡張子がjarのZipファイルです。 Zipファイルのようにjarを解凍(winzip)できるはずです。

2
Cadoo

あなたはそれを解凍し、それからdirに対してjadを使います。

1
yanchenko

注:この解決方法はMacおよび* nixユーザーにのみ有効です。

私はまた運なしでJadを見つけようとしました。私の手っ取り早い解決策は MacJad をダウンロードすることでした。ダウンロードしたら、[ダウンロードしたmacjadの場所]/MacJAD/Contents/Resources/jadにjadがあります。

1
Joel S