PE文件结构

在win32 SDK的文件winnt.h中有PE文件格式的定义/

一个MS-DOS头部 IMAGE_DOS_HEADER

一个是DOS的程序残余以及一个PE文件标志

 

PE文件头和可选头部: IMAGE_NT_HEADERS

typedef struct IMAGE_NT_HEADERS
  {
        DWORD Signature;
        IMAGE_FILE_HEADER FileHeader; // PE文件头
        IMAGE_OPTIONAL_HEADER32 OptionalHeader; // 可选头部
  }IMAGE_NT_HEADERS,*PIMAGE_NT_HEADERS; 
typedef struct _IMAGE_OPTIONAL_HEADER {
  WORD                 Magic;
  BYTE                 MajorLinkerVersion;
  BYTE                 MinorLinkerVersion;
  DWORD                SizeOfCode;
  DWORD                SizeOfInitializedData;
  DWORD                SizeOfUninitializedData;
  DWORD                AddressOfEntryPoint;
  DWORD                BaseOfCode;
  DWORD                BaseOfData;
  DWORD                ImageBase;
  DWORD                SectionAlignment;
  DWORD                FileAlignment;
  WORD                 MajorOperatingSystemVersion;
  WORD                 MinorOperatingSystemVersion;
  WORD                 MajorImageVersion;
  WORD                 MinorImageVersion;
  WORD                 MajorSubsystemVersion;
  WORD                 MinorSubsystemVersion;
  DWORD                Win32VersionValue;
  DWORD                SizeOfImage;
  DWORD                SizeOfHeaders;
  DWORD                CheckSum;
  WORD                 Subsystem;
  WORD                 DllCharacteristics;
  DWORD                SizeOfStackReserve;
  DWORD                SizeOfStackCommit;
  DWORD                SizeOfHeapReserve;
  DWORD                SizeOfHeapCommit;
  DWORD                LoaderFlags;
  DWORD                NumberOfRvaAndSizes;
  IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;

AddressOfEntryPoint,表示程序的入口点。

A pointer to the entry point function, relative to the image base address. For executable files, this is the starting address. For device drivers, this is the address of the initialization function. The entry point function is optional for DLLs. When no entry point is present, this member is zero.

程序入口的RVA,对于exe这个地址可以理解为WinMain的RVA。对于DLL,这个地址可以理解为DllMain的RVA,如果是驱动程序,可以理解为DriverEntry的RVA。当然,实际上入口点并非是WinMain,DllMain和DriverEntry,在这些函数之前还有一系列初始化要完成,当然,这些不是本文的重点。

 

ImageBase:映象(加载到内存中的PE文件)的基地址,这个基地址是建议,对于DLL来说,如果无法加载到这个地址,系统会自动为其选择地址。

 

typedef struct _IMAGE_DATA_DIRECTORY {
DWORD VirtualAddress; // 导入表或者导出表的RVA
DWORD Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;



所有的结头部,

所有的节实体

SECTION:

  导出表:.edata

    里面有导出函数的名字和RVA

  导入表:.idata

     .rdata:运行期的只读数据

  代码节:.text(必包含)里面包含编译和汇编结束后产生的一种块,里面有指令代码

  数据节:.data(必包含)初始化的数据块,全局数据区,用来存放全局变量和静态变量。

  重定位表:.reloc

  资源节, .rsrc:包含模块的所有资源

一些其它的区域,其中是一些混杂的信息,包括重分配信息 、符号表信息、行号信息以及字串表数据。

 

 

 

内存映射文件,允许用户使用一个简单的指针来存取文件中所包含的数据,因此所有的示例都使用了内存映射文件来存取PE文件中的数据。 

 

Windows装载器 装载,构成内存,执行。

Windows装载器在装载的时候仅仅建立好虚拟地址和PE文件之间的映射关系,只有真正执行到某个内存页中的指令或访问某一页中的数据时,这个页才会被从磁盘提交到物理内存。

 

 

http://www.cnblogs.com/tk091/archive/2012/09/04/2670936.html

http://blog.csdn.net/evileagle/article/details/11903197

 

 

PE文件被载入内存后,和硬盘中的PE文件布局没有太大差别:

.text:代码区(只读)经常合并了.rdata,.edata这些只读区

.data:全局数据取(可读可写)

heap:堆区

statck:栈区

常量区

posted @ 2017-05-21 01:09  shinymood  阅读(312)  评论(0编辑  收藏  举报