PE文件结构
a, DOS Header(TImageDosHeader) 其中
-- _lfanew 指向 【c】
-- e_magic 为 MZ
b, Dos stub 用于不支持PE的操作系统,显示错误提示如“This program requires Windows”,不定长
c, PE Header(TImageNtHeaders)
-- PE 标志 (TImageNtHeaders.Signature) 必须等于 IMAGE_NT_SIGNATURE,即 PE/0/0
-- PE 基本信息 (TImageFileHeader)
其中 NumberOfSections 决定了【d】中元素的数目
TimeDateStamp 为文件创建的时间
-- PE 可选头 (TImageOptionalHeader)
其中 SizeOfHeaders 是 【a】+【b】+【c】+【d】的总空间
DataDirectory 是IMAGE_DATA_DIRECTORY结构的数组,每个结构给出了一个重要数据结 构的
RVA,如引入地址表、导出地址表等。例如
TImageImportDescriptor = packed record
OriginalFirstThunk: DWord;
TimeDateStamp : DWord;
ForwarderChain : DWord;
DLLName : DWord;
FirstThunk : DWord;
end;
end;
d, 节表 (array of TImageSectionHeader)
--
e ....
各个节
=========== 关于节===================
★ PE文件的真正内容划分成块,称之为sections(节)。每节是一块拥有共同属性的数据,比如代码/数据、读/写、导入/导出等。我们
可以把PE文件想像成一逻辑磁盘,PE header 是磁盘的boot扇区,而sections就是各种文件,每种文件自然就有不同属性,如只读、系统、隐
藏、文档等。节的划分是基于各组数据的共同属性,而不是逻辑概念。重要的不是数据/代码是如何使用的,如果PE文件中的数据/代码拥有相
同属性,它们就能被归入同一节中。
=========== 关于节===================
参考书目:
1, Delphi下深入Windows核心编程
2, 编程高手箴言