PE笔记
IMAGE_DOS_HEADER //MZ头
...
LONG e_lfanew //指向PE头的地址(即PEHEADER = (IMAGE_NT_HEADERS32)*e_lfanew)
IMAGE_NT_HEADERS32 //PE头
DWORD Signature //PE头文件标志,指定值"PE\0\0"
IMAGE_FILE_HEADER FileHeader //PE文件物理分布信息
...
WORD NumberOfSections //段的个数
...
IMAGE_OPTIONAL_HEADER32 OptionalHedaer //PE文件逻辑分布信息
//标准域
...
DWORD SizeofCode //可执行代码的长度,于.text段的物理长度相同
...
DWORD AddressEntryPoint //程序入口点, 最先执行代码的地址
DWORD BaseOfCode //可执行代码的起始位置
DWORD BaseOfData //初始化数据的起始位置
//NT域
DWORD ImageBase //载入程序的首选RVA地址
DWORD SectionAlignment //段对齐方式,通常是4096
DWORD FileAlignment //文件对齐方式,通常是512
...
IMAGE_DATA_DIRECTORY DataDirectory[16] //包含了PE文件中各重要数据结构的位置和尺寸信息
DWORD VitualAddress //RVA地址
DWORD Size //段大小
0 | Export symbols |
1 | Import symbols |
2 | Resources |
3 | Exception |
4 | Security |
5 | Base relocation |
6 | Debug |
7 | Copyright string |
8 | GlobalPtr |
9 | Thread local storage (TLS) |
10 | Load configuration |
11 | Bound Import |
12 | Import Address Table |
13 | Delay Import |
14 | COM descriptor |
15 | Reserved |
IMAGE_SECTION_HEADER[NumberOfSections] //段的信息
BYTE Name[8] //段名称,如".text"
union { DWORD PhysicalAddress; DWORD VirtualSize } Misc //物理地址与真实大小(按文件对齐方式对齐后的大小)
DWORD VirtualAddress //映射到内存后,段的RVA
DWORD SizeOfRawData //映射到内存按段对齐方式对齐后的物理大小
DWORD PointerToRawData //文件中段的RVA
...