1.MS-DOS头部:使得操作系统能够读取这个文件并明白他是不是和当前系统兼容,占64字节
typedef struct _IMAGE_DOS_HEADER
{
USHORT e_magic;//魔术数字,用于表示MS_DOS兼容的文件类型,兼容的都将此值设置为0x5A4D,表示ASC字符MZ
USHORT e_cblp;//文件最后页的字节数
USHORT e_cp;//文件页数
USHORT e_crlc;//重定义元素个数
USHORT e_parhdr;//头部尺寸,以段落为单位
USHORT e_minalloc;//所需的最小附加段
USHORT e_maxalloc;//所需的最大附加段
USHORT e_ss;//初始的SS值
USHORT e_sp;//初始的sp值
USHORT e_csum;//校验和
USHORT e_ip;//初始的IP值
USHORT e_cs;//初始的cs值(相对偏移量)
USHORT e_lfarlc;//重分配表文件地址
USHORT eovno;//覆盖号
USHORT e_res[4];//保留字
USHORT e_oemid;//OEM标识符(相对e_oeminfo)
USHORT e_oeminfo;//OEM信息
USHORT e_res2[10];//保留字
LONG e_lfanew;//新exe头部的文件地址,4字节的偏移量,PE文件头由它定位
}IAMGE_DOS_HEADER,*PIMAGE_DOS_HEADER;
2.实模式残余程序
装载时能够被MS_DOS运行的实际程序
对于MS_DOS的可执行映像文件,应用程序是从这里执行的
3.PE文件头部与标志
MS_DOS头部的e_lfanew给出了PE文件头部的定位,给出了文件的偏移量
#define NTSIGNTURE(a) ( (LPVOID)((BYTE*)a + ((PIMAGE_DOS_HEADER)a)->e_lfanew) )
上面的宏定义给出了PE文件标志,并非PE文件头部的偏移量,文件头部是在DWORD标识还是DWROD标识之后,是由是否是
WindowsNT文件标志所决定的
------------WINNT.H
#define IMAGE_DOS_SIGNATURE 0x5A4D //MZ
#define IAMGE_OS/2_SIGNATURE 0X454E //NE
#define IMAGE_OS/2_SIGNATURE 0x454C //LE
#define IMAGE_NT_SIGNATURE 0x00004550 //PE
-----------
#define PEFHDROFFSET(a) ( (LPVOID)((BYTE*)a + (PIMAGE_DOS_HEADER)a)->e_lfanew + SIZE_OF_NT_SINGATURE )
typedef struct _IMAGE_FILE_HEADER
{
USHORT Machine;//用来表示可执行文件被构建的目标机器种类
USHORT NumberOfSections;//PE文件的段数目
ULONG TimeDateStamp;
ULONG PointerToSymbolTable;
ULONG NumberOfSymbols;
USHORT SizeOfOptionalHeader;//表示IAMGE_OPTIONAL_HEADER的大小
USHORT Characteristics;//表示文件的一些特征
}IMAGE_FILE_HEADER,* PIMAGE_FILE_HEADER;
4.PE可选头部
#define OPTHDROFFSER(a) ((LPVOID)((BYTE*)a + ((PIAMGE_DOS_HEADER)a)->elfanew +
SIZE_OF_NT_SIGNATURE + sizeof(IMAGE_FILE_HEADER) ) )
typedef struct _IMAGE_OPTIONAL_HEADER
{
//Standard fields
WORD Magic;
BYTE MajorLinkerVersion;
BYTE MinorLinkerVersion;
DWORD SizeofCode; //可执行代码尺寸
DWORD SizeOfInitializedData;已初始化数据的尺寸
DWORD SizeOfUninitializeData;//未初始化数据的尺寸
DWORD AddressOfEntryPoint;//程序执行入口RVA,对于黑客来说,这个位置是IAT的末尾
DWORD BaseOfCode;//已载入映像的代码(.text段)的相对偏移量
DWORD BaseOfData;//已载入映像的未初始化数据(.bss段)的相对偏移量
//NT additional fields
ULONG ImageBase;//进程映像地址空间中的首选基地址,默认为0x00400000
ULONG SectionAlignment;//从ImageBase开始,每个段被装载时的最小空间数量,即段是关于SectionAlignment对齐的
ULONG FileAlignment;//映像文件首先装载的信息块间隔。PE文件内的区块对齐大小,一般是0x200或0x1000
USHORT MajorOperatingSystemVersion;//Windows NT操作系统的主版本号
USHORT MinorOperationSystamVersion;//windows NT操作系统的次版本号
USHORT MajorImageversion;//应用程序的主版本号
USHORT MinorImageVersion;//应用程序的此版本号
USHORT MajorSubsystemVersion;//Windows NT Win32子系统的主版本号
USHORT MinorSubsystemVersion;//Widnows NT Win32子系统的次版本号
ULONG Reserved1; //保留
ULONG SizeOfImage;//映像装入内存后的总大小
ULONG SizeOfHeaders;//MS_DOS头部和PE头部+区块表的总大小
ULONG CheckSum;//映像的校验和
USHORT Subsystem;
USHORT DllCharacteristics;
ULONG SizeOfStackReserve;
ULONG SizeOfStackCommit;
ULONG SizeofHeapReserve;
ULONG SizeofHeapCommit;
ULONG LoaderFlags;
ULONG NumberOfRvaAndSizes;//用来标识接下来的数组
IAMGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];//数据目录表
}IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;
typedef struct _IAMGE_DATA_DIRECTORY
{
ULONG VirtualAddress;
ULONG Size;
}IMAGE_DATA_DIRECTORY,* PIAMGE_DATA_DIRECTORY;
段包含了文件的内容,,包括代码,数据,资源以及其他可执行信息
每个段都有一个头部和实体