[ファイルヘッダー] ヘルプ

Microsoft Windows NT(tm)の実行(イメージ)ファイルおよび
オブジェクト ファイルの構造を規定するものです。
これらのファイルはそれぞれPortable Executable(PE)ファイル
およびCommon Object File Format(COFF)ファイルと呼ばれます。
「Portable Executable(ポータブルな実行形式)」という名前は、
この形式がアーキテクチャに固有のものでないことを示しています。


名前
機能説明
イメージ ファイル
実行ファイルは、.EXEファイルまたは.DLLファイルです。イメージ ファイルは
「メモリ上のイメージ」であると考えることができます。「イメージ ファイル」という
言葉は通常「実行可能ファイル」の代わりに使われます。というのは、後者はし
ばしば.EXEファイルだけを意味するからです。

オブジェクト ファイル
リンカへの入力として渡されるファイルです。リンカはイメージ ファイルを作成
し、今度はこれがローダへの入力として使われます。「オブジェクト ファイル」と
いう用語には必ずしもオブジェクト指向プログラミングとの関連があるわけでは
ありません。

RVA
相対仮想アドレス(Relative Virtual Address)。あるイメージ ファイルにおいて、
RVAは常に「いったんメモリにロードされた」項目のアドレスで、イメージ ファイ
ルのベース アドレスはそれから引かれます。項目のRVAは、ほとんど常にデ
ィスク上のそのファイル内の位置(ファイル ポインタ)と異なっています。
オブジェクト ファイル内では、RVAはあまり意味を持ちません。これは、メモリ
位置が割り当てられていないためです。この場合、RVAはセクション(下記参
照)内のアドレスとなります。これに対する再配置は、後で、リンク時に行われ
ます。単純化のために、コンパイラは各セクションの最初のRVAをゼロにセット
します。
仮想アドレス (VA)
イメージ ファイルのベース アドレスが引かれないことを除けばRVA(上記参
照)と同じです。このアドレスは「仮想アドレス」と呼ばれます。これは、Windows
NTが各プロセスのために、物理メモリとは独立の、個別の仮想アドレス空間を
作成するためです。ほとんどすべての目的で、仮想アドレスは単なるアドレスと
見なされます。仮想アドレスはRVAほど予測可能ではありません。これは、ロ
ーダがイメージをその望みの場所にロードするとは限らないためです。

ファイルポインタ
リンカ(オブジェクト ファイルの場合)やローダ(イメージ ファイルの場合)によ
って処理される前のファイル自体の内部における項目の位置。いいかえれば、
ディスク上に格納されているファイル内での位置。

タイムスタンプ
タイムスタンプはPE/COFFファイルの多数の箇所で、さまざまな目的のために
使用されます。しかし、それらのスタンプの形式は常に同じです。これはCのラ
ンタイム ライブラリの時間関数によって使われている形式です。
セクション
セクションは、PE/COFFファイル内でのコードまたはデータの基本単位です。
たとえば、オブジェクト ファイルの中では、すべてのコードを1つのセクションの
内部にまとめることができます。また、(コンパイラの動作によっては)各関数が
それだけで1つのセクションを占有することもできます。セクションの数が増え
ると、ファイルのオーバーヘッドが増えますが、リンカはコードをより選択的にリ
ンクできるようになります。セクションは、Intel(r) 8086アーキテクチャにおける
セグメントに似ているところがあります。セクション内の生データはすべて連続
してロードされなければなりません。さらに、イメージ ファイルは特別な用途を
持つ.tlsまたは.relocといった多数のセクションを持つことができます。

属性認証
属性認証は、検証可能なイメージをイメージ ファイルに結び付けるために使用
されます。ファイルに結び付けることのできるさまざまな種類の検証可能な文
がありますが、もっとも有用なものの1つで、記述が簡単なものは、ソフトウェア
製造元による、イメージのメッセージ ダイジェストがどのようなものになるはず
であるかを記述した文です。メッセージ ダイジェストはチェックサムに似ていま
すが、偽造は非常に困難です。したがって、もとのファイルと同じメッセージ ダ
イジェストを持つようにファイルを変更することは非常に困難です。この文は製
造元によって公開鍵暗号方式により、製造元によって作られたものであること
が検証されます。本文書では、属性認証をイメージ ファイルに挿入できるよう
にすることのほかは、属性認証の詳細については触れません。



図1と図2でMicrosoft PE実行形式
[PEヘッダー] ヘルプ[PEヘッダー] ヘルプ
およびMicrosoft COFFオブジェクトモジュール形式
[COFFフォーマット] ヘルプ[COFFフォーマット] ヘルプ を図解します。

                                  

名前

機能説明

イメージファイル

実行ファイルは、.EXEファイルまたは.DLLファイルです。イメージファイルは「メモリ上のイメージ」であると考えることができます。「イメージファイル」という言葉は通常「実行可能ファイル」の代わりに使われます。というのは、後者はしばしば.EXEファイルだけを意味するからです。

オブジェクトファイル

リンカへの入力として渡されるファイルです。リンカはイメージファイルを作成し、今度はこれがローダへの入力として使われます。「オブジェクトファイル」という用語には必ずしもオブジェクト指向プログラミングとの関連があるわけではありません。

RVA

相対仮想アドレスRelative Virtual Address 。あるイメージファイルにおいて、RVAは常に「いったんメモリにロードされた」項目のアドレスで、イメージファイルのベースアドレスはそれから引かれます。 項目のRVAは、ほとんど常にディスク上のそのファイル内の位置(ファイルポインタ)と異なっています。オブジェクトファイル内では、RVAはあまり意味を持ちません。これは、メモリ位置が割り当てられていないためです。この場合、RVA はセクション(下記参照)内のアドレスとなります。これに対する再配置は、後で、リンク時に行われます。単純化のために、コンパイラは各セクションの最初のRVA をゼロにセットします。

仮想アドレス(VA)

イメージファイルのベースアドレスが引かれないことを除けばRVA(上記参照)と同じです。このアドレスは「仮想アドレス」と呼ばれます。これは、 Windows NTが各プロセスのために、物理メモリとは独立の、個別の仮想アドレス空間を作成するためです。ほとんどすべての目的で、仮想アドレスは単なるアドレスと見なされます。仮想アドレスは RVAほど予測可能ではありません。これは、ローダがイメージをその望みの場所にロードするとは限らないためです。

ファイルポインタ

リンカ(オブジェクトファイルの場合)やローダ(イメージファイルの場合)によって処理される前のファイル自体の内部における項目の位置。いいかえれば、ディスク上に格納されているファイル内での位置。

タイムスタンプ

タイムスタンプはPE/COFFファイルの多数の箇所で、さまざまな目的のために使用されます。しかし、それらのスタンプの形式は常に同じです。これは Cのランタイムライブラリの時間関数によって使われている形式です。

セクション

セクションは、PE/COFFファイル内でのコードまたはデータの基本単位です。たとえば、オブジェクトファイルの中では、 すべてのコードを1 つのセクションの内部にまとめることができます。また、(コンパイラの動作によっては)各関数がそれだけで1 つのセクションを占有することもできます。セクションの数が増えると、ファイルのオーバーヘッドが増えますが、リンカはコードをより選択的にリンクできるようになります。セクションは、 Intel(r) 8086アーキテクチャにおけるセグメントに似ているところがあります。セクション内の生データはすべて連続してロードされなければなりません。さらに、 イメージファイルは特別な用途を持つ.tlsまたは.reloc といった多数のセクションを持つことができます。

属性認証

属性認証は、検証可能なイメージをイメージファイルに結び付けるために使用されます。ファイルに結び付けることのできるさまざまな種類の検証可能な文がありますが、もっとも有用なものの 1つで、記述が簡単なものは、ソフトウェア製造元による、イメージのメッセージダイジェストがどのようなものになるはずであるかを記述した文です。 メッセージ ダイジェストはチェックサムに似ていますが、偽造は非常に困難です。したがって、もとのファイルと同じメッセージ ダイジェストを持つようにファイルを変更することは非常に困難です。この文は製造元によって公開鍵暗号方式により、製造元によって作られたものであることが検証されます。本文書では、属性認証を イメージ ファイルに挿入できるようにすることのほかは、属性認証の詳細については触れません。


図1:典型的な32ビット可搬型.EXEファイル レイアウト




 

 

実行可能ファイル先頭からのオフセット

MS-DOS 2.0 互換
.EXE ヘッダ

イメージヘッダのベース

0

未使用

 

32 (0x20)

OEM識別子
OEM情報

PEヘッダへのオフセット

MS-DOS 2.0 セクション
(MS-DOSとの互換性維持専用)

PEヘッダへのオフセット 1バイトは 0x3C

MS-DOS 2.0 スタブ プログラムと再配置テーブル

 

64 (0x40)

未使用

 

 

PEヘッダ
(8バイト境界に合わせられます)

長さ 4

オフセット 0x3Cに書かれた 1バイトの内容が PEヘッダのオフセット

MS COFFヘッダ

長さ 20(0x14)

以下可変。
PEヘッダー相対オフセット 4

オプション ヘッダ(通常はイメージのみ)

標準フィールド
長さ 28(0x1C)

以下可変。
PEヘッダー相対オフセット 0x18

 

Windows固有フィールド
長さ 68(0x44

PEヘッダー相対オフセット 0x34

 

データ ディレクトリ
長さ 128(0x80)

PEヘッダー相対オフセット 0x78

 

 

 

セクション ヘッダ

コードセクション、データセクション以下複数ある。

可変。
PEヘッダー相対オフセット 0xF8が先頭のコードセクション。

イメージ ページ
インポート情報
エクスポート情報
修正情報
リソース情報
デバッグ情報

 

 

 
図2:典型的な32ビットCOFFオブジェクト モジュール レイアウト