我看到 EXE 标头中放置了一个奇怪的值
00000000 :4D 5A 90 00 03 00 00 00 - 04 00 00 00 FF FF 00 00
00000010 :B8 00 00 00 00 00 00 00 - 40 00 00 00 00 00 00 00
00000020 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00000030 :00 00 00 00 00 00 00 00 - 00 00 00 00 A8 00 00 00 <-
我不知道
A8
在偏移量 3C 处做什么,但如果我用零替换它,我的程序就不会执行。
那是什么?
您能给我一个完整的 MS DOS 标头(规范)的超链接吗?
PE 的第一部分是 MSDOS 存根;在 0x3C(“A8”所在的位置)处有 PE 文件签名的偏移量。如果将其清零,加载程序将无法找到 PE 签名,并将拒绝加载它(或将其作为 MS-DOS 可执行文件加载,我没有尝试)。 有关更多信息,请参阅 PE 格式规范。
我怀疑它是新PE头的偏移量,前30个奇数字节是MS-DOS头,'A8'所在文件的偏移量对应于结构体中的字段
_IMAGE_DOS_HEADER
称为LONG e_lfanew; // File address of new exe header
;
值“A8”将成为包含此信息的新IMAGE_NT_HEADER
的一部分
最开始的两个字节是可执行文件中的原始 MS-DOS 标头,如以下常量所示:
WORD IMAGE_DOS_SIGNATURE = 0x5A4D; // MZ
; IMAGE_NT_HEADER 具有此签名来标识它是 NT 平台的可执行文件 DWORD IMAGE_NT_SIGNATURE = 0x00004550; // PE00
;
您将在名为
pe.h
的头文件中找到所有这些信息。
发生的事情是你删除了值“A8”,加载程序找不到
IMAGE_NT_HEADER
,因此失败。
偏移量 0x3c 处的 DWORD 是新 EXE 标头的偏移量,又名 IMAGE_NT_HEADERS。因此,如果您更改此处的值,PE 加载程序将无法找到新的 EXE 标头。