NT Header
NT Header是紧挨DOS MZ Header 与 DOS sub部分 ,主要包含三大部分内容PE标志,PE文件头,PE可选头
图片转自:https://blog.csdn.net/evileagle/article/details/11693499
PE 标志
PE标志又称PE签名,即是PE入口标志,共占4Byte。此部分可以通过该标志来确定PE文件入口,此部分为固定内容[50 45 00 00]小端存储方式,同时也是NT头的第一大部分
PE 标准文件头
typedef struct _IMAGE_FILE_HEADER {
+0x00 WORD Machine;
+0x02 WORD NumberOfSections;
+0x04 DWORD TimeDateStamp;
+0x08 DWORD PointerToSymbolTable;
+0x0c DWORD NumberOfSymbols;
+0x10 WORD SizeOfOptionalHeader;
+0x12 WORD Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
代码部分中+代表相对偏移量(offset)
PE-Header定义重要关键字段详解(共计20Byte)
字段 | 含义 | 大小 | 成员位置 |
---|---|---|---|
Machine | 可以运行在什么样CPU上 | 2Byte | 1 |
NumberOfSections | 表示段的数量 | 2Byte | 2 |
TimeDateStamp | 编译器写入的时间戳,与文件的创建时间,修改时间这些无关 | 4Byte | 3 |
SizeOfOptionalHeader | 指定PE扩展头大小 | 2Byte | 6 |
Characteristics | 文件属性,信息标记等 | 2Byte | 7 |
Machine字段补充说明
常见的一些Machine字段取值说明,均为小端存储
- [4C 01]<14C:Intel 386以及后续>
- [64 86]<8664 x64框架>
- [00 00]<任意>
NumberOfSections字段补充说明
指明PE文件包含段的个数,例如 .text(代码段)、.rdata(只读数据段)、 .data(全局变量数据段)等
TimeDateStamp字段补充说明
从1970.1.1 00:00:00以来的秒数,他与文件的创建时间,修改时间这些无关
SizeOfOptionalHeader字段补充说明
默认32位PE文件则是224Byte [E0 00], 64位PE文件位240Byte [F0 00]
Characteristics字段补充说明
转为二进制,通过每一位组合后来查看含义,比如可以区分文件是exe还是dll等
综上所述PE标准文件头大小固定,且为20Byte,共7大成员字段。其中关键字段成员为以上5大字段成员内容。
继续以Kernel32.dll进行分析
根据图中数据可以进行分析
字段 | 含义 | 数值(小端存储) |
---|---|---|
Machine | Intel 386以及后续CPU运行 | 4C01 |
NumberOfSections | 表示段的数量为5 | 0500 |
TimeDateStamp | 编译器写入的时间戳 | 871FB759 |
SizeOfOptionalHeader | 指定PE扩展头大小为224Byte | E000 |
Characteristics | 文件属性信息标记二进制位为 | 0221 |
从分析中可以得出关键信息:此Kernel32.dll运行在的CPU环境以及使用是属于的32位PE文件
关于Characteristics的分析 由于小端存储位0221实际存储位2102即二进制位0010 0001 0000 0010 拼接的数据,可根据查询各个位代表含义为:
第1位:文件是可执行的
第8位:只在32位平台上运行
第13位:这是一个DLL文件
通过分析3个1的位置得出文件属性结论:分析的kernel32.dll是一个可以在32位平台执行的dll文件
补充 关于Characteristics字段详解
位置 | 符号 | 含义 |
---|---|---|
0 | IMAGE_ FILE_ RELOCS STRIPPED | 文件中不存在重定位信息 |
1 | IMAGE_ FILE_ EXECUTABLE_ IMAGE | 文件是可执行的 |
2 | IMAGE_ FILE_ LINE NUMS_STRIPPED | 不存在行信息 |
3 | IMAGE_ FILE_ LOCAL. SYMS_ STRIPPED | 不存在符号信息 |
4 | IMAGE_ FILE_ AGGRESSIVE_ Ws_ TRIM | 调整工作集 |
5 | IMAGE_ FILE_ LARGE_ ADDRESS _AWARE | 应用程序可处理大于2GB的地址 |
6 | 此标志保留 | |
7 | IMAGE_ FILE_ BYTES_REVERSED_LO | 小尾方式 |
8 | IMAGE_ FILE_ 32BIT _MACHINE | 只在32位平台上运行 |
9 | IMAGE_ FILE_ DEBUG STRIPPED | 不包含调试信息 |
10 | IMAGE_ FILE_ REMOVABLE RUN_ FROM_ SWAP | 不能从可移动盘运行 |
11 | IMAGE_ FILE NET_ RUN_ FROM_SWAP | 不能从网络运行 |
12 | IMAGE_ FILE_ SYSTEM | 系统文件(如驱动程序),不能直接运行 |
13 | IMAGE_ FILE_ DLL | 这是一个DLL文件 |
14 | IMAGE_ FILE_ UP_ SYSTEM_ONLY | 文件不能在多处理器计算机上运行 |
15 | IMAGE_ FILE_BYTES_ REVERSED_ HI | 大尾方式 |