标题：PE格式
概述：
PE（Portable Executable）格式，是微软Win32环境可移植可执行文件(如exe、dll、vxd、sys和vdm等)的标准文件格式。PE格式衍生于早期建立在VAX(R)VMS(R)上的COFF(Common Object File Format)文件格式。Portable 是指对于不同的Windows版本和不同的CPU类型上PE文件的格式是一样的，当然CPU不一样了，CPU指令的二进制编码是不一样的。只是文件中各种东西的布局是一样的。 
PE文件使用的是一个平面地址空间，所有代码和数据都合并在一起，组成一个很大的结构。主要有：
  PE文件格式[1]下面是一个简化的PE文件格式
简化PE文件格式 DOS MZ Header
DOS StubPE HeaderSection TableSection 1Section 2...Section nDos 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;