详细解释:这里的结构体代码详细描述了上述结构
MS-DOS头:
//DOS头
//typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header
// WORD e_magic; // Magic number 0x5A4D
// WORD e_cblp; // 文件末页字节数
// WORD e_cp; // 文件页数
// WORD e_crlc; // 重定位项的数目
// WORD e_cparhdr; // 区段中头部大小
// WORD e_minalloc; // 最小内存附加段需求
// WORD e_maxalloc; // 最大内存附加段需求
// WORD e_ss; // 初始SS值
// WORD e_sp; // 初始SP值
// WORD e_csum; // 校验和
// WORD e_ip; // 初始IP值(程序入口点)
// WORD e_cs; // 初始CS值
// WORD e_lfarlc; // 重定位表偏移
// WORD e_ovno; // 代码附加数
// WORD e_res[4]; // Reserved words
// WORD e_oemid; // OEM identifier (for e_oeminfo)
// WORD e_oeminfo; // OEM information; e_oemid specific
// WORD e_res2[10]; // Reserved words
// LONG e_lfanew; // PE头的偏移
//} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
PE头
//PE文件头(PE头)
//typedef struct _IMAGE_FILE_HEADER {
// WORD Machine; //运行平台,一般为IMAGE_FILE_MACHINE_I386
// WORD NumberOfSections; //区段的数量
// DWORD TimeDateStamp; //文件的创建时间
// DWORD PointerToSymbolTable; //符号表指针,一般为0
// DWORD NumberOfSymbols; //符号表中符号的数量
// WORD SizeOfOptionalHeader; //在IMAGE_FILE_HEADER结构后面的扩展头大小,一般为0x00E0
// WORD Characteristics; //文件属性,EXE文件(IMAGE_FILE_EXECUTABLE_IMAGE)为0x010F,DLL(IMAGE_FILE_DLL)为0x210
//} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
PE文件头
//PE文件头(PE头)
//typedef struct _IMAGE_FILE_HEADER {
// WORD Machine; //运行平台,一般为IMAGE_FILE_MACHINE_I386
// WORD NumberOfSections; //区段的数量
// DWORD TimeDateStamp; //文件的创建时间
// DWORD PointerToSymbolTable; //符号表指针,一般为0
// DWORD NumberOfSymbols; //符号表中符号的数量
// WORD SizeOfOptionalHeader; //在IMAGE_FILE_HEADER结构后面的扩展头大小,一般为0x00E0
// WORD Characteristics; //文件属性,EXE文件(IMAGE_FILE_EXECUTABLE_IMAGE)为0x010F,DLL(IMAGE_FILE_DLL)为0x210
//} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
PE可选头
//PE可选头
//typedef struct _IMAGE_OPTIONAL_HEADER {
// //
// // Standard fields.
// //
//
// WORD Magic; //文件类型标识(普通可执行映像0x010B、ROM镜像为0x0170、PE32+为0x020B)
// BYTE MajorLinkerVersion; //链接器的主版本号。
// BYTE MinorLinkerVersion; //链接器的子版本号。
// DWORD SizeOfCode; //所有IMAGE_SCN_CNT_CODE属性的区段总大小,此大小在计算时按照磁盘扇区字节数的整数倍计算。
// DWORD SizeOfInitializedData; //已初始化的数据块大小。
// DWORD SizeOfUninitializedData;//未初始化的数据块大小,装载程序需要在虚拟地址空间中为这些
//数据保留空间,但是这些块在磁盘中并不占用任何空间(在程序
//运行之前没有指定的值),未初始化的数据通常都位于一个名称为.bbs的区段中。
// DWORD AddressOfEntryPoint; //程序执行入口的RAV,一般指向运行时的库代码,然后再调用main
//在DLL文件中,这个入口
//点有可能在进程初始化、进程关闭、线程创建与线程关闭时被调用,
//并且鉴于DLL文件的特殊性,这个入口点在DLL文件中可以被置为0
// DWORD BaseOfCode; //代码段的起始RVA,这个值通常为0x00001000
// DWORD BaseOfData; //数据段的起始RVA,数据段通常位于PE文件头与代码段之后
//
// //
// // NT additional fields.
// //
//
// DWORD ImageBase; //文件在内存中的首选装入,地址加载器将试图在此地址装
//入这个映像文件,如果载入成功,则装载器将跳过应用基
//址重定位的步骤,如果此地址被占用,则加载器会重新在
//正确对齐的合法地址中选择一个作为实际装载地址。
// DWORD SectionAlignment; //映像文件在被装入内存时的区段对齐大小
// DWORD FileAlignment; //映像文件在磁盘上的区段对齐大小
// WORD MajorOperatingSystemVersion;//要求操作系统最低版本的主版本号
// WORD MinorOperatingSystemVersion;//要求操作系统最低版本的子版本号
// WORD MajorImageVersion; //此可执行文件的主版本号,此版本号由程序作者指定
//(它与后一个字段成对使用,可以被置为0,可以通过连接器开关 / VERSION控制)
// WORD MinorImageVersion; //此可执行文件的子版本号,此版本号由程序作者指定
// WORD MajorSubsystemVersion; //要求最低子系统的主版本号(与后一个字段成对使用,一
//般情况下其值为4,可以通过连接器开关 / SUBSYSTEM控制)。
// WORD MinorSubsystemVersion; //要求最低子系统的子版本号
// DWORD Win32VersionValue; //这是一个保留值,且必须为0x00000000
// DWORD SizeOfImage; //映像文件装入内存后的总大小(从Image Base
//到最后一个区段的总大小)
// DWORD SizeOfHeaders; //是MS-DOS头、PE头、区块表的尺寸之和
// DWORD CheckSum; //映像文件的校验和(在内核模式的驱动和系统dll中必须为有效值)
// WORD Subsystem; //可执行文件所期望的子系统值IMAGE_SUBSYSTEM_WINDOWS_GUI
// WORD DllCharacteristics; //DllMain()函数何时被调用,默认为0
// DWORD SizeOfStackReserve; //在EXE文件中,为线程保留的堆栈大小
// DWORD SizeOfStackCommit; //在EXE文件中,栈初始内存大小(默认4KB)
// DWORD SizeOfHeapReserve; //在EXE文件中,为进程默认堆保留的内存(默认1MB)
// DWORD SizeOfHeapCommit; //在EXE文件中,每次指派给堆的内存大小(默认4KB)
// DWORD LoaderFlags; //与调试有关,默认为0
// DWORD NumberOfRvaAndSizes; //数据目录成员的数量,一般为0x00000010(16个)
//数据目录表
// IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
//} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
数据目录表
//数据目录表
//typedef struct _IMAGE_DATA_DIRECTORY {
// DWORD VirtualAddress; // 数据起始块的RVA地址
// DWORD Size; // 数据块的长度
//} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
区段表
//区段表
//typedef struct _IMAGE_SECTION_HEADER {
// BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; //区段名,一般情况下以.开头
// union {
// DWORD PhysicalAddress; //
// DWORD VirtualSize; //
// } Misc; //实际被使用的区段大小
// DWORD VirtualAddress; //此区段载入内存后的RAV
// DWORD SizeOfRawData; //此区段在磁盘中的体积,这个地址是按照文件页对齐
//的(恒为PE头结构中FileAlignment字段的整数倍)
// DWORD PointerToRawData; //此区段在文件中的偏移
// DWORD PointerToRelocations; //此区段重定位表的偏移地址,它指向IMAGE_RELOCATION结构数组
// DWORD PointerToLinenumbers; //行号表在文件中的偏移
// WORD NumberOfRelocations; //此区段重定位表项的数量
// WORD NumberOfLinenumbers; //行号表项的数量
// DWORD Characteristics; //区段属性,用以描述此区段的读写情况、状态等属性
//IMAGE_SCN_MEM_READ(可读)
//} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;