PE檔案ofMS-DOS頭
阿新 • • 發佈:2018-12-16
MS-DOS每一個pe檔案都是存在的(除非手工移除了),它的存在就是為了相容性,MS-DOS後面緊跟的是DOS Sub,有了它們,程式一旦在DOS系統下執行,就會出現一個錯誤提醒:this program cannot be run in MS-DOS mode。
MS-DOS頭結構體程式碼如下。
typedef struct _IMAGE_DOS_HANDER
{
}
typedef struct _IMAGE_DOS_HEADER { USHORT e_magic; // 魔術數字 USHORT e_cblp; // 檔案最後頁的位元組數 USHORT e_cp; // 檔案頁數 USHORT e_crlc; // 重定義元素個數 USHORT e_cparhdr; // 頭部尺寸,以段落為單位 USHORT e_minalloc; // 所需的最小附加段 USHORT e_maxalloc; // 所需的最大附加段 USHORT e_ss; // 初始的SS值(相對偏移量) USHORT e_sp; // 初始的SP值 USHORT e_csum; // 校驗和 USHORT e_ip; // 初始的IP值 USHORT e_cs; // 初始的CS值(相對偏移量) USHORT e_lfarlc; // 重分配表文件地址 USHORT e_ovno; // 覆蓋號 USHORT e_res[4]; // 保留字 USHORT e_oemid; // OEM識別符號(相對e_oeminfo) USHORT e_oeminfo; // OEM資訊 USHORT e_res2[10]; // 保留字 LONG e_lfanew; // 新exe頭部的檔案地址 } IMAGE_DOS_HEADER,*PIMAGE_DOS_HEADER;
這裡主要有兩個欄位比較重要,其它的欄位可有可無這裡就不解釋它們了。
第一個重要的欄位就是e_magic(兩個位元組大小,00偏移處),它被設定為5A4Dh,巨集定義為IMAGE_DOS_SIGNATURE,ASCII碼值是MZ。
第二個重要的欄位就是e_lfanew(兩個位元組大小,3c偏移處),它是pe檔案頭的相對虛擬地址(RVA)。