Proyek ini tidak lagi dipertahankan
Disarankan untuk menggunakan versi baru Jar Analyzer V2 https://github.com/jar-analyzer/jar-analyzer
Versi baris perintah JAR-ANALYZER
Versi Jar-Analyzer CLI
Pendahuluan singkat: https://mp.weixin.qq.com/s/rrx6x5m_28yrcqqcdxueeq
Tidak ada dokumen bahasa Inggris, orang asing tolong terjemahkan sendiri
Alat GUI untuk menganalisis paket jar , terutama cocok untuk audit keamanan kode. Beberapa file jar dapat dianalisis pada saat yang sama, dan metode target dapat dengan mudah dicari. Mendukung bytecode mendekompilasi dan secara otomatis membangun hubungan antara kelas dan metode untuk membantu peneliti keamanan Java bekerja lebih efisien.
Catatan: Jangan menganalisis terlalu banyak paket Jar , disarankan untuk tidak melebihi 300M
Pergi untuk mengunduh
Dapat secara akurat menemukan metode (disorot di sebelah kiri)

Anda dapat secara langsung menemukan string (menganalisis instruksi terkait kolam konstan untuk mencapai posisi yang tepat)

Dapat secara langsung menganalisis proyek yang ditulis oleh Spring Framework

Mengapa Tidak Memilih Analisis IDEA : Karena IDEA Tidak Mendukung Analisis Paket Jar Kode Pasif
Mendukung enam metode pencarian:
LDC untuk menemukan lokasi yang tepat)LDC untuk menemukan lokasi yang tepat)Mendukung pemilihan tiga metode dekompilasi:
Gunakan kustomisasi kelas komponen JSyntaxPane (tidak resmi) untuk menunjukkan kode Java
(Banyak teknologi hitam ditambahkan ke perpustakaan https://code.google.com/archive/p/jsyntaxpane )
Mendukung pencarian ekspresi super kuat, yang dapat digabungkan karena Anda ingin mencari informasi yang Anda inginkan
| ekspresi | parameter | memengaruhi |
|---|---|---|
| Namecontains | Rangkaian | Metode nama berisi |
| startwith | Rangkaian | Awalan metode |
| endwith | Rangkaian | Metode Suffix |
| classnamecontains | Rangkaian | Nama kelas berisi |
| returnType | Rangkaian | Tipe Pengembalian Metode |
| paramtypeMap | string int | Korespondensi parameter metode |
| paramsnum | int | Jumlah Parameter Metode |
| ISTatic | Boolean | Apakah metode statisnya? |
| Issubclassof | Rangkaian | Subkelas siapa itu |
| Issuperclassof | Rangkaian | Kelas induk siapa itu |
| Hasanno | Rangkaian | Anotasi metode ini |
| Hasclassanno | Rangkaian | Anotasi kelas |
| Hasfield | Rangkaian | Bidang kelas |
Melihat:
returnType dan paramTypeMap memerlukan nama kelas lengkap yang serupa, seperti java.lang.String , dan tulis tipe dasar secara langsung, misalnya, intisSubClassOf dan isSuperClassOf membutuhkan nama kelas penuh, seperti java.awt.ComponenthasAnno dan hasClassAnno tidak memerlukan nama kelas lengkap, cukup tuliskan secara langsung, misalnya, Controller 
Dasar pencarian adalah metode, metode apa yang ingin Anda cari
Misalnya, saya ingin metode pencarian memulai dengan set dan diakhiri dengan value
# method
. startWith ( "set" )
. endWith ( "value" ) Misalnya, saya ingin mencari metode yang nama kelasnya berisi Context dan nama metode berisi lookup
# method
. nameContains ( "lookup" )
. classNameContains ( "Context" ) Misalnya, saya ingin mencari metode yang mengembalikan total 3 parameter jenis Process dan parameter kedua adalah String
# method
. returnType ( "java.lang.Process" )
. paramsNum ( 3 )
. paramTypeMap ( 1 , "java.lang.String" ) Misalnya, kami ingin menemukan semua subkelas javax.naming.spi.ObjectFactory (termasuk subclass subclass, dll.)
Cukup tulis aturan berikut, dan program akan secara rekursif mencari semua kelas orang tua
# method
. isSubClassOf ( "javax.naming.spi.ObjectFactory" ) Jika Anda ingin menemukan semua kelas induk dari kelas tertentu, cukup gunakan isSuperClassOf (perhatikan nama kelas lengkap)
Perhatikan bahwa hal di atas akan secara langsung menemukan semua metode yang memenuhi kriteria, jadi saya sarankan menambahkan beberapa penyaringan
Misalnya
# method
. isSubClassOf ( "javax.naming.spi.ObjectFactory" )
. startWith ( "xxx" )
. paramsNum ( 0 ) Misalnya, kami ingin menemukan semua metode dari semua kelas yang dijelaskan oleh @Controller
Tulis aturan berikut
# method
. hasClassAnno ( "Controller" ) Misalnya, saya ingin menemukan semua metode anotasi @RequestMapping
# method
. hasAnno ( "RequestMapping" )Demikian pula, karena semua metode yang memenuhi kelas kriteria ditemukan, saya sarankan menambahkan beberapa penyaringan lagi
Menurut kondisi Swing RCE yang disediakan oleh master online:
Component (termasuk subkelas tidak langsung)Jadi kami menulis aturan
# method
. startWith ( "set" )
. paramsNum ( 1 )
. paramTypeMap ( 0 , "java.lang.String" )
. isSubClassOf ( "java.awt.Component" )Hasil pencarian

PENTING: Silakan gunakan Java 8+ untuk menjalankan (11 yang direkomendasikan dan versi EXE dari Java 11 JRE disediakan) disediakan)
(Font yang lebih baik digunakan di Java 11 , versi lain menggunakan font default)
(1) Langkah 1: Tambahkan File jar (Mendukung File jar Tunggal dan Direktori jar )
Select Jar File untuk membuka file JARTolong jangan khawatir, butuh sedikit waktu untuk menganalisis file jar
Catatan: Harap tunggu sampai bilah kemajuan penuh dan analisis selesai.
(2) Langkah 2: Masukkan informasi yang Anda cari
Kami mendukung input dalam tiga format:
javax.naming.Context (misalnya)javax/naming/ContextContext (akan mencari semua *.Context )Memberikan cara untuk dengan cepat masuk

Catatan: Konten pencarian umum di sini dapat disesuaikan untuk suplemen
Buat file search.txt baru di direktori saat ini, pisahkan nama kelas dan metode satu per satu dengan # , misalnya
java.lang.Runtime#getRuntime
java.lang.String#equals
Pencarian biner hanya akan kembali apakah itu ada atau tidak, dan tidak akan mengembalikan informasi spesifik.

(3) Langkah 3: Anda dapat mengklik dua kali untuk mendekompilasi
Kursor akan mengarahkan tepat ke lokasi panggilan metode
Selama dekompilasi, hubungan antara metode akan dibangun
Anda dapat mengklik dua kali di mana saja di panel untuk mendekompilasi dan membangun hubungan panggilan dan presentasi metode baru
Harap dicatat: Jika Anda menghadapi situasi di mana Anda tidak dapat mendekompilasi, Anda perlu memuat file jar yang benar
Misalnya, saya tidak dapat mendekompilasi javax.naming.Context karena saya tidak bergabung dengan file rt.jar , jika Anda bergabung, itu dapat didekompilasi secara normal
Anda dapat menggunakan Ctrl+F untuk mencari kode dan mengedit
Anda dapat mengklik opsi apa pun dan detail metode akan ditampilkan berikutnya
Anda dapat mengklik kanan untuk mengirim opsi ke rantai. Anda dapat memahami tautan sebagai favorit atau catatan. Dalam rantai, Anda juga dapat mengklik dua kali dekompilasi, dan kemudian menampilkan hubungan panggilan metode baru, atau menampilkan detailnya secara berdiri sendiri. Jika opsi dalam rantai adalah sesuatu yang tidak Anda inginkan, Anda dapat mengklik kanan untuk menghapus opsi dari rantai
Oleh karena itu, Anda dapat membangun rantai panggilan yang hanya menjadi milik Anda
谁调用了当前方法dan当前方法调用了谁semua metode di mana hubungan antara metode ini juga dapat didekompilasi, klik untuk melihat detailnya, klik kanan untuk bergabung dengan rantai
Anda dapat melihat kode byte kelas saat ini dengan satu klik

(1) Apa hubungan antara metode
class Test {
void a (){
new Test (). b ();
}
void b (){
Test . c ();
}
static void c (){
// code
}
} Jika metode saat ini b
Siapa yang Menyebut Metode Saat Ini: Test Kelas a Metode
Siapa yang Menelepon Metode Saat Ini: Metode Test Kelas c
(2) Cara memecahkan masalah implementasi antarmuka
class Demo {
void demo (){
new Test (). test ();
}
}
interface Test {
void test ();
}
class Test1Impl implements Test {
@ Override
public void test () {
// code
}
}
class Test2Impl implements Test {
@ Override
public void test () {
// code
}
} Sekarang kami memiliki data Demo.demo -> Test.test , tetapi sebenarnya itu adalah Demo.demo -> TestImpl.test .
Jadi kami menambahkan aturan baru: Test.test -> Test1Impl.test dan Test.test -> Test2Impl.test .
Pertama pastikan bahwa data tidak hilang, maka kita dapat menganalisis kode yang didekompilasi secara manual sendiri
Demo.demo -> Test.testTest.test -> Test1Impl.test / Test.test -> Test2Impl.test(3) Cara menyelesaikan hubungan warisan
class Zoo {
void run (){
Animal dog = new Dog ();
dog . eat ();
}
}
class Animal {
void eat () {
// code
}
}
class Dog extends Animal {
@ Override
void eat () {
// code
}
}
class Cat extends Animal {
@ Override
void eat () {
// code
}
} Zoo.run -> dog.cat bytecode adalah INVOKEVIRTUAL Animal.eat ()V , tetapi kami hanya memiliki aturan ini Zoo.run -> Animal.eat , dan Zoo.run -> Dog.eat hilang
Dalam hal ini kami menambahkan aturan baru: Animal.eat -> Dog.eat dan Animal.eat -> Cat.eat
Pertama pastikan bahwa data tidak hilang, maka kita dapat menganalisis kode yang didekompilasi secara manual sendiri
Zoo.run -> Animal.eatAnimal.eat -> Dog.eat / Animal.eat -> Cat.eat Proyek ini dikembangkan menggunakan ide JetBrains. Terima kasih kepada JetBrains karena telah memberi saya lisensi gratis, yang merupakan dukungan kuat bagi saya.