我试图从我的可执行文件中识别并过滤掉所有MS-DOS可执行文件。
据我所知,PE与MS-DOS的不同之处在于MS-DOS所拥有的标题,但由于某些原因,我所拥有的一些样本被TrID识别为MS-DOS甚至虽然他们是PE。
我无法找到关于这个主题的任何文档,我搜索了很多。
谢谢!
答案 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存根,并以相同的方式定位他们的真实标题。