DOS 頭部結構定義
//word 與 UNSHORT 等效
typedef struct _IMAGE_DOS_HEADER { // DOS .EXE 頭結構定義開始 文件中的位置(偏移量)
WORD e_magic; // 魔術數字 0x00000000-0x00000001
WORD e_cblp; // 文件最後頁的字節數 0x00000002-0x00000003
WORD e_cp; // 文件頁數 0x00000004-0x00000005
WORD e_crlc; // 重定位元素個數 0x00000006-0x00000007
WORD e_cparhdr; // 以段落為單位的頭部大小 0x00000008-0x00000009
WORD e_minalloc; // 所需的最小附加段 0x0000000A-0x0000000B
WORD e_maxalloc; // 所需的最大附加段 0x0000000C-0x0000000D
WORD e_ss; // 初始的堆棧段(SS)相對偏移量值 0x0000000E-0x0000000F
WORD e_sp; // 初始的堆棧指針(SP)值 0x00000010-0x00000011
WORD e_csum; // 校驗和 0x00000012-0x00000013
WORD e_ip; // 初始的指令指針(IP)值 0x00000014-0x00000015
WORD e_cs; // 初始的代碼段(CS)相對偏移量值 0x00000016-0x00000017
WORD e_lfarlc; // 重定位表在文件中的偏移地址 0x00000018-0x00000019
WORD e_ovno; // 覆蓋號 0x0000001A-0x0000001B
WORD e_res[4]; // 保留字(壹般都是為確保對齊而預留) 0x0000001C-0x00000023
WORD e_oemid; // OEM 標識符(相對於 e_oeminfo) 0x00000024-0x00000025
WORD e_oeminfo; // OEM 信息,即 e_oemid 的細節 0x00000026-0x00000027
WORD e_res2[10]; // 保留字(壹般都是為確保對齊而預留) 0x00000028-0x0000003B
LONG e_lfanew; // 新 exe 頭在文件中的偏移地址 0x0000003C-0x0000003F
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER; //DOS .EXE 頭結構定義結束;引用結構名:IMAGE_DOS_HEADER,結構指針
名:PIMAGE_DOS_HEADER
//DOS 頭部***占64個字節(0x0000003F-0x0000000+1)=0x40=64
//接下來就是DOS STUB(DOS實模式殘余程序,或壹段完整的DOS程序),對Windows NT 及 windows 3.1 以上的版本,沒有多大的作用,
僅僅是在 DOS 模式下運行該可執行文件時簡單地顯示壹條諸如"This program cannot run in DOS mode(該程序無法在 DOS 模式下運
行)"或"This program requires run under windows(該程序必須在 windows 環境下才能運行)"的提示,當然這樣的提示可以由編程
者任意修改,只需要在鏈接階段選用-STUB:鏈接器選項來實現。雖然 DOS 頭、DOS STUB、PE 文件標誌、PE頭等是順序連續排列存放
的,但是 DOS STUB 到底占多少字節的空間無法確定,壹般無固定的字節數。因此導致 PE 頭在文件中的位置從何處開始無法通過存放
的順序來直接獲得,只好通過 e_lfanew 域來指向。
//上述域中真正在 windows 下有用的只有 e_lfanew
PE 頭部結構(包括簽名、文件頭、可選頭)
//註意:可選頭並不非是這個部分可有可無,實際上比必需的,也是PE文件中最重要的部分,不知 Micosoft 為什麽冠以這個很容易
引起誤解或產生歧義的名來命名這個結構名;
typedef struct _IMAGE_NT_HEADERS { //PE 頭結構定義開始
DWORD Signature; //簽名(文件類型標誌),文件中的偏移量由 DOS 頭中的域 e_lfanew 來指定
IMAGE_FILE_HEADER FileHeader; //PE 文件頭結構(占用20個字節)
IMAGE_OPTIONAL_HEADER32 OptionalHeader; //可選頭結構(占用224個字節)
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS3 //PE 頭結構定義結束;引用結構名:IMAGE_NT_HEADERS32,結構指針名:
PIMAGE_NT_HEADERS3
//在WINNT.H 頭文件中對 Signature 的定義如下:
Signature 類型 十六進制值 ASCII串形式
#define IMAGE_DOS_SIGNATURE 0x5A4D // MZ
#define IMAGE_OS2_SIGNATURE 0x454E // NE
#define IMAGE_OS2_SIGNATURE_LE 0x454C // LE
#define IMAGE_VXD_SIGNATURE 0x454C // LE
#define IMAGE_NT_SIGNATURE 0x00004550 // PE00
PE 文件頭結構定義
typedef struct _IMAGE_FILE_HEADER { //PE 文件頭結構定義開始
WORD Machine; //OS 所有的處理器類型 偏移位置:e_lfanew+0x04
WORD NumberOfSections; //節數
DWORD TimeDateStamp; //創建文件的日期和時間
DWORD PointerToSymbolTable; //符號表指針
DWORD NumberOfSymbols; //符號數
WORD SizeOfOptionalHeader; //可選頭大小
WORD Characteristics; //特征(通過它可以了解PE文件中是否包含調試信息)
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER; //PE 文件頭結構定義結束
我聽別人說這世界上有壹種鳥是沒有腳的,它只能壹直飛呀飛呀,飛累了就在風裏面睡覺,這種鳥壹輩子只能下地壹次,那邊壹次就是它死亡的時候。