天天看点

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