PEフォーマットについて~構造概要~


Windowsの実行形式であるexeファイルは Portable Executable Format という形式で記録されています。このフォーマットについて調べてみたのでわかったことを書いておこうと思います。

まずPEフォーマットは MS-DOS用のヘッダとWindows用のヘッダから構成されます。Windowsアプリケーションではこの中のWindows用ヘッダでである IMAGE_NT_HEADERS 以降の情報を使用してアプリケーションを起動しています。

その後には各セクションの情報が格納されていたり、IMAGE_DATA_DIRECTORYで示されるデータ群で構成されています。これらのデータへのアクセスはファイル先頭からのオフセット、メモリ上ではベースアドレスからのオフセット値(相対値)として記録されています。このオフセット値はRVA(RelativeVirtualAddress)と呼ばれます。

これらの情報のつながりを図示してみると以下のような感じになります。気になるような部分だけ矢印でつないでみました。各ブロックは独立していて RVAが各ヘッダ内メンバに格納されているので、そこから他のブロックへつなぐことが出来ます。

pe-format

注意する点は IMAGE_DOS_HEADER構造体のサイズ分だけ読み進めるとNTヘッダが必ずしも出てくるわけではないようです。この構造体メンバである e_lfanew に読み進めるサイズが書いてあるので、これを参照してIMAGE_NT_HEADERまでのオフセットを取得します。
 またIMAGE_NT_HEADERS構造体は 32bit と 64bit のものでサイズが異なるのでこの点にも注意が必要です。自身も32bitで読み込んだ対象も32bitのものならば問題になりませんが、自身と対象のビット数が異なる場合にはそれに合わせる必要があるので気をつけましょう。

最後に意外な点は、IMAGE_NT_HEADERS構造体の中にある IMAGE_OPTIONAL_HEADER構造体についてです。これはオプショナルという名前がついているにもかかわらず必須の構造体で、IMAGE_DATA_DIRECTORY構造体の配列を保持しています。この情報が重要で依存するDLLの関数情報や自身がエクスポートする関数の情報といったもののデータを記録しています。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする