目录
PE文件结构
PE文件和数据结构简单理解:
简单PE文件结构:
在 PE 格式中,每一个大的部分的对齐方式就是按照 200h 大小对齐的。
从文件开始到 0x03ff偏移处为 PE 的头部信息,其中记录了整个 PE 文件的头结构。
从偏移地址 0x0400 开始的 200h字节为指令字节码即代码段部分。
从偏移 0x0600 处开始的 200h 字节为程序中引入的函数描述部分,这些描述主要是为了让操作系统能在装载 PE 文件的同时,将相关的动态链接库也装入进程地址空间,实现代码的重用。
从偏移 0x0800 处开始的 200h 个字节则是程序中数据段 .data 定义的数据空间,其中包含了关于全局变量的定义。
简单的PE数据结构举例:
PE 的数据组织是大量的字节码与数据结构的有机融合。字节码是一些毫无意义的数字,而数据结构却为这些数字赋予了人类可以理解的精准含义。
同理举例理解,加载配置数据的数据结构定义为:
16 位系统下的 PE 结构:
为了保持与 16 位系统的兼容,在 PE 里依旧保留了 16 位系统下的标准可执行程序执行时所必需的文件头部 (DOS MZ 头) 和指令代码(DOS Stub ) 。
在 16 位系统下,PE 的四部分内容被重新组合成两部分----可以在 16 位系统下运行的DOS头和冗余数据。把 Windows 下的 PE 文件存储到 DOS 系统并运行,它就是DOS 系统下的一个 EXE 文件。
DOS 头分为两部分,DOS MZ 头和DOS Stub 〈即指令字节码)。大部分情况下,这些指令实现的功能都非常简单,根本不会涉及重定位信息。再往后的 PE 头和 PE 数据区可以看做是 16 位系统下的可执行文件的元余数据。
在 16 位系统下,PE 结构图示例:
DOS MZ 头:
加粗部分在 16 位系统下是没有定义的。由于其开始的标志字为“MZ”(Mark Zbikowski,他是 DOS 操作系统的开发者之一),所以称它为“DOS MZ 头”
16进制中的MZ头:
注意 这部分内容在源程序 HelloWorld.asm 中是找不到相应的定义语身的。因为 DOS MZ头部分的字节码 (包括DOS Stub 程序字节码) 的添加是由链接程序 link.exe 自动实现的。
16进制中的DOS Stub: