このプロジェクトは維持されなくなりました
Jar Analyzer V2新しいバージョンを使用することをお勧めします
Jar-analyzerコマンドラインバージョン
Jar-analyzer CLIバージョン
簡単な紹介:https://mp.weixin.qq.com/s/rrx6x5m_28yrcqqcdxueeq
英語の文書はありません、外国人はそれを自分で翻訳してください
特にコードセキュリティ監査に適したjarパッケージを分析するためのGUIツール。複数のjarファイルを同時に分析でき、ターゲットメソッドを簡単に検索できます。 Javaセキュリティ研究者がより効率的に作業するのに役立つクラスとメソッド間の関係を自動的に構築することをサポートし、クラスとメソッド間の関係を構築します。
注:あまりにも大きすぎたり、 Jarパッケージが多すぎたりしないでください。300m 300M超えないことをお勧めします
ダウンロードに移動します
メソッドを正確に見つけることができます(左に強調表示されています)

文字列を直接見つけることができます(一定のプール関連の指示を分析して、正確なポジショニングを実現します)

Springフレームワークによって書かれたプロジェクトを直接分析できます

IDEA分析を選択してみませんか: IDEAパッシブコードJARパッケージの分析をサポートしていないため
6つの検索方法をサポートしています。
LDC指示を分析して正確な場所を見つける)LDC命令を分析して正確な場所を見つける)3つの逆コンパイル方法の選択をサポートします。
JSyntaxPaneコンポーネント(非公式)のクラスのカスタマイズを使用してJavaコードを表示する
(多くの黒い技術がライブラリに追加されますhttps://code.google.com/archive/p/jsyntaxpane )
超強力な表現検索をサポートします。これは、必要な情報を検索するように組み合わせることができます
| 表現 | パラメーター | 効果 |
|---|---|---|
| namecontains | 弦 | メソッド名が含まれます |
| 始めて | 弦 | メソッドプレフィックス |
| 終わりに | 弦 | メソッド接尾辞 |
| classnameContains | 弦 | クラス名が含まれます |
| returnType | 弦 | メソッドリターンタイプ |
| paramtypemap | int文字列 | メソッドパラメーター対応 |
| paramsnum | int | メソッドパラメーターの数 |
| isstatic | ブール | メソッドは静的ですか? |
| IssubClassof | 弦 | そのサブクラスはそれです |
| IssuperClassof | 弦 | その親クラスはそれです |
| Hasanno | 弦 | メソッドの注釈 |
| hasclassanno | 弦 | クラス注釈 |
| ハスフィールド | 弦 | クラスフィールド |
知らせ:
returnTypeとparamTypeMap 、 java.lang.Stringなどの同様の完全なクラス名を必要とし、たとえばintの基本タイプを直接書き込みます。isSubClassOfとisSuperClassOfには、 java.awt.Componentなどの完全なクラス名が必要ですhasAnnoとhasClassAnno完全なクラス名を必要としません。たとえば、 Controllerなど、直接書き込むだけです
検索の基礎は方法であり、どの方法を検索したいですか
たとえば、検索方法をsetで開始し、 valueで終了したい
# method
. startWith ( "set" )
. endWith ( "value" )たとえば、クラス名にContextが含まれている方法を検索し、メソッド名にlookupが含まれています
# method
. nameContains ( "lookup" )
. classNameContains ( "Context" )たとえば、 Processタイプの合計3つのパラメーターを返す方法を検索したいのですが、2番目のパラメーターはStringです
# method
. returnType ( "java.lang.Process" )
. paramsNum ( 3 )
. paramTypeMap ( 1 , "java.lang.String" )たとえば、 javax.naming.spi.ObjectFactoryのすべてのサブクラス(サブクラスのサブクラスなど)を見つけたいと思います。
次のルールを書くだけで、プログラムはすべての親クラスを再帰的に探します
# method
. isSubClassOf ( "javax.naming.spi.ObjectFactory" )特定のクラスのすべての親クラスを見つけたい場合は、 isSuperClassOf使用するだけです(完全なクラス名に注意してください)
上記は基準を満たすすべての方法を直接見つけることに注意するので、フィルタリングを追加することをお勧めします
例えば
# method
. isSubClassOf ( "javax.naming.spi.ObjectFactory" )
. startWith ( "xxx" )
. paramsNum ( 0 )たとえば、 @Controller controllerによって注釈が付けられたすべてのクラスのすべての方法を見つけたいと思います
次のルールを書いてください
# method
. hasClassAnno ( "Controller" )たとえば、 @RequestMapping RequestMappingAnnotationのすべての方法を見つけたい
# method
. hasAnno ( "RequestMapping" )同様に、Criteriaクラスを満たすすべての方法が見つかるため、さらにフィルタリングを追加することをお勧めします
オンラインマスターが提供するSwing RCE条件によると:
Componentサブクラスでなければなりません(間接サブクラスを含む)だから私たちはルールを書きます
# method
. startWith ( "set" )
. paramsNum ( 1 )
. paramTypeMap ( 0 , "java.lang.String" )
. isSubClassOf ( "java.awt.Component" )検索結果

重要: Java 8+を使用して実行してください(11の推奨およびEXEビルトインJava 11 JREが提供されます)
(より良いフォントがJava 11で使用され、他のバージョンはデフォルトのフォントを使用しています)
(1)ステップ1: jarファイルを追加します(単一のjarファイルとjarディレクトリをサポートします)
Select Jar File JARファイルを開きます心配しないでください、JARファイルを分析するのに少し時間がかかります
注:進行状況バーがいっぱいになり、分析が完了するまで待ってください。
(2)ステップ2:検索した情報を入力します
3つの形式で入力をサポートします。
javax.naming.Context (たとえば)javax/naming/ContextContext (すべての*.Contextクラスを検索します)すばやく入力する方法を提供します

注:ここの一般的な検索コンテンツは、サプリメント用にカスタマイズできます
現在のディレクトリに新しいsearch.txtファイルを作成し、クラス名と方法を#で1つずつ分割します。たとえば
java.lang.Runtime#getRuntime
java.lang.String#equals
バイナリ検索は、それが存在するかどうかにかかわらずにのみ返され、特定の情報を返しません。

(3)ステップ3:ダブルクリックして逆コンピールできます
カーソルはメソッドコールの場所を正確に指します
逆コンパイル中、メソッド間の関係が構築されます
パネルのどこにでもダブルクリックして、新しいメソッドコールリレーションシップとプレゼンテーションを逆コンパイルして構築できます
注:逆コンパイルできない状況に遭遇した場合は、正しいJARファイルをロードする必要があります
たとえば、 rt.jarファイルに参加しなかったため、 javax.naming.Contextを逆コンパイルすることはできません。
Ctrl+Fを使用してコードを検索して編集できます
任意のオプションをクリックすると、メソッドの詳細が次に表示されます
右クリックしてオプションをチェーンに送信できます。リンクをお気に入りまたはレコードとして理解できます。チェーンでは、逆コンパイルをダブルクリックしてから、新しいメソッドコール関係を表示するか、詳細をスタンドアロンベースで表示することもできます。チェーン内のオプションが不要なものである場合、右クリックしてチェーンからオプションを削除できます
したがって、あなただけに属するコールチェーンを構築できます
谁调用了当前方法と当前方法调用了谁。クリックして詳細を確認し、右クリックしてチェーンに参加してください
ワンクリックで現在のクラスバイトコードを表示できます

(1)メソッド間の関係は何ですか
class Test {
void a (){
new Test (). b ();
}
void b (){
Test . c ();
}
static void c (){
// code
}
}現在の方法がbの場合
現在の方法を呼び出した人:クラスaメソッドTest
現在の方法を呼び出している人: Testクラスcメソッド
(2)インターフェイスの実装の問題を解決する方法
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
}
}これで、 Demo.demo -> Test.testデータがありますが、実際にはDemo.demo -> TestImpl.testです。
そこで、新しいルールを追加しました: Test.test -> Test1Impl.test and Test.test -> Test2Impl.test追加しました。
最初にデータが失われないことを確認してから、自分で逆コンパイルコードを手動で分析できます
Demo.demo -> Test.testTest.test -> Test1Impl.test / Test.test -> Test2Impl.test(3)相続関係を解決する方法
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はINVOKEVIRTUAL Animal.eat ()Vですが、このルールZoo.run -> Animal.eat 、 Zoo.run -> Dog.eatルールはありません
この場合、新しいルールを追加しました: Animal.eat -> Dog.eat and Animal.eat -> Cat.eat追加しました
最初にデータが失われないことを確認してから、自分で逆コンパイルコードを手動で分析できます
Zoo.run -> Animal.eatAnimal.eat -> Dog.eat / Animal.eat -> Cat.eat このプロジェクトは、JetBrains Ideaを使用して開発されています。無料のライセンスを提供してくれたJetbrainsに感謝します。これは私にとって強力なサポートです。