PE 表头(PE Header)
1 PE 表头
内含的重要信息包括程序代码和资料区域的大小位置、适用的操作系统、堆栈(stack)的
最初大小等等。
2 文件最前面的数百个字节是所谓的 DOS stub ,当 Win32 加载器把一个 PE 档映像到内存,内存
映像文件(memory mapped file )的第一个字节对应到 DOS Stub 的第一个字节。
3 e_lfanew 字段是一个相对偏移值(或说是 RVA ),指向真正的 PE 表头。为了获得指
标,你必须为 RVA 加上 image 的基地址:
pNTHeader = dosHeader + dosHeader->e_lfanew;
4 PE 表头整个是个IMAGE_NT_HEADERS 结构,此一结构有一个 DWORD 和两个子结构:
DWORD Signature; // ASCII 的 PE/0/0
IMAGE_FILE_HEADER FileHeader; //此结构内含最基础的文件信息
IMAGE_OPTIONAL_HEADER OptionalHeader;
/////////////////////////////////////////////////////////////////////////////////////////////////////////
1) WORD Machine
2) WORD NumberOfSections
3) DWORD TimeDateStamp
4) DWORD PointerToSymbolTable
5) DWORD NumberOfSymbols
6) WORD SizeOfOptionalHeader
7) WORD Characteristics
上面七个部分就是IMAGE_FILE_HEADER FileHeader的结构
下面还剩下 IMAGE_OPTIONAL_HEADER OptionalHeader
其中最重要的两个字段是 ImageBase 和 Subsystem
详细如下
1) WORD Magic
2) DWORD SizeOfCode
3) DWORD SizeOfInitializedData
4) DWORD SizeOfUninitializedData
5) DWORD AddressOfEntryPoint
6) DWORD BaseOfCode
7) DWORD BaseOfData
8) DWORD ImageBase
9) DWORD SectionAlignment
10) DWORD FileAlignment
11) WORD MajorOperatingSystemVersion
12) WORD MinorOperatingSystemVersion
13) WORD MajorImageVersion
14) WORD MinorImageVersion
15) WORD MajorSubsystemVersion
16) WORD MinorSubsystemVersion
17) DWORD Reserved1
18) DWORD SizeOfImage
19) DWORD SizeOfHeaders
20) DWORD CheckSum
21) WORD Subsystem
22) WORD DllCharacteristics
23) DWORD SizeOfStackReserve
24) DWORD SizeOfStackCommit
25) DWORD SizeOfHeapReserve
26) DWORD SizeOfHeapCommit
27) DWORD LoaderFlags
28) DWORD NumberOfRvaAndSizes
29) IMAGE_DATA_DIRECTORY DataDirectory [IMAGE_NUMBEROF_DIRECTORY_ENTRIES]