PE 结构

总概

可执行文件:可以由操作系统进行加载执行的文件。

格式:Windows:PE Linux:ELF

领域涉及:

​ (1)病毒与反病毒

​ (2)外挂与反外挂

​ (3)加壳与脱壳

​ (4)无源码修改功能·软件汉化等等

PE 文件特征

PE 指纹(不要光看后缀名!!!)

先看前两个字节是不是 MZ

再看 3C 位置的 16 进制地址

最后看 3C 所指地址处的前两个字节是不是 PE

pe文件格式特征

pe结构表

DOS 部分

IMAGE_DOS_HEADER 64 字节

pe03

DOS 块 MZ 块末尾与 PE 头中间的部分

pe04

PE 文件头部分

PE 文件头标志+PE 文件表头+PE 文件头可选部分

pe头

PE 文件头标志(DWORD Signature)

pe部分-pe标记

PE 文件表头(标准 PE 头) 20 字节

(IMAGE_FILE_HEADER FileHeader)

pe标准pe头

标准 PE 头的结构体形式

标准pe头结构

SizeOfOptionalHeader用来标识扩展 PE 头的大小

不修改的情况下是32 位是 0xE064 位是 0xF0.

标准pe头中标识的扩展pe头大小

PE 文件头可选部分(扩展 PE 头) 240/224 字节(64 位/32 位)

(IMAGE_OPTIONAL_HEADER32 OptionalHeader)

扩展PE头

扩展 PE 头的结构体中有一个SizeOfHeadersDOS 头+PE 文件头+节表按照文件对齐的大小 )和FileAlignment文件对齐

!!!SizeOfHeaders只能是FileAlignment的整倍数!!!

假设FileAlignment设为200SizeOfHeaders有用数据只有350,但SizeOfHeaders的值只能是400,剩下的 50 可填写其他数据来补全

文件对齐大小

PE文件对齐值

图中是 00 20 转换成 16 进制是 0x0200

所以FileAlignment的值是 200

头大小:

pe_头大小

00 06 转换成 16 进制是 0x0600

所以在 0x600 之后是的数据、

内存对齐大小

FileAlignment的前面是SelectionAlignment内存对齐

按照内存对齐

红色部分是之前的文件对齐大小

前面的蓝色就是内存对齐大小

每个节中的数据同,但是对齐方式不同

多出的内存空间由 0 来补充

蓝色部分是 0x1000

节表部分

IMAGE_SECTION_HEADER 40 字节

节表结构体

节表中的数据有很多个,图中就有 10 组,剩下的是编译器插入的数据

节表中的每个部分都由 36 个字节组成

节表

节部分

每个节所占的空间也都是按照文件对齐按照内存对齐