有没有一种安全的方法来识别MS-DOS可执行文件?

时间:2016-05-25 08:59:49

标签: windows dos portable-executable

我试图从我的可执行文件中识别并过滤掉所有MS-DOS可执行文件。

据我所知,PE与MS-DOS的不同之处在于MS-DOS所拥有的标题,但由于某些原因,我所拥有的一些样本被TrID识别为MS-DOS甚至虽然他们是PE。

我无法找到关于这个主题的任何文档,我搜索了很多。

谢谢!

1 个答案:

答案 0 :(得分:0)

识别MS-DOS可执行文件的问题在于技术上Windows PECOFF可执行文件也是有效的MS-DOS可执行文件。 PECOFF可执行文件以“MS-DOS Stub”为前缀,这是一个完整的MS-DOS程序,在大多数可执行文件中打印出一条消息,如“此程序无法在DOS模式下运行”。

所以要做的第一件事就是查看MS-DOS可执行文件头,看看它是否有效。它看起来像这样(来自拉尔夫布朗的中断名单):

// `peer` is a single IP address. `peer_list` is a list of IP addresses
// get the 5 nearest peers (ordered) to `peer` from `peer_list`
nearest_peers = get_nearest_ips(peer, peer_list, 5);

要检查的关键值是偏移00h和18h。文件开头的两个字节,即签名,必须是“MZ”或54ADh。虽然“ZM”也适用于MS-DOS程序,但Windows要求PECOFF可执行文件使用更常见的“MZ”签名。接下来要检查的是偏移18h的16位值。它需要大于或等于40h才能成为PECOFF可执行文件。

如果偏移00h和18h处的值检出,则接下来要做的是读取偏移量为3Ch的32位值。它包含实际PECOFF标头的偏移量。然后,您需要使用签名“PE \ 0 \ 0”检查标题星号,即两个字符“P”和“E”,后跟两个0字节。

请注意,可以在偏移量为3Ch的位置找到其他字母,如“NE”,“LE”,“LX”,它们用于16位Windows可执行文件,VxD和32位OS / 2可执行文件分别。这些其他可执行格式也有MS-DOS存根,并以相同的方式定位他们的真实标题。