J’ai vu une valeur étrange placée dans l’en-tête EXE
00000000 :4D 5A 90 00 03 00 00 00 - 04 00 00 00 FF FF 00 00 00000010 :B8 00 00 00 00 00 00 00 - 40 00 00 00 00 00 00 00 00000020 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 00000030 :00 00 00 00 00 00 00 00 - 00 00 00 00 A8 00 00 00 00000030 :00 00 00 00 00 00 00 00 - 00 00 00 00 A8 00 00 00 <-
Je ne sais pas ce que fait A8
, mais si je le remplace par des zéros, mon programme ne s’exécute pas.
En un mot: qu’est-ce que c’est?
Aussi, pourriez-vous me donner aussi un lien vers l’en-tête complet de MS DOS?
DWORD à l’offset 0x3c est le décalage du nouvel en-tête EXE, alias IMAGE_NT_HEADERS. Donc, si vous modifiez la valeur, le chargeur PE ne peut pas trouver le nouvel en-tête EXE.
La première partie d’un PE est le stub MSDOS; à 0x3C (où votre “A8” est) il y a le décalage à la signature du fichier PE. Si vous le mettez à zéro, le chargeur ne pourra pas trouver la signature PE et refusera de le charger (ou le chargera simplement comme un exécutable MS-DOS, je n’ai pas essayé). Pour plus d’informations, voir les spécifications du format PE .
Je soupçonne que c’est le décalage avec le nouvel en-tête PE, les 30 premiers octets impairs sont l’en-tête MS-DOS, ce décalage dans le fichier où réside A8 correspond au champ de la structure _IMAGE_DOS_HEADER
appelé LONG e_lfanew; // File address of new exe header
LONG e_lfanew; // File address of new exe header
; C’est cette valeur ‘A8’ qui ferait partie du nouveau IMAGE_NT_HEADER
qui contient cette information
Les deux premiers octets sont l’en-tête MS-DOS d’origine dans l’exécutable, comme indiqué par cette constante: WORD IMAGE_DOS_SIGNATURE = 0x5A4D; // MZ
WORD IMAGE_DOS_SIGNATURE = 0x5A4D; // MZ
; IMAGE_NT_HEADER a cette signature pour identifier qu’il s’agit d’un exécutable pour les plates-formes NT DWORD IMAGE_NT_SIGNATURE = 0x00004550; // PE00
DWORD IMAGE_NT_SIGNATURE = 0x00004550; // PE00
;
Vous trouverez toutes ces informations dans un fichier d’en-tête appelé pe.h
Ce qui s’est passé, c’est que vous avez effacé la valeur ‘A8’, le chargeur n’a pas pu trouver IMAGE_NT_HEADER
et a donc échoué.