DLL ファイル形式とは?
.dll 拡張子を持つファイルには、Microsoft Windows 内で共有される動的リンクライブラリが含まれています。.dll 形式は .exe ファイル と同じバイナリ構造(Portable Executable (PE) 形式)を使用しており、オフセット 0 のマジックバイト MZ と、DOS スタブヘッダーが指す PE\0\0 シグネチャによって識別されます。ただし、実行ファイルとは異なり、.dll を直接起動することはできず、ホストプロセスによってロードされる必要があります。
.dll 内のすべてのデータはメモリにロードされ、複数のプログラムで同時に使用できます。ライブラリは通常、ActiveX コントロール、コントロールパネルアプレット、デバイスドライバー、またはアイコンやフォントのリソースを保持します。ただし、これらの役割を果たすファイルは、COM コンポーネント用の .ocx やカーネルモードドライバー用の .sys など、異なる拡張子を持つことがよくあります。また、大規模なアプリケーションのモジュールコンポーネントとして使用され、プラグインとして特定の機能を提供することもあります。
ライブラリには以下が含まれる場合があります:
- サブプログラム、関数、プラグインのコード
- グラフィックスや文字列テーブルを含むデータ
- メニュー、ダイアログ、バージョン情報などの関連リソース
.dll 形式の仕様は .exe ファイルと同じであり、どちらも PE(64ビット Windows では PE32+)コンテナを使用しますが、ライブラリは単体で動作するプログラムではありません。呼び出し元のプログラム内では、ライブラリへの参照とロードは、必要になるまで遅延させることができます(遅延ロード)。.dll モデルはモジュール化されたアプリケーションアーキテクチャをサポートし、コード断片の再利用を促進し、メモリ使用量とディスクスペースの両方を削減します。.NET 用にコンパイルされたマネージド .dll ファイルは、標準の PE 構造に加えて CLR ヘッダーを持ち、ネイティブのマシンコードの代わりに MSIL バイトコードを含んでいます。
セキュリティと安全性
リスク: HIGHDLL は実行コードであり、マルウェアに悪用されやすい性質があります。悪意のある DLL は正当なプロセス内で実行されます(DLL ハイジャック/サイドローディング - アプリが最初に検索する場所に不正な DLL を配置する手法)。また、「DLL 修正」を謳うダウンロードサイトは、典型的なマルウェアや詐欺の経路です。ルール:サードパーティの「DLL ダウンロード」サイトから個別の DLL をダウンロードしないでください。DLL 欠落エラーは、アプリの再インストール、公式の Visual C++ Redistributable / DirectX ランタイムのインストール、または sfc /scannow の実行で修正してください。不明な DLL はデジタル署名(プロパティ → デジタル署名)を確認し、VirusTotal でスキャンしてください。System32 からランダムに DLL を削除すると Windows が壊れます。
形式の詳細
概要DLL ファイルを開くプログラム
技術的詳細
詳細仕様| バイナリ形式 | 32ビット Windows では PE (Portable Executable)、64ビット Windows では PE32+。 .exe と同じコンテナ構造 |
| マジックバイト | オフセット 0 に 4D 5A ("MZ")。DOS スタブフィールド e_lfanew (0x3C) に格納されたオフセットに "PE\0\0" (50 45 00 00) |
| DLL 識別フラグ | COFF Characteristics フィールドの IMAGE_FILE_DLL ビット (0x2000) により、同じ PE コンテナ内の EXE と DLL を区別 |
| MIME タイプ | application/vnd.microsoft.portable-executable |
| エクスポートメカニズム | Export Directory Table が関数を名前や序数でリスト化。呼び出し元は Export Address Table (EAT) を介して実行時アドレスを解決 |
| インポートメカニズム | Import Directory Table が必要な DLL と関数名または序数を宣言。Windows ローダーがロード時に Import Address Table (IAT) をパッチ |
| リンクモード | インポート .lib スタブを介した暗黙的(ロード時)リンク、または LoadLibrary() と GetProcAddress() を介した明示的(実行時)リンク |
| ASLR と再配置 | .reloc セクションがベース再配置テーブルを保持。Windows の ASLR は実行時に実際のロードアドレスをランダム化し、PE オプションヘッダーの優先 ImageBase を上書き |
| 共通セクション | .text (実行コード), .data (初期化済みデータ), .rdata (読み取り専用データとインポート), .rsrc (リソース), .reloc (ベース再配置) |
| 埋め込みリソース | .rsrc セクションに型指定されたリソース(RT_ICON, RT_DIALOG, RT_STRING, RT_VERSION, RT_MANIFEST)を格納。Resource Hacker などのツールで表示・編集可能 |
| アーキテクチャビルド | ターゲット CPU (x86, x64, ARM, ARM64) ごとに個別の DLL バイナリが必要。macOS の dylib と異なり、ファットバイナリは非サポート |
| マネージド .NET DLL | CLR でコンパイルされた DLL は、ネイティブマシンコードではなく MSIL/CIL バイトコードを指す IMAGE_COR20_HEADER を埋め込み。ILSpy や dotPeek でデコンパイル可能 |
| サイドバイサイド・アセンブリ | Windows XP 以降の WinSxS により、アプリケーションマニフェストファイルに従って、同じ DLL の複数のバージョンを 1 台のマシンに共存可能 |
| エントリポイント | DLL_PROCESS_ATTACH, DLL_THREAD_ATTACH, DLL_PROCESS_DETACH, DLL_THREAD_DETACH の 4 つのイベントでローダーから呼び出されるオプションの DllMain() 関数 |
| 遅延ロード | /DELAYLOAD リンカーオプションにより、エクスポートされた関数の最初の呼び出しまで DLL のロードを延期し、プロセスの起動時間を短縮 |
| リリース日 | 1985 (Windows 1.0, NE format); current PE format since Windows NT 3.1, 1993 |
| オープンスタンダード | はい · ロイヤリティフリー |
| 仕様書 | learn.microsoft.com |