我看到一个奇怪的值放在一个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头(规格)?
3条答案
按热度按时间t3psigkw1#
PE的第一部分是MSDOS存根;在0x 3C(你的“A8”所在的地方)有PE文件签名的偏移量。如果你把它归零,加载器将无法找到PE签名,并且将拒绝加载它(或者仅仅作为MS-DOS可执行文件加载它,我没有尝试)。有关更多信息,请参阅PE format specifications。
x8goxv8g2#
我怀疑它是新PE头的偏移量,前30个奇数字节是MS-DOS头,0xA 8所在文件的偏移量对应于结构
IMAGE_DOS_HEADER
中的字段,称为字符串
值0xA 8将是包含以下信息的新
IMAGE_NT_HEADER
的一部分:DWORD Signature;
个IMAGE_FILE_HEADER FileHeader;
个IMAGE_OPTIONAL_HEADER OptionalHeader;
个前两个字节是可执行文件中的原始MS-DOS头,如以下常量所示:
型
IMAGE_NT_HEADER具有此签名以标识它是NT平台的可执行文件
型
您可以在名为
pe.h
的头文件中找到所有这些信息。这里发生的是你擦除了值0xA 8,加载器找不到
IMAGE_NT_HEADERS
,因此失败了。eeq64g8w3#
偏移量为0x3c的DWORD是新EXE头的偏移量,也就是IMAGE_NT_HEADERS。因此,如果您更改那里的值,PE加载器将无法找到新的EXE头。