JARファイル全体を逆コンパイルする方法は?[閉まっている]


283

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


127
さらに2つのことを覚えておいてください。1)デコンパイラーについて単に言及するだけで、「あなたよりもホリエ」が出てきて、あなたの動機について価値の判断を下すようになります。2)豪華なJavaDecompilerは、コードの優れた表現を提供し、よくレイアウトされ、読みやすく、コメントのみが欠落しています。驚くべきことに、ソースを変数名で完全に失ってしまったJARファイルを回復することは驚くべきことです。もちろん、社内のJARファイルを難読化することはありません。
Andrew

ポストの備考も参照して、Javaデコンパイラーを選択してテストしてください。
dma_k 2012年

8
誰かがBukkitプラグインのために何かを成し遂げる方法を研究する必要があったとき、私はこのスレッドに何度も立ち寄りました...そのコメントはいつも私を笑顔にします 立ち寄るたびに賛成票を入れたいです。
ジェーンパンダ

SecureTeam Java Decompilerはそれを行うことができます。
SecureTeam Software

ソフトウェアをダウンロードしたくない場合は、簡単なオンライン逆コンパイラ。javadecompilers.com
Nick Graham

回答:


313

2009:JavaDecompilerjarを使用して適切に機能します。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ユーザー)Emmanuel Dupuyの素晴らしい作品の結果です。


2018:言及したAより近代的なオプション、コメントでデビッド・ケネディアラウージョ

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のアイデアも参照してください。


5
fyi、javaデコンパイラは、Windows、Mac、Linuxで動作します。
yanokwa 2011

4
@AlexS素敵な:)次のステップ:バージョン管理(stackoverflow.com/questions/59561/...)そして継続的インテグレーション(stackoverflow.com/questions/130592/...
VonC

3
Java Decompilerを使用すると、JARファイルを開いて、[ファイル]、[すべてのソースを保存]の順に移動できます。すべてのクラスファイルをJavaファイルに保存します= D
山本章

2
エラーも発生することを忘れないでください。Member変数を持つクラスがあり、それが関数のパラメーターに移動し、コードの効果が失われました。気をつけて、それはあなたを取得します。
CharlesW 2014

1
JDは良い出発点ですが、複雑なコードを逆コンパイルできません。良い代替案はgithub.com/JetBrains/intellij-community/tree/master/plugins/…を
デビッドケネディ

37

まず第一に、すべてのJavaアーカイブファイル(.jar/ .war/ etc ...)はすべて、基本的に単なるファンシー.zipファイルであり、いくつかのマニフェストとメタデータが追加されていることを覚えておく価値があります。

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

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

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


lolz私はchromeとFirefoxの拡張機能を解凍し続けていますが、.jarも単なるzipであることを忘れていました:)
Carter Cole

36

bashシェルと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 / shの代わりに#!/ bin / bashを使用してください。デフォルトのubuntuシェルではpushcauswが機能しないためです...
mossplix

1
私はjavapこの基本的なループ構造内で使用しており、それは私のために働いています。
クリスプリンス

25

私は(イライラする)「JD:Java Decompiler」という名前のツールでかなりの成功を収めました。

Java 5以降用にコンパイルされたクラスを処理するときに、ほとんどの逆コンパイラよりも優れていることがわかりました。残念ながら、それでもJADが通常成功するような問題が発生する可能性があります。


JD-GUIのWindowsまたはLinuxバージョンをダウンロードできませんでした。この問題は私だけに発生しますか?
mmdemirbas 2012

@JanusTroelsen削除しました。お知らせありがとうございます。答えをきれいに保ち
ましょう

@ Zero3:更新
Gowtham Gopalakrishnan '

11

何かのようなもの:

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

多分?


1
私はしばらくjadを使用しており、jarファイル全体を抽出して逆コンパイルする簡単な方法が必要でした。おかげで、これは非常に役立ちました。
Alper Akture

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.jaryour.jar.src表示されます。-dデバッグモードのオプションを使用します。


ありがとうございます。ただし、binフォルダーを汚染したくなかったため、23行目で「jad」を「./jad」に変更して「bash decompile.jar.sh foo.jar -d」を実行する必要がありました
Sam

どんなリコンパイラ?jadファイルをjarに再コンパイルしますか?
Nジェイ

2

jarファイルは、jar拡張子が付いた単なるzipファイルです。zipファイルと同じように、jarを解凍(winzip)できるはずです。


1

それを抽出してから、dirに対してjadを使用します。


dirに対して実行することはできないと思います。{dir} / ** / *
。class

jarを抽出し、jad {dir}のようなものを使用します。テストしたばかりで、Windowsでは機能しません
Jaime Hablutzel '15

1

注:このソリューションは、Macおよび* nixユーザーに対してのみ機能します。

私も運の悪いジャドを見つけようとしました。私の簡単な解決策は、jadを含むMacJadをダウンロードすることでした。ダウンロードすると、[where-you-downloaded-macjad] / MacJAD / Contents / Resources / jadにjadが見つかります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.