DOS标准的 MZ 格式可执行文件详细结构 MZ 格式可执行文件详细结构MZ 格式俗称 DOS EXE 文件是微软为 MS-DOS 设计的可执行文件格式因文件头前两个字节为MZ十六进制4D 5A即 ASCII 字符 MZ而得名。一、整体结构概览------------------------ - 文件开头 (偏移 0) | MZ 头部 | (0x00 - 0x3F, 共 64 字节) ------------------------ | 重定位表 | (位置和大小由头部指定) ------------------------ | 程序代码和数据 | (可执行映像通常以 0x200 字节对齐) ------------------------二、MZ 头部详细结构64 字节偏移大小字段名说明00h2e_magic签名标志固定为5A4Dh(即 MZ)02h2e_cblp文件最后一页的字节数0-51104h2e_cp文件总页数每页 512 字节06h2e_crlc重定位表项数08h2e_cparhdr头部占用的段落数1 段落 16 字节0Ah2e_minalloc程序所需最小额外内存段落数0Ch2e_maxalloc程序所需最大额外内存段落数0Eh2e_ss初始 SS 的相对值相对于映像基址10h2e_sp初始 SP 值12h2e_csum校验和通常为 0可忽略14h2e_ip初始 IP 值16h2e_cs初始 CS 的相对值相对于映像基址18h2e_lfarlc重定位表在文件中的偏移量1Ah2e_ovno覆盖号0 表示主程序1Ch4e_res[4]保留字4 个字节通常为 024h2e_oemidOEM 标识符用于特定系统26h2e_oeminfoOEM 信息28h10e_res2[10]保留字10 个字节32h4e_lfanew扩展头偏移仅限 NE/PE 格式DOS 程序可为 0三、关键字段计算示例假设某 EXE 文件的 MZ 头信息如下e_magic 0x5A4D (MZ) e_cblp 0x0120 (最后一页 288 字节) e_cp 0x0008 (总 8 页 4096 字节) e_crlc 0x0004 (4 个重定位项) e_cparhdr 0x0002 (头部 2 段落 32 字节) e_minalloc 0x0010 (最少需 16 段额外内存) e_ss 0x0005 (SS 相对值 5) e_sp 0x0100 (SP 256) e_ip 0x0000 (IP 0) e_cs 0x0008 (CS 相对值 8) e_lfarlc 0x0040 (重定位表在偏移 0x40)文件大小计算总字节数 e_cp * 512 - (512 - e_cblp) 8 × 512 - (512 - 288) 4096 - 224 3872 字节四、重定位表格式重定位表紧跟在 MZ 头部之后由e_lfarlc指示每项结构如下偏移大小说明02需要修正的段地址偏移量在映像中的位置22需要修正的段值相对于映像基址的逻辑段修正公式实际物理段地址 映像加载段基址 重定位项中的段值五、程序加载流程DOS 加载器读取 MZ 头部校验e_magic MZ根据e_cparhdr计算头部字节数e_cparhdr * 16读取重定位表位置e_lfarlc项数e_crlc分配内存至少(头部段落数 映像段落数 e_minalloc) * 16字节在分配内存起始处建立 PSP程序段前缀256 字节将程序映像加载到 PSP 之后的地址偏移e_cparhdr * 16根据重定位表修正所有需要重定位的地址设置 DS、ES PSP 段地址设置 SS PSP 段地址 e_ssSP e_sp跳转到入口CS PSP 段地址 e_csIP e_ip六、与 COM 文件的区别特性MZ EXECOM文件头有 64 字节 MZ 头无头最大大小理论无上限可分段 64KB入口点CS:IP 可任意指定固定 CS:IP PSP:0x100重定位需要重定位表无需所有段地址固定内存模型任意模型TINY/SMALL/MEDIUM/LARGE/HUGE仅 TINY 模型签名前两字节 MZ无七、内存中的最终布局低地址 ------------------ - PSP 段地址 (例如 0x1000) | PSP | (256 字节包含命令行环境等) | (0x000 - 0x0FF) | ------------------ - 映像加载起始地址 PSP e_cparhdr | 程序映像 | | (代码 数据) | ------------------ - 堆栈段 (SS PSP e_ss) | 堆栈 | ------------------ 高地址八、常用工具EXE2BIN将 MZ EXE 转换为 COM 文件要求 TINY 模型DEBUG.EXE可用L命令加载 EXER查看寄存器DUMPBIN /HEADERSWindows SDK 工具可显示 MZ 头信息Hiew/WinHex十六进制编辑器可手动分析这个结构是 DOS 时代可执行文件的基础现代的 Windows PE 格式.exe依然在文件开头保留了 MZ 头用于向后兼容其e_lfanew指向真正的 PE 头。