EXEファイルの内部構造

Windowsの実行ファイルEXEファイルは、通常Visual C++, Visual Basic, Delphiなどのコンパイラが自動生成する
L ほとんどがデータサイズ、ファイル、メモリを指し示すオフセット値で構成されている

MS DOSはマイクロソフトが開発したパソコン用OS
sublimeで開くとバイナリコードでどのように書かれているかわかりません。
 L x86に対応する機械語。アセンブラではない。

MZシグネチャはEXEファイルを裏付けるデータ

EXEファイルが動くマシン
– Intel 386以降(Windows)
– MIPS(r)
– Alpha AXP(tm)
– Motorola 68000
– Power PC
– 日立SH3, SH4

リソース箇所にデータを格納する

PEヘッダ(Portable Executable)
EXEファイルの先頭部分の情報

EXEファイルのロード方法
MicrosoftのOSが、MZシグネチャ、マシンタイプ、ネイティブコードなどの情報をもとにEXEファイルをメモリ上にロードして実行する
1. シグネチャ、マシンタイプを確認
2. EXEイメージをメモリ上にコピー
3. PEヘッダ記載データを元にEXEイメージの初期化
4. PEヘッダで指定されたスタートポイントからプログラム実行
なるほど、ディスクに保存したexeファイルをメモリ上に読み込んで、1行ずつ処理していくのね。

EXEファイルイメージは実行前にプロセスメモリの任意の場所にロードされる。メモリの先頭位置をイメージベースという。
RVA(Relative Virtual Address)とはイメージベースからの相対オフセット値
ファイルポインタで読み込み対象となるデータ位置を指定し、RVAでプロセスメモリ上のデータを指し示す

イメージベース + RVA = データアドレス

EXEファイル先頭
IMAGE_DOS_HEADER …MS-DOSで認識可能なデータフォーマット
MS-DOS用スタブ …ネイティブコードを保存できるスペース
NULL空間 … PEヘッダの先頭位置は8バイト境界
PEヘッダ

なるほど、*.exeと*.pkgではソースコードは一緒だけど単純に拡張子だけ異なるって訳ではないのね。当たり前か。
EXEファイルがMS-DOS用のヘッダやデータフォーマットということは、一つのソフトでもOSが変われば当然、ファイルの中身が違うってことですな。