【PE】PE结构的总概与文件格式特征
PE 结构
总概
可执行文件:可以由操作系统进行加载执行的文件。
格式:Windows:PE Linux:ELF
领域涉及:
(1)病毒与反病毒
(2)外挂与反外挂
(3)加壳与脱壳
(4)无源码修改功能·软件汉化等等
PE 文件特征
PE 指纹(不要光看后缀名!!!)
先看前两个字节是不是 MZ
再看 3C 位置的 16 进制地址
最后看 3C 所指地址处的前两个字节是不是 PE
DOS 部分
IMAGE_DOS_HEADER 64 字节
DOS 块 MZ 块末尾与 PE 头中间的部分
PE 文件头部分
PE 文件头标志+PE 文件表头+PE 文件头可选部分
PE 文件头标志(DWORD Signature)
PE 文件表头(标准 PE 头) 20 字节
(IMAGE_FILE_HEADER FileHeader)
标准 PE 头的结构体形式
SizeOfOptionalHeader用来标识扩展 PE 头的大小
不修改的情况下是32 位是 0xE0,64 位是 0xF0.
PE 文件头可选部分(扩展 PE 头) 240/224 字节(64 位/32 位)
(IMAGE_OPTIONAL_HEADER32 OptionalHeader)
扩展 PE 头的结构体中有一个SizeOfHeaders(DOS 头+PE 文件头+节表按照文件对齐的大小 )和FileAlignment(文件对齐)
!!!SizeOfHeaders只能是FileAlignment的整倍数!!!
假设FileAlignment设为200,SizeOfHeaders有用数据只有350,但SizeOfHeaders的值只能是400,剩下的 50 可填写其他数据来补全
文件对齐大小:
图中是 00 20 转换成 16 进制是 0x0200
所以FileAlignment的值是 200
头大小:
00 06 转换成 16 进制是 0x0600
所以在 0x600 之后是节的数据、
内存对齐大小:
FileAlignment的前面是SelectionAlignment(内存对齐)
红色部分是之前的文件对齐大小
前面的蓝色就是内存对齐大小
每个节中的数据同,但是对齐方式不同
多出的内存空间由 0 来补充
蓝色部分是 0x1000
节表部分
IMAGE_SECTION_HEADER 40 字节
节表中的数据有很多个,图中就有 10 组,剩下的是编译器插入的数据
节表中的每个部分都由 36 个字节组成
节部分
每个节所占的空间也都是按照文件对齐和按照内存对齐