PE文件格式是windows可执行文件(包括Dll)在磁盘上的存储格式。
它的内容大致如下
+------------------------+--------------------------------------------|
| DOS-stub | IMAGE_DOS_HEADER |
+------------------------+------------------------------------------- |--------------------------
| file-header | IMAGE_FILE_HEADER |
+------------------------+--------------------------------------------|
| optional header | |
|- - - - - - - - - - - - - - |IMAGE_OPTIONAL_HEADER32 |
| data directories | | IMAGE_NT_HEADERS
| | |
+-----------------------+---------------------------------------------|---------------------------
| | |
| section headers | IMAGE_SECTION_HEADER |
| | |
+------------------------+--------------------------------------------|
| | |
| section 1 | 节数据 |
| | |
+------------------------+--------------------------------------------|
| | |
| section 2 | ... |
| | |
+------------------------+--------------------------------------------|
| | |
| ... | ... |
| | |
+------------------------+--------------------------------------------|
| | |
| section n | ... |
| | |
+------------------------+--------------------------------------------|
上表中的第二列是文件中数据的结构,这些数据结构在winnt.h中都有定义。
节(section)是属性相同的数据的集合(只读,可写,可执行等等)。
几乎所有的PE文件都有code节,该节中存放的是代码;
其他节一般都是数据节,因为属性的不同而被分开,IMAGE_OPTIONAL_HEADER32中
有一个叫data directories数据目录的数组,数组的类型为IMAGE_DATA_DIRECTORY
结构,该结构存储数据在节中存放的位置(RVA),数组总共有16项。可执行文件的
导入/出表,资源数据等等都是由这个数据中的数据项指明在哪个节的哪个地方存放。
在上述列出的结构中,有许多地址,它们并不是文件偏移量,几乎都是RVA,RVA是
Relative Virtual Address的缩写,它是可执行文件加载到内存中相对于
加载基址的偏移地址,通过它可以计算出数据在文件中的偏移量。