
Windows実行ファイルにおけるDLL検索順序ハイジャック候補を発見するための自動スキャナ。インポートテーブルの解析、ランタイムモジュールの列挙、Microsoft Detoursを介したAPIフッキングを特長とします。
DLL Hijack SCanner - DLL 検索順序ハイジャックの候補を発見し自動化するためのツール
このリポジトリには、ツール (DLLHSC) の Visual Studio プロジェクトファイル、API フック機能 (detour) のプロジェクトファイル、ペイロードのプロジェクトファイル、さらに x86 および x64 アーキテクチャ用のコンパイル済み実行ファイル (このリポジトリのリリースセクション) が含まれています。コードは Visual Studio Community 2019 で作成およびコンパイルされました。
ソースからツールをコンパイルする場合は、DLLHSC、detour、payload の各プロジェクトをコンパイルする必要があります。DLLHSC はこのツールのコア機能を実装します。detour プロジェクトは API をフックするための DLL を生成します。payload プロジェクトは、テスト対象の実行ファイルが検索順序ハイジャックを介してロードできるかどうかを確認するための概念実証として使用される DLL を生成します。生成されたペイロードは、DLLHSC および detour と同じディレクトリに配置し、x86 アーキテクチャでは payload32.dll、x64 アーキテクチャでは payload64.dll という名前にする必要があります。
このツールは以下の3つの動作モードを実装しています。
実行可能イメージをメモリにロードし、インポートテーブルを解析した後、インポートテーブルに含まれるすべての DLL をペイロード DLL に置き換えます。
ツールは、アプリケーションディレクトリ内に存在せず、WinSxS にも KnownDLLs にも属さないモジュール (DLL) のみをアプリケーションディレクトリに配置します。
ペイロード DLL は、実行時に C:\Users\%USERNAME%\AppData\Local\Temp\DLLHSC.tmp というファイルを作成し、実行の証明とします。ツールはアプリケーションを起動し、一時ファイルが存在するかどうかを確認することで、ペイロード DLL が実行されたかどうかを報告します。一部の実行ファイルは、ロードする DLL から関数をインポートするため、提供された DLL がこれらの関数をエクスポートできず、イメージの依存関係を満たせない場合、エラーメッセージボックスが表示されることがあります。ただし、メッセージボックスの表示は、依存関係が満たされていれば DLL がペイロード実行の良い候補となる可能性があることを示しています。この場合、追加の分析が必要です。これらのメッセージボックスのタイトルには、Ordinal Not Found または Entry Point Not Found という文字列が含まれる場合があります。DLLHSC はこれらの文字列を含むウィンドウを探し、表示され次第閉じて結果を報告します。
提供された実行可能イメージでプロセスを作成し、そのプロセスのアドレス空間にロードされているモジュールを列挙し、フィルタを適用した後に結果を報告します。
ツールは、システムディレクトリからロードされ、KnownDLLs に属さないモジュールのみを報告します。これらの結果は追加の分析を必要とするリードです。アナリストはその後、報告されたモジュールをアプリケーションディレクトリに配置し、アプリケーションが提供されたモジュールを代わりにロードするかどうかを確認できます。
Microsoft Detours を介して LoadLibrary および LoadLibraryEx API をフックし、ランタイムにロードされるモジュールを報告します。
スキャン対象のアプリケーションが LoadLibrary または LoadLibraryEx を呼び出すたびに、ツールは呼び出しをインターセプトし、要求されたモジュールをファイル C:\Users\%USERNAME%\AppData\Local\Temp\DLLHSCRTLOG.tmp に書き込みます。LoadLibraryEx が LOAD_LIBRARY_SEARCH_SYSTEM32 フラグを指定して呼び出された場合、ファイルへの出力は行われません。すべてのインターセプトが終了した後、ツールはファイルを読み取り、結果を表示します。さらに分析が必要なモジュールは、KnownDLLs レジストリキーに存在しないモジュール、システムディレクトリに存在しないモジュール、およびフルパスがないモジュール (これらのモジュールではローダーが通常の検索順序を適用します) です。
ソースからツールをコンパイルする場合は、Visual Studio Community 2019 で行うことを推奨します。ツールが正しく機能するためには、DLLHSC、detour、payload のプロジェクトを同じアーキテクチャ用にコンパイルし、同じディレクトリに配置する必要があります。payload プロジェクトから生成された DLL は、32ビットアーキテクチャの場合は payload32.dll、64ビットアーキテクチャの場合は payload64.dll に名前を変更する必要があることに注意してください。
このアプリケーションのヘルプメニューです。
NAME
dllhsc - DLL Hijack SCanner
SYNOPSIS
dllhsc.exe -h
dllhsc.exe -e <executable image path> (-l|-lm|-rt) [-t seconds]
DESCRIPTION
DLLHSC scans a given executable image for DLL Hijacking and reports the results
It requires elevated privileges
OPTIONS
-h, --help
display this help menu and exit
-e, --executable-image
executable image to scan
-l, --lightweight
parse the import table, attempt to launch a payload and report the results
-lm, --list-modules
list loaded modules that do not exist in the application's directory
-rt, --runtime-load
display modules loaded in run-time by hooking LoadLibrary and LoadLibraryEx APIs
-t, --timeout
number of seconds to wait for checking any popup error windows - defaults to 10 seconds
このセクションでは、DLLHSC の実行方法と報告される結果の例を示します。この目的のために、正規の Microsoft ユーティリティ OleView.exe (MD5: D1E6767900C85535F300E08D76AAC9AB) を使用しました。より良い結果を得るには、提供された実行可能イメージをそのインストールディレクトリ内でスキャンすることを推奨します。
フラグ -l は、提供された実行ファイルのインポートテーブルを解析し、フィルタを適用して、インポートされたモジュールをペイロード DLL をアプリケーションのカレントディレクトリに配置することで武器化しようと試みます。ペイロード DLL の依存関係 (エクスポート関数) が満たされない場合、スキャン対象の実行ファイルがエラーボックスを表示することがあります。その場合、エラーメッセージボックスが表示されます。DLLHSC はデフォルトで 10 秒間、メッセージボックスが開かれたかどうかを確認します (ユーザーが -t フラグで指定した秒数だけ確認します)。エラーメッセージボックスは、依存関係が満たされていればモジュールを武器化できることを示しています。
次のスクリーンショットは、OleView.dll がペイロード DLL をロードしたときに生成されたエラーメッセージボックスを示しています。

ツールは最大 10 秒間、または -t 秒間待機して、プロセスの初期化が完了し、メッセージボックスが生成されたことを確認します。その後、メッセージボックスを検出して閉じ、結果を報告します。

フラグ -lm は、提供された実行ファイルを起動し、KnownDLLs リストにも WinSxS の依存関係にも属さないロードされたモジュールを表示します。このモードは、ペイロードとして使用できる DLL のアイデアを得ることを目的としており、アナリストにリードを生成するためにのみ存在します。

フラグ -rt は、提供された実行可能イメージがプロセスとして起動されたときにそのアドレス空間にロードするモジュールを表示します。これは、Microsoft Detours を介して LoadLibrary および LoadLibraryEx API をフックすることで実現されます。

このツールに関するフィードバックは、GitHub Issues セクションをご利用ください。