データディクショナリ
次は、データディクショナリであるIMAGE_DATA_DIRECTORY構造体について解説します。IMAGE_DATA_DIRECTORY構造体の定義内容は次のとおりです。
typedef struct _IMAGE_DATA_DIRECTORY { DWORD RVA; DWORD Size; } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
RVAにはデータの場所をRVA(イメージベースからのオフセット)で指定します。Sizeにはデータのサイズをバイト単位で指定します。
データディクショナリは、一般的に次の16個の要素からなります(使用されていない要素もあります)。
IMAGE_DATA_DIRECTORY DataDirectory[16] | Export Table | エクスポート テーブルのアドレスとサイズ |
| Import Table | インポート テーブルのアドレスとサイズ | |
| Resource Table | リソース テーブルのアドレスとサイズ | |
| Exception Table | 例外テーブルのアドレスとサイズ | |
| Certificate Table | 属性認証テーブルのアドレスとサイズ | |
| Base Relocation Table | ベース再配置テーブルのアドレスとサイズ | |
| Debug | デバッグデータの開始アドレスとサイズ | |
| Architecture | アーキテクチャ固有データのアドレスとサイズ | |
| Global Ptr | グローバルポインタレジスタの相対仮想アドレス。この構造体のサイズメンバは0にセットされます | |
| TLS Table | スレッドローカルストレージ(TLS)テーブルのアドレスとサイズ | |
| Load Config Table | ロードコンフィグレーションテーブルのアドレスとサイズ | |
| Bound Import | バウンドインポートテーブルのアドレスとサイズ | |
| IAT | インポートアドレステーブルのアドレスとサイズ | |
| Delay Import Descriptor | 遅延インポート記述子のアドレスとサイズ | |
| Reserved |
おわりに
PEヘッダには、ターゲットマシン、アライメント情報、セクション管理情報、メモリサイズ情報などが格納されており、OSがプログラムをメモリにロードしてEXEファイルを実行する際には、必要なデータがこれらの情報に随時書き込まれています
PEヘッダ自体はIMAGE_NT_HEADERS32構造体によって定義されます。今回は、その詳細について一歩踏み込み、IMAGE_NT_HEADERS32構造体に定義されている、IMAGE_FILE_HEADER構造体、およびIMAGE_OPTIONAL_HEADER32構造体についての解説を行いました。少々、冗長的な解説になってしまいましたが、各メンバにどのような情報を定義すればよいか、確認できたでしょうか。
次回は、PEヘッダの後に配置されているセクションについて解説します。
