PE header 由三部分组成
字串 “PE\0\0”(Signature)
映像文件头(FileHeader)
SizeOfImage字段(+50h)
内存中整个PE映像尺寸
按照“SectionAlignment”对齐的,它就是所有头和节的长度的总和
可选映像头(OptionalHeader)
IMAGE_NT_HEADERS STRUCT
Signature DWORD ? ;PE文件标识
FileHeader IMAGE_FILE_HEADER <>
OptionalHeader IMAGE_OPTIONAL_HEADER32 <>
IMAGE_NT_HEADERS ENDS
字串 “PE\0\0”
Signature 一dword类型,值为50h, 45h, 00h, 00h(PE\0\0)。 本域为PE标记,我们可以此识别给定文件是否为有效PE文件。
这个字串在文件中的位置(e_lfanew),可以在DOS程序头中找到它的指针,它占用四个字节,位于文件开始偏移3CH字节中。
映像文件头
该结构域包含了关于PE文件物理分布的信息, 比如节数目、文件执行机器等。
它实际上是结构IMAGE_FILE_HEADER的简称。
Machine字段 ——指定文件的运行平台
不同平台指令的机器码是不同的 ;如果Windows检测到这个字段指定的适用平台与当前的硬件平台不兼容,它将拒绝装入这个文件
014ch —— Intel 386
0184h —— Dec Alpha AXP
01f0h —— IBM Power PC(小尾方式)
0284h —— Dec Alpha AXP64
小尾little endian
数据的低字节被放置在连续存储区的首位
大尾big endian
数据的高字节被放置在连续存储区的首位
NumberOfSections字段
文件中存在的节的数量
TimeDateStamp字段
编译器创建此文件的时间,它的数值是从1969年12月31日下午4:00开始到创建时间为止的总秒数
Characteristics字段——影响系统对文件的装入方式
可选映像头
optional header 结构是 IMAGE_NT_HEADERS 中的最后成员。包含了PE文件的逻辑分布信息。
该结构共有31个域。
AddressOfEntryPoint字段 (+28h)
文件被执行时的入口地址
如何改变文件执行的入口地址?
ImageBase字段 (+34h)
文件的优先装入地址
EXE
DLL
对link.exe指定/base:address选项来自定义优先装入地址
SectionAlignment字段(+38h)
内存中的节的对齐粒度
每个节被装入的地址必定是本字段指定数值的整数倍
FileAlignment字段(+3ch)
文件中的节的对齐粒度
节存储在磁盘文件中时的对齐单位
提示加载器,为了载入映象文件需要多少页
SizeOfHeaders字段(+54h)
所有头+节表的大小
文件的开头到第一节的原始数据的偏移量
DataDirectory字段(+78h)!!!!!!
DataDirectory IMAGE_DATA_DIRECTORY 16 dup(<>) ;0078h
IMAGE_DATA_DIRECTORY STRUCT
VirtualAddress DWORD ? ;数据的起始RVA
isize DWORD ? ;数据块的长度
IMAGE_DATA_DIRECTORY ENDS
导出表、导入表、资源、重定位表等数据块