PE 结构-2
帐 号: 注册帐号
密 码:  找回密码
      记住用户名和密码
PE 结构-2

IMAGE_DOS_HEADER的定义如下:
IMAGE_DOS_HEADER STRUCT  
{//(注:最左边是文件头的偏移量。)  
+0h  WORD e_magic       //Magic DOS signature MZ(4Dh 5Ah)             DOS可执行文件标记  
+2h  WORD e_cblp        //Bytes on last page of file    
+4h  WORD e_cp          //Pages in file  
+6h  WORD e_crlc        //Relocations  
+8h  WORD e_cparhdr         //Size of header in paragraphs  
+0ah WORD e_minalloc            //Minimun extra paragraphs needs  
+0ch WORD e_maxalloc        //Maximun extra paragraphs needs  
+0eh WORD e_ss          //intial(relative)SS value              DOS代码的初始化堆栈SS  
+10h WORD e_sp          //intial SP value                   DOS代码的初始化堆栈指针SP  
+12h WORD e_csum        //Checksum  
+14h WORD e_ip          //intial IP value                   DOS代码的初始化指令入口[指针IP]  
+16h WORD e_cs          //intial(relative)CS value              DOS代码的初始堆栈入口  
+18h WORD e_lfarlc      //File Address of relocation table  
+1ah WORD e_ovno        //Overlay number  
+1ch WORD e_res[4]      //Reserved words  
+24h WORD e_oemid       //OEM identifier(for e_oeminfo)  
+26h WORD e_oeminfo         //OEM information;e_oemid specific   
+29h WORD e_res2[10]        // Reserved words  
+3ch DWORD e_lfanew             //Offset to start of PE header                   指向PE文件头  
} IMAGE_DOS_HEADER ENDS  
PE Header 是PE相关结构NT映像头(IMAGE_NT_HEADER)的简称,里边包含着许多PE装载器用到的重要字段。IMAGE_NT_HEADERS 结构的定义:
IMAGE_NT_HEADERS STRUCT 
+0h  DWORD  Signature;
+4h  IMAGE_FILE_HEADER  FileHeader;
+18h IMAGE_OPTIONAL_HEADER32  OptionalHeader;
} IMAGE_NT_HEADERS ENDS
Signature 字段:在一个有效的 PE 文件里,Signature 字段被设置为00004550h,ASCII 码字符是“PE00”。标志这 PE 文件头的开始。“PE00” 字符串是 PE 文件头的开始,DOS 头部的 e_lfanew 字段正是指向这里,如上图所示。

IMAGE_FILE_HEADER 结构定义:
typedef struct _IMAGE_FILE_HEADER 
{
+04h   WORD    Machine;                    // 运行平台
+06h  WORD  NumberOfSections;// 文件的区块数目
+08h  DWORD TimeDateStamp;// 文件创建日期和时间
+0Ch  DWORD PointerToSymbolTable;// 指向符号表(主要用于调试)
+10h  DWORD NumberOfSymbols;// 符号表中符号个数(同上)
+14h  WORD  SizeOfOptionalHeader;// IMAGE_OPTIONAL_HEADER32 结构大小
+16h  WORD  Characteristics;        // 文件属性
} IMAGE_FILE_HEADER,  *PIMAGE_FILE_HEADER;
(1)Machine:可执行文件的目标CPU类型。
IMAGE_FILE_MACHINE_I386 0x014c  x86
IMAGE_FILE_MACHINE_IA64 0x0200  Intel Itanium
IMAGE_FILE_MACHINE_AMD64 0x8664 x64
(2)NumberOfSection: 区块的数目。(注:区块表是紧跟在 IMAGE_NT_HEADERS 后边的)
(3)TimeDataStamp: 表明文件是何时被创建的。
这个值是自1970年1月1日以来用格林威治时间(GMT)计算的秒数,这个值是比文件系统(FILESYSTEM)的日期时间更加精确的指示器。
提示:VC的话可以用_ctime 函数或者 gmtime 函数。
(4)PointerToSymbolTable: COFF 符号表的文件偏移位置,现在基本没用了。
(5)NumberOfSymbols: 如果有COFF 符号表,它代表其中的符号数目,COFF符号是一个大小固定的结构,如果想找到COFF 符号表的结束位置,则需要这个变量。
(6)SizeOfOptionalHeader: 紧跟着IMAGE_FILE_HEADER 后边的数据结构(IMAGE_OPTIONAL_HEADER)的大小。(对于32位PE文件,这个值通常是00E0h;对于64位PE32+文件,这个值是00F0h )。
(7)Characteristics: 文件属性,有选择的通过几个值可以运算得到。( 这些标志的有效值是定义于 winnt.h 内的 IMAGE_FILE_** 的值,具体含义见下表。普通的EXE文件这个字段的值一般是 0100h,DLL文件这个字段的值一般是 210Eh。)

copyright:2016-2020|邮箱:imalib@vip.163.com

蜀ICP备16020986号