Loading... 主要讲解NT头里的文件头和扩展头 --- 上面是32位下的NT头信息  --- Signature 是一个 特征码 ASCII 是 PE00 Signature = 00004550 C++ 宏 #define IMAGE_NT_SIGNATURE 0x00004550 --- ## IMAGE_FILE_HEADER ``` IMAGE_FILE_HEADER Struct { +04h Machine WORD ? ;运行平台 +06h NumberOfSections WORD ? ;文件区块数 +08h TimeDateStamp DWORD ? ;文件创建日期和时间 +0ch PointerOfSymbolTable DWORD ? ;指向符号表(用于调试) +10h NumberOfSymbols DWORD ? ;符号表中符号的个数 +14h SizeOfOptionalHeader WORD ? ;IMAGE_OPTIONAL_HEADER32结构大小 +16h Characteristics WORD ? ;文件属性 } ``` ## IMAGE_OPTIONAL_HANDER 32位 ``` IMAGE_OPTIONAL_HANDER STRUCT { +18h Magic WORD ? ;标志字 +1Ah MajorLinkerVersion BTYE ? ;连接器主版本号 +1Bh MinorLinkerVersion BYTE ? ;连接器次版本号 +1Ch SizeOfCode DWORD ? ;所有含有代码区块的大小 +20h SizeOfInitializedData DWORD ? ;所有初始化数据区块的大小 +24h SizeOfUninitializedData DWORD ? ;所有未初始化区块的大小 +28h AddressOfEntyrPoint DWORD ? ;程序指向入口RVA +2Ch BaseOfCode DWORD ? ;代码区块起始RVA +30h BaseOfData DWORD ? ;数据区块起始RVA +34h ImageBase DWORD ? ;程序默认载入基址 +38h SectionAlignment DWORD ? ;内存中区块的对齐值 +3Ch FileAlignment DWORD ? ;文件区块的对齐值 +40h MajorOperatingSystemVersion WORD ? ;操作系统主版本号 +42h MinorOperatingSystemVersion WORD ? ;操作系统次版本号 +44h MajorImageVersion WORD ? ;用户自定义主版本号 +46h MinorImageVersion WORD ? ;用户操作系统次版本号 +48h MajorSubsystemversion WORD ? ;所需子系统主版本号 +4Ah MinorSubsystemversion WORD ? ;所需子系统次版本号 +4Ch Win32VersionValue DWORD ? ;保留通常设置为0 +50h SizeOfImage DWORD ? ;映像载入内存后的总尺寸 +54h SizeofHeaders DWORD ? ;MS-DOS头部、PE文件头、区块表总大小 +58h CheckSum DWORD ? ;映像校验和 +5Ch Subsystem WORD ? ;文件子系统 +5Eh DllCharacteristice WORD ? ;DLL特征旗标 +60h SizeOfStackReserve DWORD ? ;初始化时栈的大小 +64h SizeOfStackCommit DWORD ? ;初始化实际提交栈的大小 +68h SizeOfheapReserve DWORD ? ;初始化时保留堆的大小 +6Ch SizeOfHeapCommit DWORD ? ;初始化实际保留堆的大小 +70h LoaderFlags DWORD ? ;与调试相关,默认值为0 +74h NumberOfRvaAndSizes DWORD ? ;数据目录表的项数 +78h DataDirectory IMAGE_DARA_DIRECTORY 16 DUP } ``` 64位 ``` IMAGE_OPTIONAL_HANDER STRUCT { +18h Magic WORD ? ;标志字 +1Ah MajorLinkerVersion BTYE ? ;连接器主版本号 +1Bh MinorLinkerVersion BYTE ? ;连接器次版本号 +1Ch SizeOfCode DWORD ? ;所有含有代码区块的大小 +20h SizeOfInitializedData DWORD ? ;所有初始化数据区块的大小 +24h SizeOfUninitializedData DWORD ? ;所有未初始化区块的大小 +28h AddressOfEntyrPoint DWORD ? ;程序指向入口RVA +2Ch BaseOfCode DWORD ? ;代码区块起始RVA +30h ImageBase ULONGLONG ? ;程序默认载入基址 +38h SectionAlignment DWORD ? ;内存中区块的对齐值 +3Ch FileAlignment DWORD ? ;文件区块的对齐值 +40h MajorOperatingSystemVersion WORD ? ;操作系统主版本号 +42h MinorOperatingSystemVersion WORD ? ;操作系统次版本号 +44h MajorImageVersion WORD ? ;用户自定义主版本号 +46h MinorImageVersion WORD ? ;用户操作系统次版本号 +48h MajorSubsystemversion WORD ? ;所需子系统主版本号 +4Ah MinorSubsystemversion WORD ? ;所需子系统次版本号 +4Ch Win32VersionValue DWORD ? ;保留通常设置为0 +50h SizeOfImage DWORD ? ;映像载入内存后的总尺寸 +54h SizeofHeaders DWORD ? ;MS-DOS头部、PE文件头、区块表总大小 +58h CheckSum DWORD ? ;映像校验和 +5Ch Subsystem WORD ? ;文件子系统 +5Eh DllCharacteristice WORD ? ;DLL特征旗标 +60h SizeOfStackReserve ULONGLONG ? ;初始化时栈的大小 +68h SizeOfStackCommit ULONGLONG ? ;初始化实际提交栈的大小 +70h SizeOfheapReserve ULONGLONG ? ;初始化时保留堆的大小 +78h SizeOfHeapCommit ULONGLONG ? ;初始化实际保留堆的大小 +80h LoaderFlags DWORD ? ;与调试相关,默认值为0 +84h NumberOfRvaAndSizes DWORD ? ;数据目录表的项数 +88h DataDirectory IMAGE_DARA_DIRECTORY 16 DUP } ``` --- DataDirectory[16] 数据目录表 由数个相同的IMAGE_DATA_DIRECTORY组成,指向输出表、输入表、资源快等数据。 ``` DataDirectory struct { VirtualAddress DWORD ? ;数据块起始RVA Size DWORD ? ;数据块长度 } ```  --- 区块表 ``` IMAGE_SECTION_HEADER STRUCT { NAME BYTE8 DUP () ;8字节的块名 union Misc PhysicalAddress DWORD ? VirtualSize DWORD ? ENds ViryualAddress DWORD ? ;区块的RVA地址 SizeOfRawData DWORD ? ;在文件中对其的尺寸 PointerToRawData DWORD ? ;文件中的偏移 PointerToRelocations DWORD ? ;在OBJ文件中使用,重定位的偏移。 PointerToLinenumbers DWORD ? ;行号表的偏移(调试用) NumberOfRelocations WORD ? ;在OBJ文件中使用重定位项数目 NumberOfLinenumber WORD ? ;行号表中行号的数目 Characteristics DWORD ? ;区块属性 } ``` 最后修改:2021 年 01 月 22 日 © 允许规范转载 赞 0 如果觉得我的文章对你有用,请随意赞赏