Valor extraña en el encabezado EXE
-
24-09-2019 - |
Pregunta
He visto un valor extraño colocado en la cabecera 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 <-
No sé lo que es A8
haciendo allí, pero si puedo reemplazar con ceros mi programa no se ejecuta.
En una palabra: lo que es
?Además, podría darme también un enlace a la cabecera completa de MS-DOS?
Solución
DWORD en 0x3C desplazamiento es el desplazamiento de la nueva cabecera EXE, también conocido como IMAGE_NT_HEADERS. Así que si cambia el valor de ahí, el cargador PE no puede encontrar la nueva cabecera EXE.
Otros consejos
La primera parte de un PE es el stub MSDOS; en 0x3C (donde su "A8" es) está la desviación a la firma del archivo PE. Si se pone a cero, el cargador no será capaz de encontrar la firma PE, y se negará a cargarlo (o simplemente cargarlo como un ejecutable de MS-DOS, no lo probé). Para obtener más información, consulte la PE formato especificaciones .
Sospecho que es el desplazamiento a la nueva cabecera PE, los primeros 30 bytes impares son el encabezado MS-DOS, que compensa en el archivo donde reside el 'A8' en Corresponde al campo en el _IMAGE_DOS_HEADER
estructura llamada LONG e_lfanew; // File address of new exe header
;
Es ese valor 'A8' sería parte de la nueva IMAGE_NT_HEADER
que contiene esta información
- DWORD Signature;
- _IMAGE_FILE_HEADER FileHeader;
- _IMAGE_OPTIONAL_HEADER OptionalHeader;
Los primeros dos bytes son los MS-DOS originales cabecera en el ejecutable como se muestra por esta constante: WORD IMAGE_DOS_SIGNATURE = 0x5A4D; // MZ
; El IMAGE_NT_HEADER tiene esta firma para identificar que se trata de un ejecutable para plataformas DWORD IMAGE_NT_SIGNATURE = 0x00004550; // PE00
NT;
A continuación encontrará toda esta información en un archivo de cabecera llamada pe.h
.
Lo que ocurrió allí es que acabó con el valor 'A8', el cargador no pudo encontrar el IMAGE_NT_HEADER
y por lo tanto fracasado.