Valeur étrange dans l’en-tête EXE

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

  • Signature DWORD;
  • _IMAGE_FILE_HEADER FileHeader;
  • _IMAGE_OPTIONAL_HEADER OptionalHeader;

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é.