本記事は学習用です。作成には ChatGPT と GitHub Copilot を使用しています。
1. 導入:何を扱うか(定義と目的)
DLLインジェクション(DLL Injection)とは、別プロセスのアドレス空間に任意の DLL(Dynamic Link Library)を読み込み、その DLL 内のコードを対象プロセスの文脈で実行させる手法である。
用語定義:
- DLL(Dynamic Link Library):Windows で共有される実行可能モジュール(PE 形式)。動的にロードして関数を呼び出すことを前提とする。
- プロセスインジェクション(Process Injection):別プロセスのアドレス空間でコードを実行するための総称(DLL インジェクションはその一手法)。(picussecurity.com)
理由・重要性:
- 正常用途:デバッガやプロファイラ、互換レイヤ(例:API フックで動作監視)などで利用される。
- 悪用:マルウェアはプロセスの信頼性を悪用して検知を逃れたり、権限昇格や永続化を目的に DLL インジェクションを多用する。これにより防御側は検出と対応が難しくなる。(Apriorit)
2. 背景と脅威モデル
背景:Windows の設計上、プロセス間でメモリ操作やスレッド生成が許可されているため、DLL を任意にマッピングする方法が複数存在する。API フックやグローバルフックは Windows 標準の仕組みを使った「合法的に見える」注入を可能にする。(Microsoft Learn)
攻撃者の典型的目標:
- セキュリティ製品回避(アンチウイルスのプロセスに寄生して検出を避ける)
- キーロガーや情報窃取(ブラウザやメールクライアントにフックを適用)
- 永続化(次回起動時にもフックやペイロードを有効にする)(threathunterplaybook.com)
検出の難しさ:
- 正規プロセスでコードが実行されるため、ログやプロセス挙動だけでは判別が難しい。
- 高度な手法(リフレクティブインジェクション等)はディスクに DLL を置かずメモリ上で展開するため、フォレンジック検出が難しい。(すなのかたまり)
3. 代表的な手法(一覧と特徴)
以下は代表的な DLL インジェクション手法の一覧と簡潔な評価表。
| 手法 | 概要 | 実装に使う主な API | 利点 | 欠点 |
|---|---|---|---|---|
| CreateRemoteThread + LoadLibrary | 対象プロセスに LoadLibrary を呼ぶスレッドを作成 | OpenProcess, VirtualAllocEx, WriteProcessMemory, CreateRemoteThread, LoadLibrary | 実装が比較的単純で広く使われる | 標準 API の相関監視で検出されやすい |
| SetWindowsHookEx(グローバルフック) | フック DLL をグローバルに登録して他プロセスに乗せる | SetWindowsHookEx, LoadLibrary | GUI 系で合法的に見える場合あり | GUI スレッド依存など制約あり(用途が限定) |
| Reflective DLL Injection(リフレクティブ) | メモリ上で DLL を自己展開して呼び出す | VirtualAllocEx, WriteProcessMemory, CreateRemoteThread + 自家製ローダ | ディスクに残らず検出回避に有利 | 実装が複雑、互換性の課題 |
| Proxy DLL / DLL Search Order Hijacking | 正規 DLL と同名で置き換えさせる | ファイル配置(検索順序・サイドロード悪用) | 永続化に転用しやすい | ファイル操作が必要で検出されやすい |
(参考:手法の概観は複数の技術解説を参照してまとめた。(Apriorit))
4. 実装の流れ(CreateRemoteThread の概要)
ここでは最も教科書的な「CreateRemoteThread + LoadLibrary」の高レベルな流れのみを示す。実務で試す際は実験用 VM と被験体のみで行い、意図しない環境での実行は法律・規約違反となる点に留意する。
1) 対象プロセスのハンドル取得(必要最小権限)
2) 対象プロセスにメモリ確保(VirtualAllocEx)
3) DLL パスなど必要データの書き込み(WriteProcessMemory)
4) 対象プロセス側で LoadLibrary を呼ぶリモートスレッド作成(CreateRemoteThread)
5) DllMain により初期化・処理開始
補足:LoadLibraryA はユーザーモードの kernel32.dll に属する関数であり「カーネルにある」わけではない。実装上は ASLR の影響を受け得るため、厳密には対象プロセス内のモジュールベースを列挙してアドレスを解決する設計もある。(stackoverflow.com)
5. 高度なバリエーション(リフレクティブ等)と検出の観点
5.1 リフレクティブ DLL インジェクション
特徴:DLL イメージをメモリ上に書き込み、自前のローダ(PE リロケーション、インポート解決などを行う)で実行する。LoadLibrary やディスク上のファイルを必要としないため、EDR や AV(アンチウイルス)による静的/ファイルベース検出を回避しやすい。(すなのかたまり)
5.2 API フックを用いた技術(IAT/EAT/インラインフック)
- IAT 書き換えやインラインジャンプ書き換え(プロセス内の関数先を差し替える)など、DLL をロードせずに挙動を変える技術も存在する。これらはインジェクションと組み合わせられる。
5.3 防御(検出)観点のチェックリスト
- 不審なプロセスが他プロセスのハンドルを高権限で取得している(
OpenProcess)。 VirtualAllocEx/WriteProcessMemory/CreateRemoteThreadの連続利用が見られる。- スレッドの開始アドレスが
kernel32.dll!LoadLibraryAなどに向いている。 - メモリにロードされたモジュールがディスク上に対応ファイルを持たない(メモリ上のみのモジュール)。
- ログ活用(例):Sysmon の
ProcessAccessやCreateRemoteThreadなどを相関し、上記指標をハンティングに活用する。(threathunterplaybook.com)
6. 対策と実務での対応手順
6.1 開発者/運用向け対策(優先順)
- 最小権限の適用:プロセスに必要以上の権限を与えない。
- サインと整合性確認:重要コンポーネントはコード署名し検証する。
- プロセス保護:要件に応じてサンドボックスや PPL(Protected Process Light)等を検討する。
- EDR / Sysmon 等での検知ルール整備:
CreateRemoteThread/VirtualAllocEx等のシーケンス相関をルール化。 - ロギングとアラート:ハンドル操作、メモリ書き込み、DLL ロードイベントを集約して相関分析する。(threathunterplaybook.com)
6.2 インシデント対応手順(発見時)
- 影響範囲の特定:どのプロセスに注入されたか、タイムラインを特定。
- メモリダンプ取得と静的解析:メモリ上のモジュールをダンプし、PE ヘッダーやインポートテーブルを解析。
- ネットワーク通信の確認:注入 DLL が外部へ通信しているか(C2 の有無)。
- 復旧:感染プロセスの再起動、パッチ適用、ホスト隔離。
- ルート原因分析:侵入経路(ランサム/フィッシング/リモート脆弱性)を確定し再発防止。(PwC)
7. 実践的な注意点・よくある誤り
- 管理者権限なしで試す:一部 API は高権限が必要。実験は VM 上で行う。
- 正当用途と悪用の線引き:デバッグやツール開発目的でも、配布や実環境での利用は企業ポリシーや法律で制限される場合がある。
- 永続化と混同しない:DLL 注入自体は一時的で、永続化は別手法(サービス登録やスタートアップ、DLL ハイジャック等)で行われることが多い。
- 検出回避の過信:リフレクティブなどの高度手法でも、振る舞い分析やメモリの異常検出で見つかる可能性がある。防御は多層化が必須。(すなのかたまり)
8. まとめ(教育的ポイント)
- DLL インジェクションは仕組みを理解すれば正当ツールにも悪用にもなる重要な技術領域である。
- 学習項目(推奨):
VirtualAllocEx/WriteProcessMemory/CreateRemoteThread/GetProcAddress/LoadLibraryの挙動理解と、リフレクティブの仕組み(PE フォーマット、リロケーション、インポート解決)。(Stack Overflow) - 防御側はプロセス操作の監視・検知ルール整備・最小権限の適用を実施することが実務上の優先事項である。(threathunterplaybook.com)
9. 付録(API 要約)
| API | 目的 |
|---|---|
| OpenProcess | 対象プロセスのハンドル取得 |
| VirtualAllocEx | 対象プロセスにメモリ確保 |
| WriteProcessMemory | 対象プロセスにデータ書き込み |
| CreateRemoteThread | 対象プロセスでスレッド実行(LoadLibrary 呼び出し) |
| SetWindowsHookEx | グローバル/ローカルフック登録と DLL 搭載 |
A. 参考サイト
- Microsoft Learn — フックの使用(
SetWindowsHookEx等、DLL 配置の要件) - Apriorit — DLL インジェクション技法の概観と解説
- すなのかたまり — Reflective DLL Injection の概説
- Threat Hunter Playbook — CreateRemoteThread を用いたハンティングのノートブック
- Picus — MITRE ATT&CK T1055.001(DLL Injection)解説

コメント