Windowsの実行ファイル形式(2)

どうでもいいですが、親サイト側ではちょっと内部文字列が間違えてたDirectShowのフィルタを更新していたりします。

WindowModePatchもいろいろと確認して修正中です。うまく動かない実行ファイルでのテストで大変ですが・・・。

さて、それではIMAGE_NT_HEADERSの中にあるデータのIMAGE_FILE_HEADERについてです。

32bitの実行ファイルでも64bitの実行ファイル(PE32+の場合)でも構造体の各メンバのサイズは同じなので共通で。

以下のようなメンバですね。

  • Machine

実行ファイルが実行可能なCPUのアーキテクチャを示します。

x86ならIMAGE_FILE_MACHINE_I386、x64ならIMAGE_FILE_MACHINE_AMD64を使用します。

もちろん、ライブラリとして読み込むときにクロスでは読み込めませんので、手動で調べるときは

この部分の値が自分の実行しようとしているアーキテクチャと一致しているか確認する必要があります。

  • NumberOfSections

メモリ上にロードされるセクションの数を示します。セクションは次回以降に説明します。

  • TimeDateStamp

実行ファイルが作成されたときの時間をtime_t(32bit)で示します。

ファイル本体のタイムスタンプを変えても実行ファイル側にタイムスタンプが残っているのでこちらも変更しないと完全に変わったことにはなりません。

32bit値なので2038年で一周しちゃいます。それまでにはほぼすべての実行ファイルが完全な64bitに移行するので問題ないと思いますが。

  • PointerToSymbolTable,NumberOfSymbols

通常は使用しません。詳しくはMSDNあたりでみてください。

  • SizeOfOptionalHeader

IMAGE_OPTIONAL_HEADER領域のサイズを示します。

16bit値なので64kbyte以上のサイズにはできません。IMAGE_OPTIONAL_HEADERSのデータはそれだけいる領域ではないですが。

  • Characteristics

この実行ファイルの特性を示します。直接実行できるかや、DLLファイルかどうかなどの情報をフラグで保持します。

16bit値ですが、ほぼすべてのビットに意味があるので変なフラグを立てると間違われるので注意です。

とまあ適当に解説してみましたが、この辺はおもしろいものはありません。MSDNをみればそれっぽいことが書いてあると思います。

どちらかというとおもしろいのはその後ろです。それでは、また次回に。

連載形式でやるのはちょっと疲れます・・・。

LINEで送る
[`fc2` not found]
このエントリーを Google ブックマーク に追加

コメントを残す

メールアドレスが公開されることはありません。

*

この記事のトラックバック用URL