第 7 页 共 35 页
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
在 WinHex 中打开 Roll.exe。
IMAGE_FILE_HEADER 结构如下图所示:
结合图,分析如下:
Machine 值为 014Ch,对应 IMAGE_FILE_32BIT_MACHINE 常数,即 32 位机器,其他值请
查阅 winnt.h。
接着两个字节表示 NumberOfSections 区段的个数,值为 0004h,也就是我们的 Roll.
exe 有 4 个区段。
SizeOfOptionalHeader 位于 12Ch,12Dh,值为 00E0h,即后面的 Optional Header 结构
总长为 224 字节。
再看一个 Characteristics,表示这个 PE 文件的类型,图中位于 12Eh 到 12Fh,值为
010Fh,如果它的值是 2XXXh,则表示是一个 DLL,具体还请查阅 winnt.h。
Characteristics 是由 16 位组成的一组标志,其中有些标志位仅对 OBJ 文件和 DLL
文件有效。各标志位含义如下:
Bit 0 (IMAGE_FILE_RELOCS_STRIPPED) 置位时表示文件中不包含有重定位信息。这里
的重定位信息是指每个块中的重定位信息。对于 EXE 文件该位无效,因为 EXE 文件中的重
定位信息将在数据目录表 DataDirectory 中的 Base Relocation 描述。
Bit 1 (IMAGE_FILE_EXECUTABLE_IMAGE) 置位时表示文件可以执行,而不是 OBJ 文件
或库文件。这一位在编译连接阶段也有其它特殊的含义。
Bit 2 (IMAGE_FILE_LINE_NUMS_STRIPPED) 置位时表示文件每行的行序号已经去掉。
对于 EXE 文件该位无效。
Bit 3 (IMAGE_FILE_LOCAL_SYMS_STRIPPED) 置位时表示文件没有关于局部符号的信
息。对于 EXE 文件该位无效。
Bit 8 (IMAGE_FILE_32BIT_MACHINE) 置位时表示运行机器要求是 32 位的,一般总是
置为 1。
Bit 9 (IMAGE_FILE_DEBUG_STRIPPED) 置位时表示文件中没有调试信息。
Bit 10 (IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP) 置位时表示文件不可以在可移动存
储介质如光盘和软盘上运行,因而操作系统会将它拷贝到硬盘上的交换文件中运行。
Bit 11 (IMAGE_FILE_NET_RUN_FROM_SWAP) 置位时表示文件不可以在网络上运行,同
样操作系统会将它拷贝到硬盘上的交换文件中运行。
Bit 12 (IMAGE_FILE_SYSTEM) 置位时表示文件是系统文件,比如是一个驱动程序文件。
对于 EXE 文件该位无效,在 NT 驱动程序中该位也无效。
Bit 13 (IMAGE_FILE_DLL) 置位时表示文件是 DLL 文件。
Bit 14 (IMAGE_FILE_UP_SYSTEM_ONLY) 置位时表示文件不能运行于多处理器系统,否
则会产生不可预期的后果。
winnt.h 中定义的数字与标志位的置位关系为:
如 #define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004
0x0004 的二进制为 00000100,表示第二位被置位。
IMAGE_OPTIONAL_HEADER 结构: