2016-05-25 1 views
0

J'essaie d'identifier et de filtrer tous les fichiers exécutables MS-DOS à partir de fichiers exécutables que j'ai. Pour autant que je sache, PE diffère de MS-DOS par les en-têtes dont MS-DOS ne dispose pas, mais pour une raison quelconque, certains de mes exemples sont reconnus par MS-DOS comme étant des MS-DOS. ils sont PE.Existe-t-il un moyen sûr d'identifier l'exécutable MS-DOS?

Je ne trouve aucune documentation sur le sujet, et j'ai beaucoup cherché.

Merci!

+0

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

Répondre

0

Le problème avec l'identification des exécutables MS-DOS est que techniquement les exécutables Windows PECOFF sont également des exécutables MS-DOS valides. Les exécutables PECOFF sont préfixés avec un "Stub MS-DOS", qui est un programme MS-DOS complet qui dans la plupart des exécutables imprime un message du type "Ce programme ne peut pas être exécuté en mode DOS".

Donc la première chose à faire est de regarder l'en-tête de l'exécutable MS-DOS, et voir si c'est valide. Il ressemble à ceci (de la liste Interrompre de Ralf Brown):

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) 

Les valeurs clés à vérifier sont à des décalages et 18h 00h. Les deux octets au début du fichier, la signature, doivent être "MZ" ou 54ADh. Tandis que "ZM" fonctionne également pour le programme MS-DOS, Windows requiert que les exécutables PECOFF utilisent la signature "MZ" plus commune. La prochaine chose à vérifier est la valeur de 16 bits au décalage 18h. Il doit être supérieur ou égal à 40h pour que ce soit un exécutable PECOFF.

Si les valeurs des offsets 00h et 18h sont vérifiées, la prochaine chose à faire est de lire la valeur de 32 bits au décalage 3Ch. Cela contient le décalage de l'en-tête PECOFF réel. Vous devez ensuite vérifier les étoiles d'en-tête avec la signature "PE \ 0 \ 0", c'est-à-dire les deux caractères "P" et "E", suivis de deux octets. Notez qu'il est possible de trouver d'autres lettres à l'emplacement donné au décalage 3Ch, comme "NE", "LE", "LX" qui étaient utilisés pour les exécutables Windows 16 bits, les VxD et les systèmes d'exploitation 32 bits/2 exécutables respectivement. Ces autres formats exécutables ont également des stubs MS-DOS et localisent leurs véritables en-têtes de la même manière.