我需要区分32位PE和16位DOS MZ。
正确的方法是什么?
我可以使用启发式方法来寻找PE header ,但是我觉得它不一定是确定性的

最佳答案

所有DOS样式的可执行文件的前两个字节均带有“MZ”。
要确定MSDOS可执行文件与其他多种变量的比较,最好的选择似乎是读取文件中偏移量0x0018处的重定位表的位置,如果此值大于0x0040(到文件中),则不只是纯DOS 。

为了将可执行文件明确标识为“PE”可执行文件,文件中的偏移量为0x003C。这是文件内的偏移量,将具有字节“PE”和两个nul。其他MSDOS'MZ'变体将使用相同的位置放置其他代码,例如:'NE','W3','LE'等。

“PE”样式的可执行文件也有多种形式,我希望您至少对32位和64位感兴趣。

这类事情的最终授权可能是Unix"file"命令,它旨在通过研究其内容来可靠地识别任何文件类型。 MSDOS部分列出为here。 Microsoft对此不是可靠的权威,因为它们会忽略非Microsoft信息。

10-02 01:06
查看更多