Windows逆向工程提升之IMAGE_DOS_HEADER
- 公开视频 -> 链接点击跳转公开课程
- 博客首页 -> 链接点击跳转博客主页
目录
什么是IMAGE_DOS_HEADER
DOS头的结构定义:
核心字段解析
(1) e_magic(OFFSET → 0 WORD)
(2) e_lfanew(OFFSET → 0X3C DWORD)
(3) ecblp, ecp
(4) eip, ecs
(5) eres 和 eres2
(6) eoemid 和 eoeminfo
DOS头的作用
PE文件结构拓展
学习与调试中的常见问题
什么是IMAGE_DOS_HEADER
IMAGE_DOS_HEADER 是PE文件(Portable Executable)结构中的第一部分,它包含了DOS程序使用的起始信息。尽管现代Windows操作系统直接运行PE文件(而不是DOS程序),但DOS头依然被保留下来,主要用于兼容性。
DOS头的结构定义:
typedef struct _IMAGE_DOS_HEADER { WORD e_magic; // 用于标记DOS可执行文件(0x5A4D,即"ZM")。 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]; // 保留区。 WORD e_oemid; // OEM标识符。 WORD e_oeminfo; // OEM信息。 WORD e_res2[10]; // 额外的保留部分。 DWORD e_lfanew; // PE头起始地址的偏移量。
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
核心字段解析
(1) e_magic(OFFSET → 0 WORD)
-
值: 0x5A4D (ASCII形式是 "MZ")。
-
含义: DOS可执行文件的标志。
-
功能: 帮助识别文件类型,也称为“幻数(Magic Number)”。
(2) e_lfanew(OFFSET → 0X3C DWORD)
-
值: 一个DWORD值,表示PE文件头(IMAGENTHEADERS)在文件中的偏移量。
-
功能: 引导操作系统直接跳到PE文件头,加载PE部分。
(3) ecblp, ecp
- 功能: 定义DOS程序的页结构,但现代Windows中已无实际意义,通常被保留为固定值。
(4) eip, ecs
- 功能: 在DOS环境下,这些字段指向程序的入口地址。现代PE文件会跳过这些字段。
(5) eres 和 eres2
- 功能: 保留字段,目前无具体用途,通常填充零。
(6) eoemid 和 eoeminfo
- 功能: 标识附加的信息,可能由特定的OEM厂商定义。
DOS头的作用
- 兼容旧的DOS环境:
- 在DOS模式下运行时,DOS头包含必须的元信息,支持跳转到DOS Stub程序。
- 如果在不兼容的平台运行,系统可显示一条错误信息(一般是“此程序不能在DOS模式下运行”)。这条信息存储在DOS Stub部分中。
- 用于定位PE文件头:
- e_lfanew字段用于提供PE头的偏移量。
- 系统通过此字段快速跳转到PE核心内容。
- 保持文件格式兼容性:
- 向下兼容既有机制,同时支持现代Windows加载器解析文件。
PE文件结构拓展
IMAGE_DOS_HEADER 是PE文件结构的起点。在PE文件中,其后依次包含以下关键部分:
- DOS Stub(位于DOS头之后):
- 一个小型程序,用于在DOS下提示“程序无法运行”的信息。
- IMAGE_NT_HEADERS:
- 包括PE签名("PE\0\0")和核心的文件头(IMAGE_FILE_HEADER部分)。
- IMAGE_SECTION_HEADERs:
- 描述文件的各个部分(如.text, .data, .rdata等)。
学习与调试中的常见问题
- 如何分析e_lfanew指向的地址?
- 用十六进制编辑器查看文件偏移值位置。
- 在Debug工具中,跟踪文件头,验证跳转逻辑。
- e_magic值如何用于文件完整性检查?
- 文件加载器首先检查e_magic是否为0x5A4D。
- 如果不匹配,则文件会被判定非有效PE文件。