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位,对比上面的表格可以知道代表了什么含义,表示了哪些文件属性。
对比如下: