PE文件结构
Posted shinymood
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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:栈区
常量区
以上是关于PE文件结构的主要内容,如果未能解决你的问题,请参考以下文章