一.PE文件结构纵览
PE文件的结构如上图所示,由低地址到高地址分别为:Dos头,PE头,块表,块,调试信息。其中真正的PE文件头是位于Dos头的后面的部分。
上图为利用PE工具打开的一个可执行文件在磁盘中的映射,这就是PE文件的内部信息。
可以看到这个文件的钱两个字节为”4D 5A”,表示的就是Dos头的第一个字段的额信息,标示Dos的头部。在Dos头结构的最后一个字段是一个指针,这个指针指向PE头。在上图中可以看到00 00 00 60表示的就是这个指针的值,它指向这个PE文件的真正PE头。根据这个地址可以找到PE头开始的地方,45 50表示的就是PE头结构的而第一个字段,标示的就是PE头。可以看到,PE文件的结构十分分明,没有一块多余的地方,各个部分排列紧凑,井井有条。我们获取PE文件的信息就是通过读取这个2进制文件。
二.Dos 头(Dos Header)
Dos头中的信息存储在IMAGE_DOS_HEADER中。这个结构的定义为:
IMAGE_DOS_HEADER STRUCT
{
+0hWORDe_magic //Magic DOS signature MZ(4Dh 5Ah) DOS 可执行文件标记
+2h WORD e_cblp //Bytes on last page of file
+4hWORD e_cp //Pages in file
+6hWORD e_crlc //Relocations
+8hWORD e_cparhdr //Size of header in paragraphs
+0ahWORD e_minalloc //Minimun extra paragraphs needs
+0chWORD e_maxalloc //Maximun extra paragraphs needs
+0ehWORD e_ss //intial(relative)SS value DOS 代码的初始化堆栈SS
+10hWORD e_sp //intial SP value DOS 代码的初始化堆栈指针SP
+12hWORD e_csum //Checksum
+14hWORD e_ip // intial IP value DOS 代码的初始化指令入口[指针IP]
+16hWORD e_cs //intial(relative)CS value DOS 代码的初始堆栈入口
+18hWORD e_lfarlc //File Address of relocation table
+1ahWORD e_ovno // Overlay number
+1chWORD e_res[4] //Reserved words
+24hWORD e_oemid // OEM identifier(for e_oeminfo)
+26hWORD e_oeminfo // OEM information;e_oemid specific
+29hWORD e_res2[10] // Reserved words
+3chDWORD e_lfanew //Offset to start of PE header 指向PE 文件头
} IMAGE_DOS_HEADER ENDS
在Image_Dos_Header 中有几个成员是很重要的,第一个magic,这个字段是来标示是否为Dos 程序的,如果是的话那么就会有MZ 的