2016-05-25 12 views
0

Ich versuche, alle ausführbaren MS-DOS-Dateien aus ausführbaren Dateien, die ich habe, zu identifizieren und herauszufiltern. Wenn ich weiß, unterscheiden sich PE von MS-DOS durch die Header, die er hat, was MS-DOS nicht hat, aber aus irgendeinem Grund werden einige der Beispiele, die ich habe, von TrID als MS-DOS obwohl erkannt Sie sind PE.Gibt es eine sichere Möglichkeit, MS-DOS-Programmdatei zu identifizieren?

Ich kann keine Dokumentation zu diesem Thema finden, und ich habe viel gesucht.

Danke!

+0

http://delphidabbler.com/articles?article=8 –

Antwort

0

Das Problem mit der Identifizierung von ausführbaren MS-DOS-Dateien ist, dass technisch ausführbare Dateien von Windows PECOFF auch gültige ausführbare MS-DOS-Dateien sind. PECOFF-Executables werden mit einem "MS-DOS-Stub" vorangestellt, einem vollständigen MS-DOS-Programm, das in den meisten ausführbaren Dateien eine Meldung wie "Dieses Programm kann nicht im DOS-Modus ausgeführt werden" ausgibt.

Also ist das erste, was zu tun ist, den ausführbaren MS-DOS-Header zu sehen, und ob es gültig ist. Es sieht wie folgt aus (von Ralf Browns Interrupt List):

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) 

Die Schlüsselwerte bei Versetzungen 00h und 18h ​​sind zu überprüfen. Die zwei Bytes am Anfang der Datei, die Signatur, müssen "MZ" oder 54ADh sein. Während "ZM" auch für MS-DOS-Programme funktioniert, erfordert Windows, dass PECOFF-Programme die gebräuchlichere "MZ" -Signatur verwenden. Als nächstes muss der 16-Bit-Wert bei Offset 18h überprüft werden. Es muss größer oder gleich 40h sein, damit PECOFF ausführbar ist.

Wenn die Werte bei den Offsets 00h und 18h ​​ausgecheckt werden, dann ist das nächste, was zu tun ist, den 32-Bit-Wert bei Offset 3Ch zu lesen. Dieser enthält den Offset des aktuellen PECOFF-Headers. Sie müssen dann die Header-Sterne mit der Signatur "PE \ 0 \ 0" überprüfen, dh die zwei Zeichen "P" und "E", gefolgt von zwei 0 Bytes.

Beachten Sie, dass es möglich ist, andere Buchstaben an der Stelle zu finden, die bei Offset 3Ch angegeben wurde, wie "NE", "LE", "LX", die für 16-Bit-Windows-Programme, VxDs und 32-Bit-OS/verwendet wurden. 2 ausführbare Dateien. Diese anderen ausführbaren Formate verfügen ebenfalls über MS-DOS-Stubs und suchen ihre echten Header auf die gleiche Weise.

Verwandte Themen