一. DOS头
原来为DOS系统使用,现在只需要记住如下两项。
1、DOC头:
WORD e_magic * "MZ标记" 用于判断是否为可执行文件.
DWORD e_lfanew; * PE头相对于文件的偏移,用于定位PE文件
如上图所示,DOS头一共40H个字节,即64个字节。
结尾处4个字节指向了标准PE头的位置:D8。在这中间的文字是编译器加入的一些描述信息。这些字节是可以修改的。
二. NT头
NT头中包括了标准PE头和可选PE头。
struct _IMAGE_NT_HEADERS {
0x00 DWORD Signature; //E8的位置,也就是DOS头中e_lfanew指向的位置。
0x04 _IMAGE_FILE_HEADER FileHeader;
0x18 _IMAGE_OPTIONAL_HEADER OptionalHeader;
};
三. 标准PE头
标准PE头一共20个字节。
2、标准PE头:
WORD Machine; * 程序运行的CPU型号:0x0 任何处理器/0x14C 386及后续处理器
WORD NumberOfSections; * 文件中存在的节的总数,如果要新增节或者合并节 就要修改这个值.
DWORD TimeDateStamp; * 时间戳:文件的创建时间(和操作系统的创建时间无关),编译器填写的.
DWORD PointerToSymbolTable;
DWORD NumberOfSymbols;
WORD SizeOfOptionalHeader; * 可选PE头的大小,32位PE文件默认E0h 64位PE文件默认为F0h 大小可以自定义.
WORD Characteristics; * 每个位有不同的含义,可执行文件值为10F 即0 1 2 3 8位置1
将可以修改的位置改为F
如果Machine清零会提示版本过低,无法在此电脑上运行。
NumberOfSections:清零或者改为不正确的值仍然无法运行。
SizeOfOptionalHeader,Characteristics均不可清零。
Characteristics 每个位有不同的含义,可执行文件值为10F 即0 1 2 3 8位置1。
(此表只描述了15位的信息。不确定是否16位全部表示信息。)
用鼠标选中的部分就是标准PE头,一共20个字节。打开的这个软件的标准PE头的位置和前一个就不同了,DOS的末尾将指向了100H这个位置。