一、PE头IMAGE_NT_HEADER的字段
首先再看一下 IMAGE_NT_HEADER 的结构
typedef struct _IMAGE_NT_HEADERS {
DWORD Signature; IMAGE_FILE_HEADER FileHeader; IMAGE_OPTIONAL_HEADER32 OptionalHeader;} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
1、IMAGE_NT_HEADER.Signature
PE文件标识 ,4字节大小,被定义为0x00004550,ASCII就是"PE00",更改其中任意一个字节,操作系统都无法正确识别PE文件
2、IMAGE_NT_HEADER.FileHeader
该结构指向 IMAGE_FILE_HEADER ,由于PE扩展自通用COFFEE规范,所以,该字段在官方文档中被称为标准COFF头
3、IMAGE_NT_HEADER.OptionalHeader
该结构指向 IMAGE_OPTIONAL_HEADER32 ,windows操作系统可执行文件的大部分特性均在这个结构里呈现
因为符合COFF规范的".obj"目标文件中该部分并不存在,所以该部分被称为OptionHeader(可选的头部信息,简称“可选头”),它是操作系统映像文件所独有的头部信息
可选头分为两部分,前10个字段属于原COFF,用来加载运行一个可执行文件;后21个字段则是通过链接器追加的。它们作为PE扩展部分,用于描述可执行文件的一些信息,供PE加载器使用
二、标准PE头 IMAGE_FILE_HEADER 的字段
1、IMAGE_FILE_HEADER.Machine
这个字段可以表示文件的运行平台
一般只要记住0x014c代表的是i386,也就是平时的Intel32位平台,这个平台平时用的最多
还有其他值代表的平台:
2、IMAGE_FILE_HEADER.NumberOfSections
文件中存在的节的总数
在Windows XP中,可以有0个节,但是这个值不能小于1,也不能大于96
如果将这个值设置为0,操作系统会提示不是有效的Win32程序
如果想在PE中增加或删除节,这个值也必须要改变
比如说在写壳的时候增加了一个区段用来放壳代码,那么这个值就要+1
3、IMAGE_FILE_HEADER.TimeDateStamp
编译器创建此文件时的时间戳,存放的是自1970/1/1 00:00 开始到创建时间为止的总秒数
解析数据可以用到tm结构体
struct tm{
int tm_sec; //