PE头
typedef struct _IMAGE_NT_HEADERS {
DWORD Signature; //PE标识
IMAGE_FILE_HEADER FileHeader; //标准PE头
IMAGE_OPTIONAL_HEADER32 OptionalHeader; //扩展PE头
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
成员 |
大小(十进制) |
Signature |
4字节 |
IMAGE_FILE_HEADER |
20字节 |
IMAGE_OPTIONAL_HEADER32 |
224字节 |
PE标识
PE标识不能被破坏,操作系统在启动一个程序的时候会检测这个标识。
标准PE头
typedef struct _IMAGE_FILE_HEADER {
WORD Machine; //可以运行在什么样的CPU上 任意:0 Intel 386以及后续:14C x64:8864
WORD NumberOfSections; //表示节的数量
DWORD TimeDateStamp; //编译器填写的时间戳,与文件属性里面的创建时间、修改时间无关
DWORD PointerToSymbolTable; //调试相关
DWORD NumberOfSymbols; //调试相关
WORD SizeOfOptionalHeader; //可选PE头的大小(32位PE文件:0xE0 64位PE文件:0xF0)
WORD Characteristics; //文件属性
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
成员 |
大小(十进制) |
Machine |
2字节 |
NumberOfSections |
2字节 |
TimeDateStamp |
4字节 |
PointerToSymbolTable |
4字节 |
NumberOfSymbols |
4字节 |
SizeOfOptionalHeader |
2字节 |
Characteristics |
2字节 |
IMAGE_FILE_HEADER->Characteristics(文件属性)
数据位 |
常量符号 |
为1时的含义 |
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_AGGRESSVIE_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 |
大尾方式 |
剖析IMAGE_FILE_HEADER->Characteristics
- 如上图所示,Characteristics 为 0F 01,由于是小端存储所以是 01 0F。
- 01 0F 转换为二进制:0000 0001 0000 1111。
- 转换为二进制后总共16位,对比上面的表格可以知道代表了什么含义,表示了哪些文件属性。
对比如下: