xAnalyzer は、 @mrexodia による x86/x64 x64dbg デバッガー用のプラグインです。このプラグインは @mrfearless による APIInfo Plugin に基づいていますが、いくつかの改良と追加が行われています。 xAnalyzer は、デバッグされたアプリケーションの静的コードに対してさまざまな種類の分析を実行して、より多くの追加情報をユーザーに提供できます。このプラグインは、関数定義、引数、データ型、その他の補足情報を追加する広範な API 関数呼び出し検出を作成します。これは、OllyDbg 分析エンジンで得られる情報に近いものであり、ユーザーにとってさらに理解しやすいものになります。デバッグタスクを開始する直前のユーザー。
主な機能と改善点には次のようなものがあります。
拡張関数呼び出し分析 (約 200 の DLL からの 13,000 以上の API 定義)
定義済みおよび汎用の関数、引数、データ型、および追加のデバッグ情報の認識。
自動ループ検出。
ユーザー管理の定義ファイル
xAnalyzer の前
xAnalyzer 後
バイナリの最新リリースをここからダウンロードしてください
x64dbg の最新バージョンをダウンロードする
apis_def.zipを解凍します。
xAnalyzer.dp32/xAnalyzer.dp64およびapis_defフォルダーを x64dbg のそれぞれのプラグイン ディレクトリにコピーします。
メインの x64dbg ウィンドウの「 Plugins 」メニュー、または Disasm ウィンドウの 2 番目のメニューで「 xAnalyzer 」エントリを探します。
xAnalyzer には、エクスペリエンスをさらにパーソナライズし、必要なときに必要な方法で使用できるように、いくつかのオプションから選択できます。プラグインのオプションは次のとおりです。
自動分析: このオプションが ON の場合、プラグインは、デバッガーでのロード時に実行可能コードがエントリ ポイントに到達するたびに、実行可能コードに対して完全な自動分析を開始します。このオプションを使用すると、x64dbg での OllyDbg の初期分析動作にさらに近づけることができます。
Extended Analysis : このオプションは、xAnalyzer にデバッグされた実行可能ファイルのコード セクション全体に対して拡張分析を強制します。警告!!!このオプションを有効にすると、分析プロセスが完了するまでにさらに多くの時間とリソースがかかる可能性があり、また、セクションのサイズとデバッグされた実行可能静的逆アセンブリに追加される追加データの量に応じて、x64dbg によって大量の RAM メモリが使用される可能性があります。
未定義の関数を分析する: このオプションを選択すると、xAnalyzer は、API 定義ファイルで定義されていないすべての API 呼び出し/関数に対して汎用の分析と引数の型を使用し、次のような呼び出しも使用します。
CALL {REGISTER}
CALL {REGISTER + DISPLACEMENT}
CALL {DYNAMIC_POINTER}
xAnalyzer には、実行可能ファイルを操作するときに選択できるコマンドとメニュー オプションがいくつかあります。
x64dbg の逆アセンブリ ウィンドウでいくつかの命令を選択し、このメニューを選択すると、選択した行に対して高速分析が行われます。このオプションを起動するためにコマンドxanalselectionを使用したり、x64dbg GUI で独自のホットキーを設定したりすることもできます。
何らかの機能の途中にいる場合は、このメニュー エントリを使用して、その機能全体またはその機能のみを分析できます。 xAnalyzer は、選択した 1 つの命令を参照として受け取り、そこからコード ブロック内のすべての行を処理します。コマンドxanal 関数を使用してこのタイプの分析を開始したり、x64dbg GUI で独自のホットキーを設定したりすることもできます。
このコマンドは、モジュール全体の完全な分析を開始します。この機能では、使用する分析の深さに関して拡張分析オプションが考慮されます。コマンドxanal module を使用して実行したり、x64dbg GUI で独自のホットキーを設定したりすることもできます。
このような場合、これらのメニューはすべて、前のコマンドの動作とは逆のことを行います。コードの一部または必要に応じて実行可能ファイル全体から分析の余分な情報を削除したい場合。コマンドxanalremoveselection/function/module を使用することもできます。
xAnalyzer には API 定義ファイルの拡張可能なシステムがあり、これらのファイルはフォルダー「api_def」および「api_def/headers」に存在します。これらのフォルダーには、.ini 構造と次の標準を持つすべてのファイルが含まれている必要があります。
" filename ": これは、API 関数が配置されているモジュールの名前です。
" filename.h ": これは型データ (フラグと列挙型) 関連情報を含むヘッダーです。
「 .api 」拡張子: それが定義ファイルであることを指定します。他の拡張子は認識されません (kernel32.api、shell32.api など)。
これらすべての ini ファイルには、関数のプロトタイプ、引数の型など、プラグインの重要な情報が含まれています。この情報はすべて、静的コードに追加情報を設定するために xAnalyzer によって使用されます。これらのファイルのいずれかの単一エントリは次のようになります。
ファイル user32.api
[MessageBox]
1=HANDLE hWnd
2=LPCTSTR lpText
3=LPCTSTR lpCaption
4=[MessageBoxType] uType
ParamCount=4
Header=shell.h.api;
@=MessageBox
ファイルshell.h.api
[MessageBoxType]
TypeDisplay=UINT
Base=UINT
Type=Flag
Const1=MB_ABORTRETRYIGNORE
Value1=0x00000002
Const2=MB_CANCELTRYCONTINUE
Value2=0x00000006
Const3=MB_HELP
Value3=0x00004000
Const4=MB_OK
Value4=0x00000000
Const5=MB_OKCANCEL
...
括弧内の引数は、これが特定のデータ型 (列挙型またはバイナリ フラグ) であり、これがキー " Header " で指定された適切な .h ヘッダー ファイルで定義されることを意味します。
ヘッダー ファイルに関しては、スキームはほとんど同じですが、「 TypeDisplay 」などのいくつかのキーが存在するだけです。これは、dbg コメントに表示する適切なデータ型を指定します。次に「 Base 」が来ます。これは、メインエントリで使用される基本データ型を指します。リンクされたデータ型がある場合、これは次のように括弧内にあります。良い。 「 Type 」キーはデータ構造のタイプであり、「Flag」または「Enum」になります。最後に、すべての変数名と値が表示されます。
特定の API 呼び出し定義が検出されない、または xAnalyzer によって正しく検出されないことがわかった場合は、その API 呼び出し定義が定義ファイルに存在しないか、正しく定義されていないことを意味する可能性があります。そのため、この場合は追加または変更を含めて行うことができます。同じ構造に従っている限り、欠落している関数や引数は 100% カスタマイズ可能です。
関数内のジェネリック引数を使用した最初の未定義呼び出しは、その前にジャンプがない限り処理されません。これは、関数プロローグ命令を不正に使用することなく、使用する引数の数を知る方法がないためです。文書化された呼び出しのみが、ジャンプが主導する関数または未定義関数の先頭で処理されます。
一部の「珍しい」関数にはジャンプ間に引数があるため、プラグインの実際の設計 (関数引数間にジャンプがない) によれば、ジャンプが見つかるたびにスタック内の命令がクリーンアップされるため、これらの呼び出しは処理されません。
ネストされた呼び出しは、次の場合にのみ正しく機能します。
1-) 内部呼び出しが定義されている
2-) 内部の未定義呼び出しが、外部呼び出しで必要な引数以上のスタックの引数を取らない場合
関数内のループ (関数境界のプロローグ/RET) のみを検出します。関数のコードの途中に RET が含まれている場合、関数の終了として検出され、ループ スタックがクリアされます。
デバッグ中の実行可能ファイルの名前に複数のドットが含まれている場合、分析が失敗する可能性がある
内部に非条件ジャンプを含むセクションの誤ったループ検出 (#7 を参照)
ネストされた引数行 (xAnalyzer はネストされた引数をサポートしていますが、x64dbg は現時点ではサポートしていません)
エントロピー分析を追加する
リニアではなくフロー分析スキャン(トレースエミュレーション)
Case-Switch 検出
xアナライザー 2.5.4
- プロジェクトを VS2017 に更新しました
- スタック ポインターを含む引数命令を処理するときの問題を修正しました (x64 バージョン)。
- スタック ポインタに関連する誤った引数の順序を修正しました (x64 バージョン)。
- 未定義関数の引数認識でレジスタが別の引数として重複してしまうバグを修正(x64版)
- 未定義の呼び出し引数の認識を変更しました。デフォルトでは最大 4 つの未定義の引数のみを予測します (x86 バージョン)
- いくつかのコードのリファクタリング
xアナライザー 2.5.3
- 新しいバージョンの x64dbg での関数名の検出が修正されました
xアナライザー 2.5.2
- cip の代わりにモジュール分析に現在選択されている disasm 行を使用
- プラグインエントリの入力を一部変更しました
- いくつかのコードのリファクタリング
- コマンド「xanal/xanalremove exe」を「xanal/xanalremove module」に変更しました
xアナライザー 2.5.1
- mov 命令のバリエーションでのクラッシュを修正
xアナライザー 2.5.0
- 可能な関数呼び出し元の引数として [EBP+/-] 命令を削除しました
- 16 進数が推論されるため、すべての関数引数の値の接頭辞「0x」を削除しました。
- ポインター変数がポインターとしてではなく基本データ型として正しく表示される引数を修正しました
- 関数呼び出しの可能な引数としてスタック ポインターの使用法 (ESP) の認識を追加 (x86)
- ジェネリック/ベースデータ型名の代わりに、引数で正確なデータ型名の使用を追加しました。
- 関数スマート追跡機能の追加 (CALL {REGISTER}、CALL {POINTER} などの間接的な関数呼び出しのスマートな予測と認識)
- 関数ポインターの名前をパラメーターとして追加しました (検出された場合は、アドレスだけではなく関数名全体が使用されます)
xアナライザー 2.4.3
- x86 での MOV 命令の認識を追加しました。
- 「スタブ」接尾辞が付いた関数の認識を追加しました
- 「自動解析」のバグ修正(EPチェック条件を追加)
- デフォルトでチェックされている自動コメント/自動ラベルのオプションをクリアします
xアナライザー 2.4.2
- 引数フラグのコメントが MAX_COMMENT_SIZE を超えたときの BoF を修正
- 定義が 2 番目の .api ファイルにある場合の関数名の検索バグを修正しました
xアナライザー 2.4.1
- 新しいホットキー スキームを追加しました
- どの以前の分析データを消去するかを制御するための新しいオプションが追加されました。 (これにより、SwissArmyKnife などのマップ ローダー プラグインとシームレスに連携できるようになります)。
- 新しいコマンドを追加しました (古いコマンドは非推奨になりました)
xanalセレクション : セレクション分析を実行します
xanal function : 関数分析を実行します。
xanal exe : 実行可能ファイル全体の分析を実行します
xanalremoveselection : 以前の選択分析を削除します
xanalremove function : 以前の関数分析を削除します
xanalremove exe : 以前の実行可能ファイル全体の分析を削除します
xanal help : ログ ウィンドウにヘルプ テキストを表示します。
- 起動時に自動分析が起動しない問題を修正 (#18 を閉じる)
- 各種 API 定義ファイルを修正 (クローズ #17 )
xアナライザー 2.4
- スキームがわずかに変更された、新しく改良された API 定義ファイル (約 200 の DLL から 13,000 の API)
- 使用される各 API 定義引数の記号認識システム (1000 以上の enum データ型と 800 以上のフラグ)
- params データ型の認識 (BOOL、NUMERIC、NON-NUMERIC)
- VB「DllFunctionCall」スタブの検出
- 引数として渡される文字列がよりクリーンになりました (デバッガーのコメントのアドレス部分が削除されました)
- 実行概要がログウィンドウに追加されました
- ホットキー機能は x64dbg と競合するため削除されました (将来のリビジョンに組み込まれる予定)
- さまざまなバグを修正しました
xアナライザー 2.3.1
- 単一行を選択した状態で「選択の分析」メニューを起動すると、突然の dbg 例外が発生するバグを修正しました (@blaquee に感謝)
- プラグインをロードする前に、定義ファイルフォルダー「apis_def」とその中に定義ファイルが存在するか確認してください
- ホットキーを選択用の Ctrl+Shift+X と機能用の Ctrl+X に変更しました。
xアナライザー 2.3
- 「未定義関数を分析する」オプションを追加しました。 (デフォルトではオフ、定義ファイルにないものは分析されません)
- オプション「自動分析」を追加しました (デフォルトではオフ、デバッグされた実行可能ファイルの EP で起動時に分析を実行します)
- 追加機能「選択の分析」(選択された命令の分析を行い、複数の選択された呼び出しをサポートします)
- 「関数の分析」機能を追加(選択したアドレスから現在の関数を自動的に検出して分析します)
- 選択/関数/実行可能ファイルから「分析を削除」機能を追加しました
- コマンドショートカットを追加しました
- 新しいアイコンを追加しました
- .ini ファイルに保存設定を追加しました
- 16 進数の引数値の大文字化を追加しました
- 再構築された機能「実行可能ファイルの分析」 (現在の実行可能ファイルの完全な分析を行います)
- メニューの再構築
- 新しいバージョン情報ダイアログに、更新を追跡するためのバージョン番号が表示されるようになりました
- いくつかの小さなバグ修正
- 一部の API 定義ファイルを修正および統合しました
- 速度と安定性の向上
xアナライザー 2.2
- 分析進行状況インジケーターを追加しました
- 新しい分析深度モードを追加しました
- バックアップデータベースが存在しない場合にのみ自動分析が実行されるようになりました。
- バグ修正
xアナライザー 2.1
- 未定義関数および内部サブルーチンの汎用引数
- スマート関数のコメントと引数 (スタック上に引数を持つ関数のみが処理されます)。これにより、xAnalyzer は、実際の引数を使用してこれらの関数を処理してコメントするだけで、コードをよりわかりやすく表示できるようになります。
- CALL -> DYNAMIC_MEMORY -> API スキームによる間接的な関数呼び出しの検出
- CALL -> REGISTER/REGISTER + DISPLACEMENT -> API スキームによる間接関数呼び出しの検出
- CALL -> JMP -> JMP -> API スキームによる間接的な関数呼び出しの検出
- 自動ループ検出
- マイナーバグを修正
- コードの再配置
xアナライザー 2.0
- x64ビットのサポート
- API 呼び出し引数の順序変更を x64 ビットでサポート
- API 呼び出しで PDB ファイルの追加情報をサポート
- 直接/間接 API 呼び出しのサポート
- メインモジュールコードへの静的 API 関数呼び出しのサポート
- 定義ファイル内のいくつかの間違った API 呼び出し引数の順序を修正しました。より多くの呼び出しが検出され、適切にコメントされるようになりました
- いくつかの改善とより適切なコード記述
- さまざまなバグが解決されました
xアナライザー 1.2
- APIの定義ファイルを更新しました
- vc6+ 実行可能ファイルへのサポートを追加しました
xアナライザー 1.1
- ループ内で使用する前後に BASIC_INSTRUCTION_INFO 構造体を適切にクリーンアップしていないために、VC++ 実行可能ファイルに関する API 情報が表示されない問題を修正しました。
- APIの定義ファイルを追加・更新しました
- バグ修正
xアナライザー 1.0
- 初期リリース
PR だけでなく、バグ報告、ドキュメントなど、あらゆる種類の貢献を歓迎します。
以下の点に留意してください。
xAnalyzer プラグインをご利用いただきありがとうございます...そして皆さん、リバースをおめでとうございます!