Ce projet n'est plus maintenu
Il est recommandé d'utiliser la nouvelle version Jar Analyzer V2 https://github.com/jar-analyzer/jar-analyzer
Version de ligne de commande Jar-Analyzer
Version CLI Jar-Analyzer
Une brève introduction: https://mp.weixin.qq.com/s/rrx6x5m_28yrcqqcdxueeq
Il n'y a pas de document anglais, les étrangers s'il vous plaît le traduire vous-même
Un outil d'interface graphique pour analyser les packages jar , particulièrement adaptés aux audits de sécurité du code. Plusieurs fichiers jar peuvent être analysés en même temps et la méthode cible peut être facilement recherchée. Prend en charge le décompilation de bytecode et la construction automatique des relations entre les classes et les méthodes pour aider les chercheurs en sécurité Java à travailler plus efficacement.
Remarque: N'analysez pas trop grand ou trop de packages Jar , il est recommandé de ne pas dépasser 300M
Aller télécharger
Peut localiser avec précision la méthode (mise en évidence à gauche)

Vous pouvez localiser directement les chaînes (analyser les instructions liées au pool constant pour obtenir un positionnement précis)

Peut analyser directement les projets écrits par Spring Framework

Pourquoi ne pas choisir l'analyse IDEA : parce que IDEA ne prend pas en charge l'analyse des packages de pot de code passif
Prend en charge six méthodes de recherche:
LDC pour trouver l'emplacement exact)LDC pour trouver l'emplacement exact)Soutient la sélection de trois méthodes de décompilation:
Utilisez la personnalisation de la classe des composants JSyntaxPane (non officielle) pour afficher le code Java
(Une grande partie de la technologie noire est ajoutée à la bibliothèque https://code.google.com/archive/p/jsyntaxpane )
Prend en charge une recherche d'expression super forte, qui peut être combinée comme vous souhaitez rechercher des informations que vous souhaitez
| expression | paramètre | effet |
|---|---|---|
| nommer | Chaîne | Le nom de la méthode contient |
| startwith | Chaîne | Préfixe de la méthode |
| fin | Chaîne | Suffixe de méthode |
| classe de classe | Chaîne | Le nom de classe contient |
| type de retour | Chaîne | Type de retour de méthode |
| paramypemap | intring intring | Correspondance paramètre de la méthode |
| paramètre | int | Nombre de paramètres de méthodes |
| isStatique | booléen | La méthode est-elle statique? |
| issubclassof | Chaîne | Dont la sous-classe est-ce |
| Issuperclassof | Chaîne | Dont la classe parent est-ce |
| Hasanno | Chaîne | Annotation de la méthode |
| Hasclassanno | Chaîne | Annotation de classe |
| Hasfield | Chaîne | Champs de classe |
Avis:
returnType et paramTypeMap nécessitent des noms de classe complets similaires, tels que java.lang.String , et écrivez directement le type de base, par exemple, intisSubClassOf et isSuperClassOf nécessitent des noms de classe complets, tels que java.awt.ComponenthasAnno et hasClassAnno ne nécessitent pas le nom complet de la classe, écrivez-le simplement directement, par exemple, Controller 
La base de la recherche est la méthode, quelle méthode souhaitez-vous rechercher
Par exemple, je veux que la méthode de recherche commence par set et se terminer par value
# method
. startWith ( "set" )
. endWith ( "value" ) Par exemple, je souhaite rechercher des méthodes dont le nom de classe contient Context et le nom de la méthode contient lookup
# method
. nameContains ( "lookup" )
. classNameContains ( "Context" ) Par exemple, je souhaite rechercher une méthode qui renvoie un total de 3 paramètres du type Process et le deuxième paramètre est String
# method
. returnType ( "java.lang.Process" )
. paramsNum ( 3 )
. paramTypeMap ( 1 , "java.lang.String" ) Par exemple, nous voulons trouver toutes les sous-classes de javax.naming.spi.ObjectFactory (y compris les sous-classes de sous-classes, etc.)
Écrivez simplement les règles suivantes et le programme recherchera récursivement toutes les classes de parents
# method
. isSubClassOf ( "javax.naming.spi.ObjectFactory" ) Si vous souhaitez trouver toutes les classes parentales d'une certaine classe, utilisez simplement isSuperClassOf (notez le nom complet de la classe)
Notez que ce qui précède trouvera directement toutes les méthodes qui répondent aux critères, donc je suggère d'ajouter un filtrage
Par exemple
# method
. isSubClassOf ( "javax.naming.spi.ObjectFactory" )
. startWith ( "xxx" )
. paramsNum ( 0 ) Par exemple, nous voulons trouver toutes les méthodes de toutes les classes annotées par @Controller
Écrivez les règles suivantes
# method
. hasClassAnno ( "Controller" ) Par exemple, je souhaite trouver toutes les méthodes d'annotation @RequestMapping
# method
. hasAnno ( "RequestMapping" )De même, puisque toutes les méthodes qui répondent à la classe des critères sont trouvées, je suggère d'ajouter un peu plus de filtrage
Selon les conditions Swing RCE fournies par le maître en ligne:
Component (y compris les sous-classes indirectes)Alors nous écrivons une règle
# method
. startWith ( "set" )
. paramsNum ( 1 )
. paramTypeMap ( 0 , "java.lang.String" )
. isSubClassOf ( "java.awt.Component" )Résultats de la recherche

IMPORTANT: Veuillez utiliser Java 8+ pour exécuter (11 version recommandée et EXE de Java 11 JRE intégrée est fournie)
(Une meilleure police a été utilisée dans Java 11 , d'autres versions utilisent des polices par défaut)
(1) Étape 1: Ajouter un fichier jar (prend en charge le fichier jar unique et le répertoire jar )
Select Jar File pour ouvrir le fichier JARS'il vous plaît ne vous inquiétez pas, il faut un peu de temps pour analyser le fichier JAR
Remarque: veuillez attendre que la barre de progression soit pleine et que l'analyse soit terminée.
(2) Étape 2: entrez les informations que vous avez recherchées
Nous prenons en charge les entrées dans trois formats:
javax.naming.Context (par exemple)javax/naming/ContextContext (recherchera toutes les classes *.Context )Fournit un moyen d'entrer rapidement

Remarque: le contenu de recherche courant ici peut être personnalisé pour les suppléments
Créez un nouveau fichier search.txt dans le répertoire actuel, divisez le nom de classe et la méthode un par un avec # , par exemple
java.lang.Runtime#getRuntime
java.lang.String#equals
La recherche binaire ne reviendra que si elle existe ou non et ne renverra pas d'informations spécifiques.

(3) Étape 3: Vous pouvez double-cliquer pour décompiler
Le curseur pointera exactement vers l'emplacement de l'appel de la méthode
Pendant la décompilation, la relation entre les méthodes sera construite
Vous pouvez double-cliquez n'importe où sur le panneau pour décompiler et construire de nouvelles relations et présentations d'appels de méthode
Veuillez noter: si vous rencontrez une situation où vous ne pouvez pas décompiler, vous devez charger le bon fichier de pot
Par exemple, je ne peux pas décompiler javax.naming.Context parce que je n'ai pas rejoint le fichier rt.jar , si vous le rejoignez, il peut être décompilé normalement
Vous pouvez utiliser Ctrl+F pour rechercher du code et modifier
Vous pouvez cliquer sur n'importe quelle option et les détails de la méthode seront affichés ensuite
Vous pouvez cliquer avec le bouton droit pour envoyer l'option à la chaîne. Vous pouvez comprendre un lien en tant que favori ou enregistrement. Dans la chaîne, vous pouvez également double-cliquer sur le décompilé, puis afficher la nouvelle relation d'appel de méthode, ou afficher les détails sur une base autonome. Si une option dans la chaîne est quelque chose que vous ne voulez pas, vous pouvez cliquer avec le bouton droit pour supprimer l'option de la chaîne
Par conséquent, vous pouvez construire une chaîne d'appels qui n'appartient qu'à vous
谁调用了当前方法et当前方法调用了谁toute la méthode dans laquelle la relation entre la méthode peut également être décompilée, cliquez pour voir les détails, cliquez avec le bouton droit pour rejoindre la chaîne
Vous pouvez afficher le code d'octet de classe actuel en un seul clic

(1) Quelle est la relation entre les méthodes
class Test {
void a (){
new Test (). b ();
}
void b (){
Test . c ();
}
static void c (){
// code
}
} Si la méthode actuelle est b
Qui a appelé la méthode actuelle: la classe Test a méthode
Qui appelle la méthode actuelle: la méthode de la classe c Test C
(2) Comment résoudre le problème de l'implémentation de l'interface
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
}
} Nous avons maintenant Demo.demo -> Test.test , mais en fait, il s'agit de Demo.demo -> TestImpl.test .
Nous avons donc ajouté de nouvelles règles: Test.test -> Test1Impl.test et Test.test -> Test2Impl.test .
Assurez-vous d'abord que les données ne sont pas perdues, alors nous pouvons analyser manuellement le code décompilé par nous-mêmes
Demo.demo -> Test.testTest.test -> Test1Impl.test / Test.test -> Test2Impl.test(3) comment résoudre la relation de succession
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 est INVOKEVIRTUAL Animal.eat ()V , mais nous n'avons que cette règle Zoo.run -> Animal.eat , et Zoo.run -> Dog.eat règne est manquant
Dans ce cas, nous avons ajouté de nouvelles règles: Animal.eat -> Dog.eat et Animal.eat -> Cat.eat
Assurez-vous d'abord que les données ne sont pas perdues, alors nous pouvons analyser manuellement le code décompilé par nous-mêmes
Zoo.run -> Animal.eatAnimal.eat -> Dog.eat / Animal.eat -> Cat.eat Ce projet est développé à l'aide de JetBrains Idea. Merci à JetBrains de m'avoir fourni une licence gratuite, ce qui est un soutien solide pour moi.