Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 有没有安全的方法来识别MS-DOS可执行文件?_Windows_Dos_Portable Executable - Fatal编程技术网

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

Windows 有没有安全的方法来识别MS-DOS可执行文件?,windows,dos,portable-executable,Windows,Dos,Portable Executable,我正在尝试从我拥有的可执行文件中识别并过滤掉所有MS-DOS可执行文件 据我所知,PE与MS-DOS的不同之处在于,他拥有MS-DOS所没有的标题,但由于某种原因,我拥有的一些示例被TrID识别为MS-DOS,即使它们是PE 我找不到关于这个主题的任何文档,我搜索了很多 谢谢 识别MS-DOS可执行文件的问题在于,从技术上讲,Windows PECOFF可执行文件也是有效的MS-DOS可执行文件。PECOFF可执行文件的前缀为“MS-DOS存根”,这是一个完整的MS-DOS程序,在大多数可执行文

我正在尝试从我拥有的可执行文件中识别并过滤掉所有MS-DOS可执行文件

据我所知,PE与MS-DOS的不同之处在于,他拥有MS-DOS所没有的标题,但由于某种原因,我拥有的一些示例被TrID识别为MS-DOS,即使它们是PE

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


谢谢

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

因此,首先要做的是查看MS-DOS可执行文件头,看看它是否有效。看起来是这样的(来自拉尔夫·布朗的中断列表):

要检查的关键值位于偏移量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存根,并以相同的方式定位其真正的头文件

 00h  2 BYTEs .EXE signature, either "MZ" or "ZM" (5A4Dh or 4D5Ah)
        (see also #01593)
 02h  WORD    number of bytes in last 512-byte page of executable
 04h  WORD    total number of 512-byte pages in executable (includes any
      partial last page)
 06h  WORD    number of relocation entries
 08h  WORD    header size in paragraphs
 0Ah  WORD    minimum paragraphs of memory required to allocate in addition
        to executable's size
 0Ch  WORD    maximum paragraphs to allocate in addition to executable's size
 0Eh  WORD    initial SS relative to start of executable
 10h  WORD    initial SP
 12h  WORD    checksum (one's complement of sum of all words in executable)
 14h  DWORD   initial CS:IP relative to start of executable
 18h  WORD    offset within header of relocation table
      40h or greater for new-format (NE,LE,LX,W3,PE,etc.) executable
 1Ah  WORD    overlay number (normally 0000h = main program)