Windows DLL名前解決の知識マップ(知識グラフ)
type: Dataset
description: この記事は、WindowsのDLL名前解決が単なるフォルダ探索順ではなく、DLL redirection・API set・SxSマニフェスト・loaded-module list・Known DLLsという前段ルールがファイルシステム探索より先に評価される仕組みであることを整理する。packaged appとunpackaged appでは検索順序の定義自体が異なり、current folderの位置はsafe DLL search modeの有効・無効で変わる。SetDllDirectoryはsafe DLL search modeを実質的に無効化するため、SetDefaultDllDirectoriesとLoadLibraryExの検索フラグ、AddDllDirectoryを組み合わせて検索空間を絞ることがDLLハイジャックの軽減につながる。フルパス指定でも依存DLLまでは自動固定されず、実際の読み込み元はProcess MonitorやListDLLsで確認する。

DLLの検索順序
type: Concept
definition: Windowsが実行ファイルの起動時に限らず、LoadLibrary系APIによる動的な読み込み時も含めて、DLL redirectionやKnown DLLsなどの前段ルールを経てDLLを探す、決まった順序でフォルダーを辿る仕組み。
alternative label: DLL探索順
uses: DLLリダイレクション(.local)
uses: API set
uses: SxSマニフェストリダイレクション
uses: loaded-module list
uses: Known DLLs
verified by: Process Monitor(procmon.exe)

DLLハイジャッキング(DLL preloading攻撃)
type: Concept
definition: フルパスなしの動的ロードと、攻撃者が支配できる検索対象ディレクトリの組み合わせによって、悪意あるDLLをアプリの権限で実行させる攻撃。
alternative label: DLL Hijacking
alternative label: Binary Planting

DLLリダイレクション(.local)
type: Concept
definition: 実行ファイルと同じ場所に「実行ファイル名.local」という目印を置くと、ローダーが実行ファイルのフォルダを先に見るようになる仕組み。
alternative label: DLL Redirection
alternative label: .local
alternative label: DotLocal

API set
type: Concept
definition: api-ms-win-...のような契約名で、実装している物理DLLを隠す仮想エイリアスの仕組み。
alternative label: Windows API sets
alternative label: api-ms-win-

SxSマニフェストリダイレクション
type: Concept
definition: マニフェストに記された依存関係に基づき、どのバージョンのDLLへ結び付ける(bind)かをローダーが判断する仕組み。
alternative label: SxS manifest redirection
alternative label: side-by-side

loaded-module list
type: Concept
definition: 同じモジュール名のDLLが既にそのプロセスのメモリにロードされていないかを、ファイルシステム検索より前に確認する仕組み。どのフォルダから読まれたかに関係なく、読み込み済みならそれが使われる。
alternative label: ロード済みモジュール一覧
verified by: ListDLLs
verified by: tasklist /m

Known DLLs
type: Concept
definition: Windowsがそのバージョンで既知とみなすDLLの一覧で、該当するDLLはシステム側のコピーが使われる。レジストリのKnownDLLsキーで確認できる。
alternative label: KnownDLLs

package dependency graph
type: Concept
definition: アプリのパッケージ本体と、パッケージマニフェストのDependenciesセクションに書かれた依存パッケージの集合。マニフェストに書かれた順に検索される。Windows 11 バージョン21H2以降、unpackaged appの検索順序にも含まれる。
alternative label: パッケージ依存グラフ

current folderの検索
type: Concept
definition: unpackaged appの標準検索順序に含まれる、プロセスのカレントディレクトリを対象にした検索段。safe DLL search modeの有効・無効で順位が変わる。
alternative label: カレントフォルダ検索
configured by: safe DLL search mode

safe DLL search mode
type: Concept
definition: 既定で有効な設定で、current folderを検索順序の後ろへ移す。レジストリ値SafeDllSearchModeを0にすると無効になる。
alternative label: SafeDllSearchMode

packaged app
type: Concept
definition: MSIXなどのパッケージとして配布・インストールされるアプリ。package dependency graphがより前段で効くなど、unpackaged appとは異なる検索順序が定義される。
alternative label: パッケージアプリ
alternative label: MSIXアプリ
incompatible with: unpackaged app
uses: package dependency graph

unpackaged app
type: Concept
definition: MSIXなどのパッケージを使わず、従来どおりフォルダに実行ファイルを置く形で配布されるアプリ。
alternative label: アンパッケージアプリ
alternative label: 従来型のデスクトップアプリ

SetDllDirectory
type: Concept
definition: DLL検索順序を変更するWin32 APIで、safe DLL search modeを実質的に無効化する副作用を持つ。親プロセスで呼ぶと子プロセスの検索順序にも影響し得る。
incompatible with: safe DLL search mode
not recommended for: DLL検索空間の絞り込み

SetDefaultDllDirectories
type: Concept
definition: 標準のDLL検索パスから脆弱になりやすいディレクトリを外し、プロセス既定の検索対象を限定するWin32 API。プロセス単位で効き、標準形へ戻すことはできない。
mitigates: DLLハイジャッキング(DLL preloading攻撃)

AddDllDirectory
type: Concept
definition: DLLの検索対象ディレクトリを1つ追加するWin32 API。LOAD_LIBRARY_SEARCH_USER_DIRSと組み合わせて使い、複数追加時の探索順は未規定。

LoadLibraryEx
type: Concept
definition: LOAD_WITH_ALTERED_SEARCH_PATHやLOAD_LIBRARY_SEARCH_*フラグでDLLの検索挙動を明示的に変更できるDLLロード用Win32 API。
alternative label: LoadLibraryExW
alternative label: LoadLibraryExA
uses: AddDllDirectory
recommended for: DLL検索空間の絞り込み

DLL検索空間の絞り込み
type: Concept
definition: SetDefaultDllDirectoriesやLoadLibraryExのLOAD_LIBRARY_SEARCH_*フラグ、AddDllDirectoryを組み合わせて、DLLの検索対象を明示的に絞り込む設計方針。
alternative label: 検索空間の明示的な限定
mitigates: DLLハイジャッキング(DLL preloading攻撃)

裸の名前によるLoadLibrary
type: Concept
definition: フルパスを指定せずモジュール名だけでLoadLibraryを呼び出す実装。攻撃者が支配できる検索対象ディレクトリと組み合わさるとDLLハイジャックにつながる。
alternative label: フルパスなしの動的ロード
may cause: DLLハイジャッキング(DLL preloading攻撃)

フルパス指定でのDLLロード
type: Concept
definition: LoadLibrary系APIにモジュール名だけでなく完全なパスを渡してDLLをロードする方式。裸の名前によるロードに起因するDLLハイジャックを軽減する。
alternative label: フルパス指定ロード
not recommended for: 依存DLLの解決

依存DLLの解決
type: Concept
definition: ロードされたDLLがさらに要求する依存DLLの名前解決。最初のDLLをフルパス指定でロードしても、依存DLLはモジュール名だけで検索される扱いになり自動的には固定されない。
alternative label: 依存DLL解決

DllImportSearchPath(.NET)
type: Concept
definition: .NETのP/InvokeやNativeLibrary.Loadで、DLLの検索先を限定する属性・パラメーター。値はLOAD_LIBRARY_SEARCH_*フラグに対応する。
alternative label: DefaultDllImportSearchPaths
uses: LoadLibraryEx

Process Monitor(procmon.exe)
type: Concept
definition: ファイルI/O・レジストリ・プロセス/スレッド活動をリアルタイムに監視できるSysinternalsのツール。Advanced Outputを有効にすると、IRPやファストI/Oのカーネル側の語彙で操作を表示する。
alternative label: Procmon
alternative label: Process Monitor

ListDLLs
type: Concept
definition: プロセス横断で、どのDLLがどこから読み込まれているかをコマンドラインで確認できるSysinternalsのツール。
alternative label: Sysinternals ListDLLs

tasklist /m
type: Concept
definition: 指定したモジュールを読み込んでいるプロセスの名前とPIDを一覧するWindowsのコマンド。
alternative label: tasklist

subject: DLLの検索順序
predicate: uses
object: DLLリダイレクション(.local)
description: DLL名前解決は、ファイルシステム検索の前段ルールの1つとしてDLL redirectionを評価する
evidence: dynamic-link-library-search-order
verified at: 2026-08-01
certainty: established

subject: DLLの検索順序
predicate: uses
object: API set
description: DLL名前解決は、ファイルシステム検索の前段ルールの1つとしてAPI setによる契約名から実装DLLへの変換を評価する
evidence: dynamic-link-library-search-order
verified at: 2026-08-01
certainty: established

subject: DLLの検索順序
predicate: uses
object: SxSマニフェストリダイレクション
description: DLL名前解決は、ファイルシステム検索の前段ルールの1つとしてSxSマニフェストによるバージョンbindingを評価する
evidence: dynamic-link-library-search-order
verified at: 2026-08-01
certainty: established

subject: DLLの検索順序
predicate: uses
object: loaded-module list
description: DLL名前解決は、ファイルシステム検索の前段ルールの1つとして同名モジュールが既にロード済みかを確認する
evidence: dynamic-link-library-search-order
verified at: 2026-08-01
certainty: established

subject: DLLの検索順序
predicate: uses
object: Known DLLs
description: DLL名前解決は、ファイルシステム検索の前段ルールの1つとしてKnown DLLsへの該当を確認する
evidence: dynamic-link-library-search-order
verified at: 2026-08-01
certainty: established

subject: DLLの検索順序
predicate: uses
object: package dependency graph
description: Windows 11 バージョン21H2以降、unpackaged appの検索順序にもpackage dependency graphが前段ルールとして含まれる
evidence: dynamic-link-library-search-order
verified at: 2026-08-01
certainty: context-dependent

subject: current folderの検索
predicate: configuredBy
object: safe DLL search mode
description: current folderが検索順序の何番目に来るかは、safe DLL search mode(レジストリ値SafeDllSearchMode)の有効・無効で変わる
evidence: dynamic-link-library-search-order
verified at: 2026-08-01
certainty: established

subject: packaged app
predicate: incompatibleWith
object: unpackaged app
description: packaged appとunpackaged appでは検索順序の定義自体が異なり、同じ実行形態が両方に同時に該当することはない
evidence: dynamic-link-library-search-order
verified at: 2026-08-01
certainty: established

subject: packaged app
predicate: uses
object: package dependency graph
description: packaged appではpackage dependency graphがより前段で効き、unpackaged appとは検索の考え方自体が異なる
evidence: dynamic-link-library-search-order
verified at: 2026-08-01
certainty: established

subject: SetDllDirectory
predicate: incompatibleWith
object: safe DLL search mode
description: SetDllDirectoryはsafe DLL search modeを実質的に無効化する振る舞いを持つ
evidence: dynamic-link-library-search-order
verified at: 2026-08-01
certainty: established

subject: SetDefaultDllDirectories
predicate: mitigates
object: DLLハイジャッキング(DLL preloading攻撃)
description: SetDefaultDllDirectoriesで標準検索パスから脆弱になりやすいディレクトリを外すことは、DLL preloading攻撃の軽減につながる
evidence: nf-libloaderapi-setdefaultdlldirectories
verified at: 2026-08-01
certainty: established

subject: AddDllDirectory
predicate: requires
object: SetDefaultDllDirectories
description: AddDllDirectoryで追加したディレクトリを「プロセス既定の検索」に含めるには、SetDefaultDllDirectoriesにUSER_DIRSを含めておく必要がある。ただしSetDefaultDllDirectoriesを呼ばなくても、LoadLibraryExの呼び出しごとにLOAD_LIBRARY_SEARCH_USER_DIRSフラグを指定すれば、追加したディレクトリをその呼び出しの探索対象にできる
evidence: nf-libloaderapi-adddlldirectory
verified at: 2026-08-01
certainty: context-dependent

subject: LoadLibraryEx
predicate: uses
object: AddDllDirectory
description: LoadLibraryExはLOAD_LIBRARY_SEARCH_USER_DIRSフラグと組み合わせて、AddDllDirectoryで追加したディレクトリを探索範囲に含める
evidence: nf-libloaderapi-loadlibraryexa
verified at: 2026-08-01
certainty: established

subject: SetDllDirectory
predicate: notRecommendedFor
object: DLL検索空間の絞り込み
description: SetDllDirectoryは検索順序を変えるだけでなくsafe DLL search modeを実質的に無効化するため、検索空間を絞る安全側の設計に使うのは推奨されない
evidence: dynamic-link-library-search-order
verified at: 2026-08-01
certainty: established

subject: LoadLibraryEx
predicate: recommendedFor
object: DLL検索空間の絞り込み
description: LOAD_LIBRARY_SEARCH_*フラグで探索範囲を明示的に絞るLoadLibraryExは、安全側の検索空間設計に推奨される
evidence: nf-libloaderapi-loadlibraryexa
verified at: 2026-08-01
certainty: established

subject: DLL検索空間の絞り込み
predicate: mitigates
object: DLLハイジャッキング(DLL preloading攻撃)
description: 検索空間を明示的に絞り、current folderや不用意なPATH依存を避けることが、DLL preloading攻撃を避ける基本形になる
evidence: dynamic-link-library-security
verified at: 2026-08-01
certainty: established

subject: 裸の名前によるLoadLibrary
predicate: mayCause
object: DLLハイジャッキング(DLL preloading攻撃)
description: フルパス指定なしの動的ロードと、攻撃者が支配できる検索対象ディレクトリの組み合わせがDLL preloading攻撃やbinary planting攻撃につながる
evidence: dynamic-link-library-security
verified at: 2026-08-01
certainty: established

subject: フルパス指定でのDLLロード
predicate: mitigates
object: DLLハイジャッキング(DLL preloading攻撃)
description: DLLをフルパス指定でロードすることは、裸の名前によるロードに起因するDLLハイジャックの軽減につながる
evidence: dynamic-link-library-security
verified at: 2026-08-01
certainty: context-dependent

subject: フルパス指定でのDLLロード
predicate: notRecommendedFor
object: 依存DLLの解決
description: 最初のDLLをフルパス指定でロードしても依存DLLはモジュール名だけで検索される扱いになるため、依存DLLの解決先まで固定する手段としてフルパス指定だけに頼るのは推奨されない
evidence: dynamic-link-library-search-order
verified at: 2026-08-01
certainty: established

subject: DllImportSearchPath(.NET)
predicate: uses
object: LoadLibraryEx
description: .NETのDllImportSearchPath属性の値は、LoadLibraryExのLOAD_LIBRARY_SEARCH_*フラグに対応する
evidence: nf-libloaderapi-loadlibraryexa
verified at: 2026-08-01
certainty: established

subject: DLLの検索順序
predicate: verifiedBy
object: Process Monitor(procmon.exe)
description: 実際にどのフォルダからDLLが読まれたかは、Process MonitorのResult列(NAME NOT FOUND/SUCCESS)を追うことで確認できる
evidence: procmon
verified at: 2026-08-01
certainty: established

subject: loaded-module list
predicate: verifiedBy
object: ListDLLs
description: 同名DLLが別フォルダから既にロード済みかどうかは、ListDLLsやProcess Explorerのモジュール一覧で確認できる
evidence: listdlls
verified at: 2026-08-01
certainty: established

subject: loaded-module list
predicate: verifiedBy
object: tasklist /m
description: 指定したモジュールを読み込んでいるプロセスは、tasklist /mで一覧できる
evidence: tasklist
verified at: 2026-08-01
certainty: established