by shigemk2

当面は技術的なことしか書かない

PEについて #startexe

途中ちょくちょくEmacsが落ちる。(Windows7)

PE

DOSと混在して実行される場合があるので、頭に This program cannot be run in DOS modeって頭につけて、DOSで動かした場合にエラーになるように仕向けてある。

ファイルを見ただけでは何用のファイルか分からない。

40-7F

ファイルの先頭MZ(000)→3C→80からプログラムを読み込む

すべてのOSのバイナリがいきなりreturnして終了できるとは限らない

unused DOSヘッダが8の倍数で収まらなかった場合のときにpaddingで帳尻を合わせている

大前提 実行ファイルはプログラムとデータから構成される

ヘッダがいろいろあってめんどくさそう(v6はヘッダがすごいシンプルであった)

8バイトのアラインメント

アライメント - Wikipedia

コンピュータなどにおいて、サイズが2バイト・4バイト……のデータが、アドレスが2の倍数・4の倍数……の丁度に位置に来るように調整すること。 それがunused

COFF File HeaderのFieldが不明

COFF - Wikipedia

Unixシステムで用いられる実行ファイル、オブジェクトファイル、共有ライブラリのファイルフォーマット仕様

PEはCOFFの後継。

シンボル=名前。DLLで関数を動的に読み込むときは名前を持っておかないと呼べない。

32bit版と64bit版でオプショナルヘッダが違う

ファイルヘッダは一緒。

Machine TypesのIMAGE_FILE_MACHINE_AMD64は0x8664で決め打ち。

セクション

動的に決められる。IMAGE_SECTION_HEADERはセクションの数だけある。

データがあるならIMAGE_SECTION_HEADERは2つとなり、つまり可変である。

セクション=テキスト+データの他に、いろいろある。デバッグ用セクション、グローバル変数など

  • text
  • data(読み込みしかできないやつはrdataになるとか)
  • bss

セクション名は自由につけられる。

Characteristicsにフラグを立てて、ファイルの属性を決定できる

  • IMAGE_SECTION_HEADER

IMAGE_OPTIONAL_HEADERは固定値

SectionAlignment FileAlignment

  • SectionAlignment(4096 4KB)
  • text data bss 各セクションは4KB単位

  • FileAgnment(512B)

  • ファイル上のアラインメント
  • 512はセクターのサイズ
  • 区切り

File→Memory

ヘッダを読み込んでメモリに書き込み、必要になった時点でデータをメモリに読み込む。これをオンデマンドページングというが、それを実現しやすくするためにデータをアラインメントしている。

これはCOFFにはなくって、COFFを拡張したもの。

  • Windows8 on Windows7での実行

(仮想マシンかどうかをチェックしている)

メモリ

ImageBase 先頭のアドレスの場所。そこから相対アドレスでBaseOfCodeとかBaseOfDataのアドレスの場所が指定されている。

RelativeVirtualAddress

相対仮想アドレス(RVA)は、標準的な仮想アドレスと混同してはならない。相対仮想アドレスはメモリにロードされたオブジェクトの仮想アドレスから、ファイルイメージのベースアドレスを引いたものである。

COFF - Wikipedia