復活記念連載、ということでWindowsの実行ファイルの形式やらそれにまつわるお話をしようかと思います。
DLLの乗っ取りなども実はこの技術を使ってやっているのと、意外とこれにまつわる話が少ないのでおもしろ半分ですが。
そもそも、Windowsの実行ファイルとはどのような形式になっているのでしょうか?
これに関してはほかのページにもそれなりの解説がありますが、こっちでも少々話してみましょう。
だいたい、以下のような構造になっています。
説明で出てくる構造体はwinnt.hに記述してあるので興味がある人は検索してみてください。
————————————————————–
IMAGE_DOS_HEADER
————————————————————–
MS-DOSスタブプログラム(IMAGE_DOS_HEADERで指定された領域分)
————————————————————–
Signiture (4bytes) [PE\0\0]
IMAGE_NT_HEADERS (x86は32、x64は64の接尾語がくっつく)
IMAGE_FILE_HEADER
IMAGE_OPTIONAL_HEADER
IMAGE_DATA_DIRECTORY x16
————————————————————–
IMAGE_SECTION_HEADER xセクション数
————————————————————–
アライメント領域(通常は00で埋められている)
————————————————————–
セクションデータ(それぞれに依存)
————————————————————–
WindowsになってからはIMAGE_DOS_HEADERとMS-DOS用のスタブプログラム(MS-DOS上で間違えて実行しないようにする領域)は必要ありません。
なくても動作しますがつけるのが慣例になってしまっているっぽいです。64bitのexeを生成しても設定をすれば勝手についてきます。
もし必要なら適当な実行ファイルから引っこ抜いてくればそれで終わりだったりします。
ちなみに、x86とx64の実行ファイル違いは上の説明にもあるとおり、IMAGE_NT_HEADERSが32か64かの差です。(PE32とPE32+の形式の時)
一応ある部分の定義が32bitの定義か64bitの定義かで分かれているわけですが、その割には相対のアドレスなどを示す部分は32bitのままなので
イメージサイズ(メモリにロードされるデータサイズ)が2^32byte以上になることはできなかったりします。そんなサイズのイメージが現段階で必要とも思えませんが。
なので、実行ファイルの形式で重要になるのはIMAGE_NT_HEADERSとIMAGE_SECTION_HEADERがまず初めに出てきます。
これらの意味がわかれば自分で実行ファイルを作れたりもします。
と、まず簡単な説明が第一段階ですね。それ以降はまた次回に。