我在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标题吗?
答案 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
的一部分
前两个字节是可执行文件中的原始MS-DOS标头,如此常量所示:IMAGE_NT_HEADER
; IMAGE_NT_HEADER具有此签名以标识它是NT平台WORD IMAGE_DOS_SIGNATURE = 0x5A4D; // MZ
的可执行文件;
您将在名为DWORD IMAGE_NT_SIGNATURE = 0x00004550; // PE00
的头文件中找到所有这些信息。
在那里发生的事情是你消灭了'A8'的值,加载器找不到pe.h
因此失败了。