13.3.1 dos 头
记忆结构体
typedef struct _IMAGE_DOS_HEADER{
WORD e_magic; //DOS signature : 4D5A("MZ")
WORD e_cblp;
WORD e_cp;
WORD e_crlc;
WORD e_cparhdr;
WORD e_minalloc;
WORD e_maxalloc;
WORD e_ss;
WORD e_sp;
WORD e_csum;
WORD e_ip;
WORD e_cs;
WORD e_lfarlc;
WORD e_ovno;
WORD e_res[4];
WROD e_oemid;
WORD e_oeminfo;
WORD e_res2[10];
LONG e_lfanew; //offset to NT header
}IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
dos头是为了让pe文件兼容dos
18个WORD 1个LONG ,共40个字节
必须掌握的是 e_magic :dos签名
e_lfanew:指示NT头的偏移(根据不同文件拥有可变值)
13.3.2DOS存根
dos存根(stub)在dos头下方,是个可选项,且大小不固定(即使没有dos存根,文件也可以正常运行)。dos存根有代码和数据混合而成。
40~4D是16位的汇编指令,32位不会运行,在dos环境中运行,或者使用dos调试器(debug.exe)运行它,可使其执行该代码,
具体做法是 在windows xp环境下打开命令行窗口,输入如下命令debug C:\Windows\notepad.exe
出现的光标位置输入“u”指令(反汇编),就会出现16位的汇编指令
代码很简单,输出字符串“This program cannot be run in DOS mode”后退出,这样可以在exe文件中创建出另一个文件,在dos与Windows中都能运行