如何区分16位MZ和32位MZ

use*_*014 1 c windows 32-bit portable-executable

我需要将32位PE与16位DOS MZ区分开来.这样做的正确方法是什么?我可以像寻找PE头一样使用启发式算法,但我觉得它不一定是确定性的

use*_*044 6

所有DOS样式的可执行文件都有一个'MZ'作为前两个字节.
要识别MSDOS可执行文件与众多其他变体,最好的选择似乎是读取文件中偏移量0x0018处的重定位表的位置,如果这大于0x0040(进入文件)它不仅仅是普通的DOS .

为了将可执行文件明确地标识为"PE"可执行文件,文件中的偏移量为0x003C处有一个指针.这是文件中的偏移量,它将具有字节'PE'和两个nuls.其他MSDOS'MZ'变体将使用相同的位置来放置其他代码,例如:'NE','W3','LE'等.

"PE"风格的可执行文件也有多种形式,我希望你至少会对32位和64位感兴趣.

可能这种事情的最终权威是Unix'文件'命令,它旨在通过调查它的内容来可靠地识别任何文件类型.此处列出 MSDOS部分.Microsoft不是这方面的可靠权威,因为他们忽略了非Microsoft信息.