1. 程式人生 > >PE檔案ofMS-DOS頭

PE檔案ofMS-DOS頭

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)。