EXE标题中的奇怪值

时间:2010-02-02 11:08:31

标签: windows portable-executable executable-format

我在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标题吗?

3 个答案:

答案 0 :(得分:4)

PE的第一部分是MSDOS存根;在0x3C(你的“A8”是),PE文件签名的偏移量。如果你把它归零,加载器将无法找到PE签名,并将拒绝加载它(或加载它只是一个MS-DOS可执行文件,我没有尝试)。 有关详细信息,请参阅PE format specifications

答案 1 :(得分:3)

偏移量为0x3c的DWORD是新EXE头的偏移量,即IMAGE_NT_HEADERS。因此,如果您在那里更改值,则PE加载程序无法找到新的EXE标头。

答案 2 :(得分:3)

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

  • DWORD签名;
  • _IMAGE_FILE_HEADER FileHeader;
  • _IMAGE_OPTIONAL_HEADER OptionalHeader;

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

您将在名为DWORD IMAGE_NT_SIGNATURE = 0x00004550; // PE00的头文件中找到所有这些信息。

在那里发生的事情是你消灭了'A8'的值,加载器找不到pe.h因此失败了。