Dieses Projekt wird nicht mehr aufrechterhalten
Es wird empfohlen, die neue Version Jar Analyzer V2 https://github.com/jar-analyzer/jar-analyzer zu verwenden
Jar-Analyzer-Befehlszeilenversion
Jar-Analyzer CLI-Version
Eine kurze Einführung: https://mp.weixin.qq.com/s/rrx6x5m_28yrcqqcdxueeq
Es gibt kein englisches Dokument, Ausländer, bitte übersetzen Sie es selbst
Ein GUI -Tool zur Analyse von jar -Paketen, insbesondere geeignet für Code -Sicherheitsaudits. Mehrere jar -Dateien können gleichzeitig analysiert werden und die Zielmethode kann einfach durchsucht werden. Unterstützt das Dekompeten von Bytecode und das automatische Aufbau von Beziehungen zwischen Klassen und Methoden, um Java -Sicherheitsforschern effizienter zu arbeiten.
Hinweis: Analysieren Sie nicht zu große oder zu viele Jar -Pakete, es wird empfohlen, 300M nicht zu überschreiten
Gehen Sie zum Download
Kann die Methode genau lokalisieren (links hervorgehoben)

Sie können Strings direkt lokalisieren (Anweisungen mit konstantem Pool analysieren, um eine präzise Positionierung zu erreichen)

Kann Projekte direkt analysieren, die nach Spring Framework geschrieben wurden

Warum wählen Sie eine IDEA aus: Weil IDEA die Analyse passiver Code -JAR -Pakete nicht unterstützt
Unterstützt sechs Suchmethoden:
LDC -Anweisungen, um den genauen Ort zu finden)LDC -Anweisung, um den genauen Ort zu finden)Unterstützt die Auswahl von drei Dekompilierungsmethoden:
Verwenden Sie die Klassenanpassung von JSyntaxPane -Komponenten (inoffiziell), um Java -Code anzuzeigen
(In der Bibliothek wird eine Menge schwarzer Technologie hinzugefügt https://code.google.com/archive/p/jsyntaxpane )
Unterstützt eine super starke Ausdrucksuche, die kombiniert werden kann, wenn Sie nach Informationen suchen möchten, die Sie möchten
| Ausdruck | Parameter | Wirkung |
|---|---|---|
| Namenskräfte | Saite | Methodenname enthält |
| Starten Sie | Saite | Methode Präfix |
| Endwith | Saite | Methodensuffix |
| klassifizieren | Saite | Klassenname enthält |
| Rückkehr | Saite | Methodenrückgabeart |
| Paramtypemap | int String | Methode Parameter Korrespondenz |
| Paramsnum | int | Anzahl der Methodenparameter |
| ist statisch | boolean | Ist die Methode statisch? |
| ISSUBCASSOF | Saite | Deren Unterklasse ist es |
| IssuperClassof | Saite | Deren Elternklasse ist es |
| Hasanno | Saite | Annotation der Methode |
| Hassclassanno | Saite | Annotation der Klassen |
| Hasfield | Saite | Klassenfelder |
Beachten:
returnType und paramTypeMap erfordern ähnliche vollständige Klassennamen wie java.lang.String und schreiben Sie den Basistyp direkt, z. B. intisSubClassOf und isSuperClassOf erfordern vollständige Klassennamen wie java.awt.ComponenthasAnno und hasClassAnno benötigen den vollständigen Klassennamen nicht. Schreiben Sie ihn einfach direkt, z. B. Controller 
Die Grundlage der Suche ist die Methode, nach welcher Methode Sie suchen möchten
Zum Beispiel möchte ich, dass die Suchmethode mit set beginnt und mit value endet
# method
. startWith ( "set" )
. endWith ( "value" ) Zum Beispiel möchte ich nach Methoden suchen, deren Klassenname Context und lookup enthält
# method
. nameContains ( "lookup" )
. classNameContains ( "Context" ) Zum Beispiel möchte ich nach einer Methode suchen, die insgesamt 3 Parameter des Process zurückgibt, und der zweite Parameter ist String
# method
. returnType ( "java.lang.Process" )
. paramsNum ( 3 )
. paramTypeMap ( 1 , "java.lang.String" ) Zum Beispiel möchten wir alle Unterklassen von javax.naming.spi.ObjectFactory (einschließlich Unterklassen von Unterklassen usw.) finden
Schreiben Sie einfach die folgenden Regeln, und das Programm wird rekursiv nach allen Elternklassen suchen
# method
. isSubClassOf ( "javax.naming.spi.ObjectFactory" ) Wenn Sie alle übergeordneten Klassen einer bestimmten Klasse finden möchten, verwenden Sie einfach isSuperClassOf (beachten Sie den vollständigen Klassennamen).
Beachten Sie, dass die oben genannten direkt alle Methoden finden, die die Kriterien erfüllen
Zum Beispiel
# method
. isSubClassOf ( "javax.naming.spi.ObjectFactory" )
. startWith ( "xxx" )
. paramsNum ( 0 ) Zum Beispiel möchten wir alle Methoden aller von @Controller kommentierten Klassen finden
Schreiben Sie die folgenden Regeln
# method
. hasClassAnno ( "Controller" ) Zum Beispiel möchte ich alle Methoden von @RequestMapping Annotation finden
# method
. hasAnno ( "RequestMapping" )In ähnlicher Weise empfehle ich, da alle Methoden, die die Kriterienklasse erfüllen, etwas mehr Filterung hinzufügen
Gemäß den Swing RCE -Bedingungen des Online -Meisters:
Component sein (einschließlich indirekter Unterklassen)Also schreiben wir eine Regel
# method
. startWith ( "set" )
. paramsNum ( 1 )
. paramTypeMap ( 0 , "java.lang.String" )
. isSubClassOf ( "java.awt.Component" )Suchergebnisse

WICHTIG: Bitte verwenden Sie Java 8+ zum Ausführen (11 empfohlene und EXE Version von integriertem Java 11 JRE wird bereitgestellt)
(Eine bessere Schriftart wurde in Java 11 verwendet, andere Versionen verwenden Standardschriften)
(1) Schritt 1: Fügen Sie jar -Datei hinzu (unterstützt die Einzel jar -Datei und jar -Verzeichnis).
Select Jar File , um die JAR -Datei zu öffnenBitte machen Sie sich keine Sorgen, es dauert ein wenig Zeit, um die JAR -Datei zu analysieren
HINWEIS: Bitte warten Sie, bis die Fortschrittsleiste voll ist und die Analyse abgeschlossen ist.
(2) Schritt 2: Geben Sie die von Ihnen gesuchten Informationen ein
Wir unterstützen Eingaben in drei Formaten:
javax.naming.Context (zum Beispiel)javax/naming/ContextContext (sucht nach allen *.Context -Klassen)Bietet eine Möglichkeit, schnell einzutreten

HINWEIS: Common -Suchinhalte hier können für Ergänzungsmittel angepasst werden
Erstellen Sie im aktuellen Verzeichnis eine neue search.txt -Datei, #
java.lang.Runtime#getRuntime
java.lang.String#equals
Die binäre Suche wird nur zurückgegeben, unabhängig davon, ob sie vorhanden sind oder nicht, und gibt bestimmte Informationen nicht zurück.

(3) Schritt 3: Sie können sich doppelklicken, um zu dekompilen
Der Cursor verweist genau auf den Ort des Methodenaufrufs
Während der Dekompilierung wird die Beziehung zwischen den Methoden konstruiert
Sie können überall auf dem Panel doppelklicken, um neue Methoden-Ruf-Beziehungen und Präsentationen zu dekompilieren und aufzubauen
Bitte beachten Sie: Wenn Sie auf eine Situation stoßen, in der Sie nicht dekompilieren können, müssen Sie die richtige JAR -Datei laden
Zum Beispiel kann ich javax.naming.Context nicht dekompilieren, da ich nicht der rt.jar -Datei beigetreten bin. Wenn Sie sie anschließen, kann sie normal dekompiliert werden
Sie können Ctrl+F verwenden, um nach Code zu suchen und zu bearbeiten
Sie können auf eine beliebige Option klicken und die Methodendetails werden als nächstes angezeigt
Sie können mit der rechten Maustaste klicken, um die Option an die Kette zu senden. Sie können einen Link als Favorit oder Aufzeichnung verstehen. In der Kette können Sie auch auf das Dekompile doppelklicken und dann die neue Methodenaufrufbeziehung anzeigen oder die Details eigenständig anzeigen. Wenn eine Option in der Kette etwas ist, das Sie nicht möchten, können Sie mit der rechten Maustaste klicken, um die Option aus der Kette zu löschen
Daher können Sie eine Anrufkette bauen, die nur Ihnen gehört
谁调用了当前方法und当前方法调用了谁alle Methoden auf, bei denen die Beziehung zwischen der Methode ebenfalls dekompiliert werden kann, klicken
Sie können den aktuellen Klassen -Byte -Code mit einem Klick anzeigen

(1) Wie ist die Beziehung zwischen den Methoden?
class Test {
void a (){
new Test (). b ();
}
void b (){
Test . c ();
}
static void c (){
// code
}
} Wenn die aktuelle Methode b ist
Wer nannte die aktuelle Methode: Test der Klasse a Methode
Wer nennt die aktuelle Methode: Test der Klasse c -Methode
(2) So lösen Sie das Problem der Schnittstellenimplementierung
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
}
} Jetzt haben wir Demo.demo -> Test.test , aber tatsächlich handelt es sich um Demo.demo -> TestImpl.test .
Also haben wir neue Regeln hinzugefügt: Test.test -> Test1Impl.test und Test.test -> Test2Impl.test .
Stellen Sie zunächst sicher, dass die Daten nicht verloren gehen. Dann können wir den dekompilierten Code manuell selbst analysieren
Demo.demo -> Test.testTest.test -> Test1Impl.test / Test.test -> Test2Impl.test(3) Wie man die Erbschaftsbeziehung auflöst
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.eat Zoo.run -> dog.cat bytecode wird invokevirtual animal.eat Zoo.run -> Animal.eat INVOKEVIRTUAL Animal.eat ()V
In diesem Fall haben wir neue Regeln hinzugefügt: Animal.eat -> Dog.eat und Animal.eat -> Cat.eat
Stellen Sie zunächst sicher, dass die Daten nicht verloren gehen. Dann können wir den dekompilierten Code manuell selbst analysieren
Zoo.run -> Animal.eatAnimal.eat -> Dog.eat / Animal.eat -> Cat.eat Dieses Projekt wird unter Verwendung von Jetbrains -Idee entwickelt. Vielen Dank an JetBrains, die mir eine kostenlose Lizenz zur Verfügung gestellt haben, was eine starke Unterstützung für mich ist.