Estructura de un PE (Portable Executable):
-Cabecera ‘MZ’: 3ch apuntando a la cabecera ‘PE’.
-Cabecera ‘PE’: Contiene info acerca del fichero.
Algunas direcciones interesantes (respecto a PE):
00h ~ Cabecera (dword)
04h ~ tipo de maquina de destino (word)
06h ~ numero de secciones (word)
14h ~ tamaño de la cabecera opcional (word)
16h ~ características del fichero (word)
18h ~ comienza la cabecera opcional (si hay, claro xD)
-Cabecera opcional: Contiene más info acerca del fichero.
Algunas direcciones interesantes (respecto a PE):
01Ch ~ tamaño del code (dword)
028h ~ entrypoint (dword)
034h ~ dirección predeterminada donde se mapeara en fichero (dword)
03Ch ~ alineamiento del fichero respecto al disco (dword)
-Tabla de secciones: Contiene info sobre su respectiva sección, habrá tantas como secciones tiene el fichero. Para llegar a la tabla hay que hacer coger PE header+tamaño de PE header+tamaño de Optional header.
Algunas direcciones interesantes:
00h ~ nombre de la sección (8 bytes)
08h ~ virtual size (dword)
0ch ~ virtual address (dword)
14h ~ size of raw data (dword)
024h ~ flags (lectura, escritura, ejecución) (dword)
-Secciones: Son exactamente eso, secciones en las cuales el código es divido. Algunas de estas son: .text; .idata; .bss; .data; .reloc. Es importante destacar que podemos añadir secciones al fichero y que normalmente los compresores y crypters cambian, fusionan, o modifican estos nombre, así que podremos deducir que el nombre de la sección en si no es esencial en el funcionamiento del fichero.
Saludos!