词条 | PE格式 |
释义 | 一、概述:PE格式,是微软Win32环境可执行文件的标准格式(所谓可执行文件不光是.EXE文件,还包括.DLL/.VXD/.SYS/.VDM等)。PE 就是Portable Executable 的缩写,PE文件衍生于早期建立在VAX/VMS上的COFF(Common Object File Format)文件格式。Portable 是指对于不同的Windows版本和不同的CPU类型上PE文件的格式是一样的,当然CPU不一样了,CPU指令的二进制编码是不一样的。只是文件中各种东西的布局是一样的。 PE文件使用的是一个平面地址空间,所有代码和数据都合并在一起,组成一个很大的结构。主要有: .text 是在编译或汇编结束时产生的一种块,它的内容全是指令代码 .rdata 是运行期只读数据 .data 是初始化的数据块 .idata 包含其它外来DLL的函数及数据信息,即输入表 .rsrc 包含模块的全部资源:如图标、菜单、位图等 PE文件结构(简化): ----------------- │1,DOS MZ header│ ----------------- │2,DOS stub │ ----------------- │3,PE header │ ----------------- │4,Section table│ ----------------- │5,Section 1 │ ----------------- │6,Section 2 │ ----------------- │ Section ... │ ----------------- │n,Section n │ ----------------- Dos Mz head 和Dos stub和称Dos文件头,PE文件的第一个字节起始于于MS-DOS头部,被称作IMAGE_DOS_HEADER.紧随Dos stub的是PE文件头(PE Header),PE Header的PE相关结构NT映像头(IMAGE_NT_HEADERS)的简称,其中包含许多PE装载器用到的重要字段。 1、入口点 Entry Point 2、文件偏移地址 File Offset 3、虚拟地址 Virtual Address 简称:VA 4、基地址 ImageBase 5、相对虚拟地址 Relative Virual Address 简称:RVA 公式: RVA (相对虚拟地址) =VA (虚拟地址) - ImageBase (基地址) 文件偏移地址和虚拟地址转换 在X86系统中,每个内存的大小是4KB,即0X1000个字节。 文件偏移地址 File Offset = RVA (相对虚拟地址) - ΔK 文件偏移地址 File Offset = VA (虚拟地址) - ImageBase (基地址) - ΔK pe具体结构图: pe格式的结构体定义可以在编译器的include文件夹里的winnt.h找到。 二、 pe的具体结构如下所示(经过简化的,具体的可以查看winnt.h,不同字长的结构,其实大体一样的)。 几个宏定义: typedef unsigned long DWORD; //主要是方便,不用敲太多字,呵呵 typedef unsigned short WORD; //这个也一样的 typedef unsigned char BYTE; (1)、IMAGE_DOS_HEADERtypedef struct IMAGE_DOS_HEADER { WORD e_magic; WORD e_cblp; WORD e_cp; WORD e_crlc; WORD e_cparhdr; WORD e_minalloc; WORD e_maxalloc; WORD e_ss; WORD e_sp; WORD e_csum; WORD e_ip; WORD e_cs; WORD e_lfarlc; WORD e_ovno; WORD e_res[4]; WORD e_oemid; WORD e_oeminfo; WORD e_res2[10]; DWORD e_lfanew; }IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER; 这里的 (2)、IMAGE_NT_HEADERS#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16 typedef struct IMAGE_NT_HEADERS { DWORD Signature; IMAGE_FILE_HEADER FileHeader; IMAGE_OPTIONAL_HEADER32 OptionalHeader; }IMAGE_NT_HEADERS,*PIMAGE_NT_HEADERS; typedef struct IMAGE_FILE_HEADER { WORD Machine; WORD NumberOfSections;//节的数量 DWORD TimeDateStamp; DWORD PointerToSymbols; DWORD NumberOfSymbols; WORD SizeOfOptionalHeader; WORD Characteristics; }IMAGE_FILE_HEADER,*PIMAGE_FILE_HEADER; typedef struct IMAGE_OPTIONAL_HEADER32 { WORD Magic; BYTE MajorLinkerVersion; BYTE MinorLinkerVersion; DWORD SizeOfCode; DWORD SizeOfInitializedData; DWORD SizeOfUnInitializedData; DWORD AddressOfEntryPoint; DWORD BaseOfCode; DWORD BaseOfData; DWORD ImgaeBase; DWORD SectionAlignment; DWORD FileAlignment; WORD MajorOperatingSystemVersion; WORD MinorOperatingsystemversion; WORD MajorImageVersion; WORD MinorImageVersion; WORD MajorSubsybtemVersion; WORD MinorSubsybtemVersion; DWORD Win32VersionValue; DWORD SizeOfImage; DWORD SizeoOfHeaders; DWORD CheckSum; WORD Subsystem; WORD DllCharacteristics; DWORD SizeOfStackReserve; DWORD SizeOfStackCommit; DWORD SizeOfHeapReserve; DWORD SizeOfHeapCommit; DWORD LoaderFlages; DWORD NumberOfRvaAndSizes; IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; }IMAGE_OPTIONAL_HEADER32,*PIMAGE_OPTIONAL_HEADER32; (3)、 IMAGE_SECTION_HEADER#define IMAGE_SIZEOF_SHORT_NAME 8 typedef struct IMAGE_SECTION_HEADER { BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; union { DWORD PhysicalAddress; DWORD VirtualSize; }Misc; DWORD VirtualAddress; //节被载到内存之后的偏移 DWORD SizeOfRawData; DWORD PointerToRawData; DWORD PointerToRelocations; DWORD PointerToLinenumbers; WORD NumberOfRelocations; WORD NumberOfLinenumbers; DWORD Characteristics; }IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER; typedef struct IMAGE_THUNK_DATA { union { DWORD ForwarderString; DWORD Function; DWORD Ordinal; DWORD AddressOfData; }u1; }IMAGE_THUNK_DATA,*PIMAGE_THUNK_DATA; typedef struct IMAGE_IMPORT_BY_NAME { WORD Hint; BYTE Name; }IMAGE_IMPORT_BY_NAME; |
随便看 |
百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。