Bagaimana cara mendekompilasi seluruh file Jar? [Tutup]

283

Adakah yang tahu tentang dekompiler gratis yang dapat mendekompilasi seluruh file Jar, bukan kelas tunggal? Saya punya masalah dengan sub-kelas seperti nama $ 1.class name $ 2.class name.class

StoneHeart
sumber
127
Ingat dua hal lagi: 1) Penyebutan decompiler saja akan menyebabkan "lebih suci dari kamu" keluar dan membuat penilaian nilai tentang motif Anda meskipun tidak tahu apa yang Anda gunakan, jadi berhati-hatilah dengan siapa Anda berbicara. 2) JavaDecompiler yang mewah akan memberi Anda rendemen kode yang sangat baik, ditata dengan baik dan mudah dibaca - hanya komentar yang hilang. Sangat bagus, memulihkan file JAR yang telah lama kehilangan sumber lengkap dengan nama variabel. Tentu saja kami tidak mengaburkan file JAR kami sendiri.
Andrew
Lihat juga komentar di pos Pilih dan uji dekompiler java .
dma_k
8
Saya telah berhenti oleh utas ini berkali-kali ketika saya perlu mempelajari bagaimana seseorang menyelesaikan sesuatu untuk plugin Bukkit ... Komentar itu selalu membuat saya tersenyum. Saya berharap saya dapat membenarkan itu setiap kali saya mampir.
Jane Panda
SecureTeam Java Decompiler dapat melakukan itu.
Perangkat Lunak SecureTeam
Dekompiler online sederhana jika Anda tidak ingin mengunduh perangkat lunak apa pun. javadecompilers.com
Nick Graham

Jawaban:

313

2009: JavaDecompiler dapat melakukan pekerjaan dengan baik dengan jar: sejak 0.2.5, Semua file, dalam file JAR, ditampilkan.

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

Lihat juga pertanyaan "Bagaimana cara saya" mendekompilasi "file kelas Java?" .

JD-Eclipse tampaknya tidak berubah sejak akhir 2009 (lihat Perubahan ).
Jadi integrasinya dengan Eclipse terbaru (3.8, 4.2+) mungkin bermasalah.

JD-Core dikelola secara aktif.

Keduanya adalah hasil karya fantastis (pengguna SO) Emmanuel Dupuy .


2018: Pilihan yang lebih modern, disebutkan dalam komentar oleh David Kennedy Araujo :

JetBrains / intellij-community / plugins / java-decompiler / engine

Fernflower adalah dekompiler analitik pertama yang benar-benar berfungsi untuk Java dan mungkin untuk bahasa pemrograman tingkat tinggi secara umum.

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\

Lihat juga Cara mendekompilasi ke file java intellij idea untuk perintah yang bekerja dengan IntelliJ IDEA baru-baru ini.

VONC
sumber
5
fyi, decompiler java berfungsi di windows, mac dan linux.
yanokwa
4
@AlexS nice :) Langkah selanjutnya: kontrol versi ( stackoverflow.com/questions/59561/… ) Dan kemudian Continuous Integration ( stackoverflow.com/questions/130592/… )
VonC
3
Dengan Java Decompiler Anda dapat membuka file JAR dan pergi ke File, Save All Sources. Ini menyimpan semua file kelas ke file java = D
Akira Yamamoto
2
Harap diingat bahwa itu juga membuat kesalahan. Saya memiliki kelas dengan variabel Anggota dan memindahkannya ke parameter fungsi, menghancurkan efek kode. Awas, itu akan membuat Anda.
CharlesW
1
JD adalah titik awal yang baik tetapi gagal mendekompilasi kode kompleks. Alternatif yang baik adalah menggunakan github.com/JetBrains/intellij-community/tree/master/plugins/…
David Kennedy
37

Pertama-tama, perlu diingat bahwa semua file arsip Java ( .jar/ .war/ etc ...) semuanya pada dasarnya hanya .zipfile mewah , dengan beberapa manifes dan metadata yang ditambahkan.

Kedua, untuk mengatasi masalah ini saya secara pribadi menggunakan beberapa alat yang menangani masalah ini di semua tingkatan:

  • Jad + Jadclipse saat bekerja di IDE untuk mendekompilasi.classfile
  • WinRAR , alat kompresi favorit saya mendukung arsip Java (sekali lagi, lihat paragraf pertama).
  • Di luar Bandingkan , alat diff favorit saya, ketika dikonfigurasi dengan benar dapat melakukan perbandingan on-the-fly antara file arsip, termasukjars. Layak dicoba.

Keuntungan dari semua yang disebutkan di atas, adalah bahwa saya tidak perlu memegang alat eksternal lain yang mengacaukan lingkungan kerja saya. Semua yang saya perlukan dari salah satu file tersebut dapat ditangani di dalam IDE saya atau berbeda dengan file lain secara asli.

Yuval Adam
sumber
lolz saya terus membuka ritsleting ekstensi chrome dan firefox dan saya lupa bahwa jar juga hanya ritsleting :)
Carter Cole
36

Jika Anda memiliki bash shell dan 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

Saya mungkin sedikit, sangat kecil dengan itu, tetapi harus bekerja lebih atau kurang seperti yang diiklankan. Anda harus berakhir dengan $JAR.tmpberisi file yang telah dikompilasi.

Chris R
sumber
1
di ubuntu gunakan #! / bin / bash alih-alih #! / bin / sh karena pushd tidak berfungsi untuk shell ubuntu default ...
mossplix
1
Saya menggunakan javapdalam struktur loop dasar ini, dan itu berfungsi untuk saya.
Chris Prince
25

Saya sudah cukup sukses dengan alat bernama (frustasi) " JD: Java Decompiler ".

Saya telah menemukan itu lebih baik daripada kebanyakan decompiler ketika berhadapan dengan kelas yang dikompilasi untuk Java 5 dan lebih tinggi . Sayangnya, masih ada beberapa masalah di mana JAD biasanya berhasil.

Adam Paynter
sumber
Saya tidak bisa mengunduh JD-GUI versi Windows atau Linux. Apakah masalah ini hanya muncul pada saya?
mmdemirbas
@ JanusTroelsen saya menghapusnya. Terima kasih telah memberitahukannya. Mari kita tetap bersihkan jawaban :)
pramodc84
@ Zero3: diperbarui
Gowtham Gopalakrishnan
11

Sesuatu seperti:

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

mungkin?

cybertoast
sumber
1
Saya telah menggunakan jad untuk sementara waktu dan membutuhkan cara cepat untuk mengekstrak dan mendekompilasi seluruh toples. Terima kasih, ini sangat membantu.
Alper Akture
5

Masukkan yang berikut ini ke 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 // dapat dieksekusi
  • ln -s ./decomplie.jar.s / usr / bin / dj

Siap digunakan, cukup ketik dj your.jardan Anda akan mendapatkan your.jar.srcfolder dengan sumber. Gunakan -dopsi untuk mode debug.

merzod
sumber
Terima kasih, tetapi harus mengubah "jad" menjadi "./jad" pada baris 23 dan menjalankan "bash decompile.jar.sh foo.jar -d" karena saya tidak ingin mencemari folder bin saya
Sam
ada recompiler? mengkompilasi ulang file jad ke dalam jar?
N Jay
2

File jar hanyalah file zip dengan ekstensi jar. Anda harus dapat meng-unzip (winzip) stoples seperti halnya file zip.

Cadoo
sumber
1

Anda mengekstraknya dan kemudian menggunakan jad melawan dir.

yanchenko
sumber
Saya tidak berpikir Anda bisa menjalankannya melawan dir. Anda harus menentukan {dir} / ** / *. Class
Vihung
Ekstrak toples dan gunakan sesuatu seperti jad {dir}, saya baru saja mengujinya dan tidak bekerja di windows
Jaime Hablutzel
1

Catatan: Solusi ini hanya berfungsi untuk pengguna Mac dan * nix.

Saya juga mencoba menemukan Jad tanpa hasil. Solusi cepat saya adalah mengunduh MacJad yang berisi jad. Setelah Anda mengunduhnya, Anda dapat menemukan jad di [tempat-Anda-mengunduh-macjad] / MacJAD / Konten / Sumber Daya / jad.

Joel S
sumber