IMAGE_NT_HEADERS32に定義
typedef struct _IMAGE_NT_HEADERS { DWORD Signature; IMAGE_FILE_HEADER FileHeader; IMAGE_OPTIONAL_HEADER32 OptionalHeader; } IMAGE_NT_HEADER32, *PIMAGE_NT_HEADERS32;
PE headerにもSignature
4byte? 32bitOSを意志的している
IMAGE_FILE_HEADER構造体
typedef struct _IMAGE_FILE_HEADERS { WORD Machine; WORD NumberOfSections; DWORD TimeDataStamp; DWORD PointerToSymbols; DWORD NumberOfSymbols; WORD SizeOfOptionalHeader; WORD Characteristics; } IMAGE_FILE_HEADER, *PIMAGE_NT_HEADERS;
Machineはそれぞれフラグがあう
unknown:0x0 あらゆるマシンタイプ
I386:0x14c Intel386以降
R3000: 0x162
R4000: 0x166 MIPS(r)リトルエンディアン
R10000: 0x168
….
NumberOfSections: 保持するセクション数
TimeDataStamp: 作成された日時
PointerToSymbols, NumberOfSymbols:シンボルテーブルの位置、数
SizeOfOptionalHeader: 構造体サイズ保持
Characteristics:ファイズ属性値
IMAGE_FILE_EXECUTABLE: 0x0002
IMAGE_FILE_LINE_NUMS_STRIPPED: 0x0004
…
IMAGE_OPTIONAL_HEADER32構造体も同様に定義される
Magic,MajorLinkerVersion, SizeOfCode, SizeOfInitializedData,
SizeOfInitializedData, SizeOfUnitializedData,AddressOfEntryPoint, BaseifCode, BaseOfData, ImageBase, …
IMAGE_DATA_DIRECTORY構造体はRVA, Size
PE Headerにはターゲットマシン、アライメント情報、セクション情報、メモリサイズ情報などが格納されており、OSがメモリにロードして実行する際に書き込まれる
OS側では書き込まれた内容を元にメモリで実行する
ツールを使用すればコンパイル時に自動生成される
第一印象項目が多いなと思ったが、exeファイルの共有フォーマットと考えると妥当か