Tentang Bunga Pakis
FernFlower adalah dekompiler analitis pertama yang benar-benar berfungsi untuk Java dan mungkin untuk bahasa pemrograman tingkat tinggi secara umum. Tentu saja ini masih dalam pengembangan, silakan kirim laporan bug dan saran perbaikan Anda ke [pelacak masalah](https://youtrack.jetbrains.com/newIssue?project=IDEA&clearDraft=true&c=Subsystem+Java.Decompiler).
FernFlower dan ForgeFlower
FernFlower menyertakan beberapa tambalan dari ForgeFlower. Apresiasi yang tulus diberikan kepada pengelola ForgeFlower atas kontribusi dan peningkatan mereka yang berharga.
Lisensi
FernFlower dilisensikan di bawah Lisensi Apache Versi 2.0.
Berjalan dari baris perintah
java -jar fernflower.jar [-<option>=<value>]* [<source>]+ <destination>
* berarti 0 kali atau lebih
+ berarti 1 kali atau lebih
<source>: file atau direktori dengan file yang akan didekompilasi. Direktori dipindai secara rekursif. Ekstensi file yang diperbolehkan adalah class, zip dan jar. Sumber yang diawali dengan -e= berarti file "perpustakaan" yang tidak akan didekompilasi, tetapi diperhitungkan saat menganalisis hubungan antar kelas atau metode. Khususnya penggantian nama pengidentifikasi (s. opsi 'ren') dapat memperoleh manfaat dari informasi tentang kelas eksternal.
<tujuan>: direktori tujuan
<option>, <value>: opsi baris perintah dengan nilai yang sesuai (lihat "Opsi baris perintah" di bawah).
Contoh:
java -jar fernflower.jar -hes=0 -hdc=0 c:Tempbinary -e=c:Javart.jar c:Tempsource
java -jar fernflower.jar -dgs=1 c:Tempbinarylibrary.jar c:TempbinaryBoot.class c:Tempsource
Opsi baris perintah
Kecuali mpm dan urc, nilai 1 berarti opsi diaktifkan, 0 - dinonaktifkan. Nilai default, jika ada, diberikan di antara tanda kurung.
Biasanya, opsi berikut akan diubah oleh pengguna, jika ada: hes, hdc, dgs, mpm, ren, urc Opsi lainnya dapat dibiarkan apa adanya: ditujukan untuk reverse engineer profesional.
- rbr (1): menyembunyikan metode jembatan
- rsy (0): menyembunyikan anggota kelas sintetis
- din (1): mendekompilasi kelas dalam
- dc4 (1): runtuhnya referensi kelas 1.4
- das (1): mendekompilasi pernyataan
- hes (1): sembunyikan doa super kosong
- hdc (1): sembunyikan konstruktor default yang kosong
- dgs (0): mendekompilasi tanda tangan generik
- ner (1): asumsikan pengembalian tidak memberikan pengecualian
- den (1): mendekompilasi enumerasi
- rgn (1): hapus pemanggilan getClass(), jika itu merupakan bagian dari pernyataan baru yang memenuhi syarat
- menyala (0): keluaran literal numerik "apa adanya"
- asc (0): menyandikan karakter non-ASCII dalam string dan karakter literal saat Unicode lolos
- bto (1): menafsirkan int 1 sebagai boolean true (solusi untuk bug kompiler)
- nns (0): mengizinkan untuk tidak menyetel atribut sintetik (solusi untuk bug kompiler)
- uto (1): pertimbangkan tipe tanpa nama sebagai java.lang.Object (solusi untuk kelemahan arsitektur kompiler)
- udv (1): merekonstruksi nama variabel dari informasi debug, jika ada
- ump (1): merekonstruksi nama parameter dari atribut terkait, jika ada
- rer (1): hapus rentang pengecualian kosong
- fdi (1): menghilangkan struktur akhirnya
- mpm (0): waktu pemrosesan maksimum yang diperbolehkan per metode yang didekompilasi, dalam hitungan detik. 0 berarti tidak ada batas atas
- ren (0): mengganti nama kelas dan elemen kelas yang ambigu (resp. dikaburkan).
- urc (-): nama lengkap kelas yang disediakan pengguna yang mengimplementasikan antarmuka IIdentifierRenamer. Ini digunakan untuk menentukan pengidentifikasi kelas mana yang harus diganti namanya dan memberikan nama pengidentifikasi baru (lihat "Mengganti nama pengidentifikasi")
- inn (1): periksa anotasi @NotNull khusus IntelliJ IDEA dan hapus kode yang dimasukkan jika ditemukan
- lac (0): mendekompilasi ekspresi lambda ke kelas anonim
- nls (0): tentukan karakter baris baru yang akan digunakan untuk output. 0 - 'rn' (Windows), 1 - 'n' (Unix), defaultnya bergantung pada OS
- ind: string indentasi (standarnya adalah 3 spasi)
- crp (0): gunakan pola rekaman jika memungkinkan
- cps (0): gunakan saklar dengan pola jika memungkinkan
- log (INFO): tingkat logging, nilai yang mungkin adalah TRACE, INFO, WARN, ERROR
- iec (0): memasukkan seluruh jalur kelas ke dalam konteks saat mendekompilasi
- isl (1): ekspresi lambda sederhana sebaris
- ucrc (1): menyembunyikan konstruktor dan pengambil rekaman yang tidak diperlukan
- cci (1): periksa apakah sumber daya di coba-dengan-sumber daya benar-benar mengimplementasikan antarmuka
AutoCloseable
- jvn (0): menimpa nama variabel lokal apa pun dengan nama gaya JAD
- jpr (0): menyertakan nama parameter dalam penamaan JAD
Mengganti nama pengidentifikasi
Beberapa obfuscator memberi kelas dan elemen anggotanya nama yang pendek, tidak berarti, dan yang terpenting ambigu. Kompilasi ulang kode tersebut menyebabkan banyak konflik. Oleh karena itu disarankan untuk membiarkan decompiler mengganti nama elemen secara bergantian, memastikan keunikan setiap pengenal.
Opsi 'ren' (yaitu -ren=1) mengaktifkan fungsi penggantian nama. Strategi penggantian nama default adalah sebagai berikut:
- ganti nama elemen jika namanya adalah kata yang dicadangkan atau lebih pendek dari 3 karakter
- nama baru dibuat berdasarkan pola sederhana: (kelas|metode|bidang)_<nomor unik berturut-turut>
Anda dapat menimpa aturan ini dengan menyediakan implementasi Anda sendiri atas 4 metode utama yang dipanggil oleh dekompiler saat mengganti nama. Cukup teruskan kelas yang mengimplementasikan org.jetbrains.java.decompiler.main.extern.IIdentifierRenamer dalam opsi 'urc' (misalnya -urc=com.example.MyRenamer) ke FernFlower. Kelas harus tersedia di classpath aplikasi.
Arti setiap metode harus jelas dari penamaannya: toBeRenamed menentukan apakah elemen akan diganti namanya, sementara tiga lainnya memberikan nama baru untuk masing-masing kelas, metode, dan bidang.