4

我在 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
00000030 :00 00 00 00 00 00 00 00 - 00 00 00 00 A8 00 00 00 <-

我不知道那里在A8做什么,但是如果我用零替换它,我的程序就不会执行。

一言以蔽之:那是什么?

另外,你能给我链接到完整的 MS DOS 标题吗?

4

3 回答 3

4

PE 的第一部分是 MSDOS 存根;在 0x3C(你的“A8”所在的位置)有 PE 文件签名的偏移量。如果你将它归零,加载器将无法找到 PE 签名,并且会拒绝加载它(或者将它作为一个 MS-DOS 可执行文件加载,我没有尝试过)。有关详细信息,请参阅PE 格式规范

于 2010-02-02T11:24:20.467 回答
3

偏移量 0x3c 处的 DWORD 是新 EXE 标头的偏移量,即 IMAGE_NT_HEADERS。因此,如果您在此处更改值,PE 加载器将找不到新的 EXE 标头。

于 2010-02-02T11:22:19.893 回答
3

我怀疑它是新PE头的偏移量,前30个奇数字节是MS-DOS头,'A8'所在文件的偏移量对应于结构中的_IMAGE_DOS_HEADER字段LONG e_lfanew; // File address of new exe header; 值“A8”将是IMAGE_NT_HEADER包含此信息的新值的一部分

  • 双字签名;
  • _IMAGE_FILE_HEADER 文件头;
  • _IMAGE_OPTIONAL_HEADER 可选标题;

前两个字节是可执行文件的原始 MS-DOS 标头,如以下常量所示WORD IMAGE_DOS_SIGNATURE = 0x5A4D; // MZ:IMAGE_NT_HEADER 具有此签名以标识它是 NT 平台的可执行文件DWORD IMAGE_NT_SIGNATURE = 0x00004550; // PE00

您将在一个名为pe.h.

What happened there is you wiped out the value 'A8', the loader could not find the IMAGE_NT_HEADER and hence failed.

于 2010-02-02T11:36:17.457 回答