PE结构_01
ZC: 主要是 非代码的 分析结构
1、
1.1、DosHeader: PE从偏移0开始就是
1.2、NtHeader: 位于 紧接着DosHeader的后面(具体位置为: DosHeader的偏移[0] + DosHeader.e_lfanew)
1.2.1、NtFileHeader: NtHeader.FileHeader
1.2.2、NtOptionalHeader: NtHeader.OptionalHeader
1.3、DataDirectory: NtOptionalHeader.DataDirectory
2、
每次加载exe的基址是否是随机的:(WORD)IMAGE_FILE_HEADER.Characteristics;
IMAGE_FILE_RELOCS_STRIPPED ==> 0x0001
if (IMAGE_FILE_HEADER.Characteristics & IMAGE_FILE_RELOCS_STRIPPED != 0) exe固定基址 else exe随机基址
3、IAT 在哪里?
结构体IMAGE_OPTIONAL_HEADER32的最后一个成员:IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
数组的索引为 IMAGE_DIRECTORY_ENTRY_IAT
4、exe 入口点:
IMAGE_OPTIONAL_HEADER32.AddressOfEntryPoint
100、
100.1、代码:
#include <stddef.h> #include <stdio.h> #include <windows.h> void main() { printf("结构体的大小 :\n"); printf("sizeof(IMAGE_DOS_HEADER) : %d [0x%X]\n", sizeof(IMAGE_DOS_HEADER), sizeof(IMAGE_DOS_HEADER)); printf("sizeof(IMAGE_NT_HEADERS32) : %d [0x%X]\n", sizeof(IMAGE_NT_HEADERS32), sizeof(IMAGE_NT_HEADERS32)); printf("sizeof(IMAGE_FILE_HEADER) : %d [0x%X]\n", sizeof(IMAGE_FILE_HEADER), sizeof(IMAGE_FILE_HEADER)); printf("sizeof(IMAGE_OPTIONAL_HEADER32) : %d [0x%X]\n", sizeof(IMAGE_OPTIONAL_HEADER32), sizeof(IMAGE_OPTIONAL_HEADER32)); printf("sizeof(IMAGE_DATA_DIRECTORY) : %d [0x%X]\n", sizeof(IMAGE_DATA_DIRECTORY), sizeof(IMAGE_DATA_DIRECTORY)); printf("\n"); printf("成员在结构体中的偏移 :\n"); size_t iOffset = offsetof(IMAGE_DOS_HEADER, e_lfanew); printf("IMAGE_DOS_HEADER.e_lfanew 偏移为 : %d [0x%X]\n", iOffset, iOffset); iOffset = offsetof(IMAGE_NT_HEADERS32, FileHeader); printf("IMAGE_NT_HEADERS32.FileHeader 偏移为 : %d [0x%X]\n", iOffset, iOffset); iOffset = offsetof(IMAGE_NT_HEADERS32, OptionalHeader); printf("IMAGE_NT_HEADERS32.OptionalHeader 偏移为 : %d [0x%X]\n", iOffset, iOffset); iOffset = offsetof(IMAGE_OPTIONAL_HEADER32, DataDirectory); printf("IMAGE_OPTIONAL_HEADER32.DataDirectory 偏移为 : %d [0x%X]\n", iOffset, iOffset); iOffset = offsetof(IMAGE_OPTIONAL_HEADER32, AddressOfEntryPoint); printf("IMAGE_OPTIONAL_HEADER32.AddressOfEntryPoint 偏移为 : %d [0x%X]\n", iOffset, iOffset); //IMAGE_NT_OPTIONAL_HDR_MAGIC }
100.2、控制台输出:
结构体的大小 :
sizeof(IMAGE_DOS_HEADER) : 64 [0x40]
sizeof(IMAGE_NT_HEADERS32) : 248 [0xF8]
sizeof(IMAGE_FILE_HEADER) : 20 [0x14]
sizeof(IMAGE_OPTIONAL_HEADER32) : 224 [0xE0]
sizeof(IMAGE_DATA_DIRECTORY) : 8 [0x8]
成员在结构体中的偏移 :
IMAGE_DOS_HEADER.e_lfanew 偏移为 : 60 [0x3C]
IMAGE_NT_HEADERS32.FileHeader 偏移为 : 4 [0x4]
IMAGE_NT_HEADERS32.OptionalHeader 偏移为 : 24 [0x18]
IMAGE_OPTIONAL_HEADER32.DataDirectory 偏移为 : 96 [0x60]
IMAGE_OPTIONAL_HEADER32.AddressOfEntryPoint 偏移为 : 16 [0x10]
Press any key to continue
101、
101.1、VC6中 WINNT.H
// Directory Entries #define IMAGE_DIRECTORY_ENTRY_EXPORT 0 // Export Directory #define IMAGE_DIRECTORY_ENTRY_IMPORT 1 // Import Directory #define IMAGE_DIRECTORY_ENTRY_RESOURCE 2 // Resource Directory #define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3 // Exception Directory #define IMAGE_DIRECTORY_ENTRY_SECURITY 4 // Security Directory #define IMAGE_DIRECTORY_ENTRY_BASERELOC 5 // Base Relocation Table #define IMAGE_DIRECTORY_ENTRY_DEBUG 6 // Debug Directory // IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7 // (X86 usage) #define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE 7 // Architecture Specific Data #define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8 // RVA of GP #define IMAGE_DIRECTORY_ENTRY_TLS 9 // TLS Directory #define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10 // Load Configuration Directory #define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 11 // Bound Import Directory in headers #define IMAGE_DIRECTORY_ENTRY_IAT 12 // Import Address Table #define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT 13 // Delay Load Import Descriptors #define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14 // COM Runtime descriptor
102、