PE 文件格,也可以直接说,是可执行文件。也就是大家熟悉的exe、dll、ocx等类型的文件。(当然,并不是所有此类型的都是PE文件)。
Function NtCreateSection creates Section Object (virtual memory block with associated file),pe文件就是使用这个API来,分配虚拟内存块。
PE分三大块
一、Dos头,主要用于兼容Dos程序。
二、PE头,用于记录,文件相关信息
三、结点,用于记录结点的信息。
1、DOS头,DOS程序,为了兼容dos程序。
typedef struct _IMAGE_NT_HEADERS { DWORD Signature;//魔术字, 50 45 00 00("PE",0x00004550) IMAGE_FILE_HEADER FileHeader; IMAGE_OPTIONAL_HEADER32 OptionalHeader; } IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32; typedef struct _IMAGE_FILE_HEADER { WORD Machine;//程序类型,X86、Intel Itanium、X64 WORD NumberOfSections;//节点的个数,与下面“三”相关 DWORD TimeDateStamp;//程序被链接器创建时的时间,This represents the date and time the image was created by the linker DWORD PointerToSymbolTable;//符号表偏移 DWORD NumberOfSymbols;//符号表个数 WORD SizeOfOptionalHeader;//IMAGE_OPTIONAL_HEADER结构体的大小,一般在X86是224 WORD Characteristics;//文件类型,是exe、dll、systemfile等, } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER; typedef struct _IMAGE_OPTIONAL_HEADER { // Standard fields. WORD Magic;//文件只读或可运行 BYTE MajorLinkerVersion;//版本,大号 BYTE MinorLinkerVersion;//版本,小号 DWORD SizeOfCode;//段中,代码的长度(大小) DWORD SizeOfInitializedData;//已初始化的数据 DWORD SizeOfUninitializedData;//未初如化数据(与已初始化的区别,在磁盘文件中没有对应的数据,但具有大小,当分配内存时,依然会分配,并将其置0,所以,未初始化的全局或静态变量,会是0,这只是其中一种方式,还会有其它的方式,待研究...) DWORD AddressOfEntryPoint;//程序的入口地址(偏移地址,相对ImageBase) DWORD BaseOfCode;//代码段的基址,(偏移地址,相对ImageBase) DWORD BaseOfData;//数据段的基址,(偏移地址,相对ImageBase) // NT additional fields. DWORD ImageBase;//虚拟内存的地址,(并不完全固定,有可能会由于冲突而重定向) DWORD SectionAlignment;//节对齐(在内存内),一定会大于等于FileAlignment,一个节点位置(相对)、大小,必须是这个数的倍数。 DWORD FileAlignment;//文件对齐,同上 WORD MajorOperatingSystemVersion;//运行系统最大要求 WORD MinorOperatingSystemVersion;//运行系统最要求 WORD MajorImageVersion;//映象文件主版本号 WORD MinorImageVersion;//映象文件次版本号 WORD MajorSubsystemVersion;//子系统主版本 WORD MinorSubsystemVersion;//子系统次版本 DWORD Win32VersionValue;//必须为0,(不知何用,求解) DWORD SizeOfImage;//映像大小,虚拟内存大小 DWORD SizeOfHeaders;//这个PE头的大小,也就是此PE头这个段的大小 DWORD CheckSum; WORD Subsystem;//The subsystem required to run this image,子系统要求,GUI、CUI and so on;(GUI Graphical user interface图形用户接口,CUI Command user interface) WORD DllCharacteristics;//属性 DWORD SizeOfStackReserve;//保留栈大小 DWORD SizeOfStackCommit;//初始化栈大小 DWORD SizeOfHeapReserve;//保留堆大小 DWORD SizeOfHeapCommit;//初始化栈大小 DWORD LoaderFlags;//已过时 DWORD NumberOfRvaAndSizes;//下面结构的个数 IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; } IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32; IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; typedef struct _IMAGE_DATA_DIRECTORY { DWORD VirtualAddress; DWORD Size; } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY; 分别为: 0 Export Table //导出表 1 Import Table //导入表 2 Resource Table//资源表 3 Exception Table //异常表 4 Certificate File//证书表,数字验证等 5 Relocation Table//重定位表 6 Debug Data //调试表 7 Architecture Data 8 Global Ptr 9 TLS Table 10 Load Config Table 11 Bound Import Table 12 Import Address Table a 13 Delay Import Descriptor 14 COM+/CLI Header 15 Reserved = 00000000//全0,结束标志 Reserved = 00000000
3、节点表
这个表的个数:IMAGE_FILE_HEADER.NumberOfSections,见上。
typedef struct _IMAGE_SECTION_HEADER { BYTE Name[IMAGE_SIZEOF_SHORT_NAME];//名字,8字节长度,例如:".text" 、".data"、".rsrc"等 union { DWORD PhysicalAddress;//物理地址 DWORD VirtualSize;//大小 } Misc; DWORD VirtualAddress;//RVA DWORD SizeOfRawData; DWORD PointerToRawData; DWORD PointerToRelocations; DWORD PointerToLinenumbers; WORD NumberOfRelocations; WORD NumberOfLinenumbers; DWORD Characteristics;//属性 } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
以上是PE结构示意。
之后,会着重分析,导入表、导出表、资源表等
我的PE文件分析:http://download.csdn.net/download/he702477275/4968971