El formato PE para equipos de respuesta a incidentes
Lo que importa de un archivo PE al analizar un EXE, una DLL o un driver sospechoso: cabeceras, secciones, importaciones, recursos, firma y overlay.
En resumen. Un ejecutable de Windows es un mapa: una cabecera MS-DOS apunta a la cabecera PE, la cabecera PE describe cómo cargar el archivo y una tabla de secciones indica qué bytes van dónde. La mayoría de las preguntas de un primer triaje —qué es, quién lo compiló, cuándo, qué puede hacer, si está firmado, si oculta algo— se responden leyendo ese mapa, sin ejecutar nada. PE Parser lo hace en su navegador.
Este artículo es el punto de entrada de la serie. Recorre la estructura en el orden en que la necesita quien responde a un incidente, con los nombres de campo de la especificación del formato PE de Microsoft.
La estructura de un vistazo
| Parte | Ubicación | Qué se obtiene de ella |
|---|---|---|
| Cabecera MS-DOS | desplazamiento 0, empieza por MZ | e_lfanew, el desplazamiento de la cabecera PE; el stub DOS y, a menudo, el Rich header |
| Firma PE + cabecera de archivo COFF | en e_lfanew | máquina (x86, x64, ARM64), número de secciones, TimeDateStamp, características (EXE o DLL) |
| Cabecera opcional | justo después | PE32 o PE32+, punto de entrada, base de la imagen, subsistema, suma de comprobación, características de DLL (ASLR, DEP, CFG), 16 directorios de datos |
| Tabla de secciones | tras la cabecera opcional | nombre, tamaño virtual y en disco, desplazamiento en el archivo y permisos de cada sección |
| Directorios de datos | dentro de las secciones | importaciones, exportaciones, recursos, certificados, depuración, TLS, configuración de carga, reubicaciones, .NET |
| Overlay | tras la última sección | cualquier dato añadido: cargas útiles de instaladores, archivos comprimidos, configuración, firmas |
Todo está en little-endian. Las direcciones dentro de la imagen son RVA (direcciones virtuales relativas); convertir una RVA en un desplazamiento del archivo pasa por la tabla de secciones, y por eso una tabla de secciones dañada hace fallar todas las herramientas a la vez.
Cabeceras: identidad y compilación
El campo TimeDateStamp de la cabecera COFF es la clásica fecha de compilación, en segundos Unix. Puede falsificarse, ponerse a cero o —en las compilaciones recientes de Microsoft y .NET— sustituirse por un hash, como se explica en marcas de tiempo PE. La cabecera opcional indica si el archivo es de 32 bits (magic 0x10b, PE32) o de 64 bits (0x20b, PE32+), dónde empieza la ejecución (AddressOfEntryPoint) y qué mitigaciones de exploits se solicitaron (DYNAMIC_BASE para ASLR, NX_COMPAT para DEP, GUARD_CF para Control Flow Guard).
El campo CheckSum se ignora en los ejecutables corrientes, pero es obligatorio en los drivers. Una suma de comprobación almacenada que ya no coincide con la recalculada sugiere que algunos bytes cambiaron después del enlazado.
Secciones: dónde residen el código y los datos
Un programa típico enlazado con herramientas de Microsoft tiene .text (código), .rdata (datos de solo lectura y tablas de importación), .data, .pdata (datos de excepciones x64), .rsrc y .reloc. Tres aspectos merecen atención:
- Permisos. Una sección con permisos de escritura y ejecución a la vez es inusual en la salida de un compilador y habitual en los empaquetadores.
- Entropía. Cerca de 8 bits por byte significa contenido comprimido o cifrado. En una sección de código suele indicar empaquetado; consulte detectar ejecutables empaquetados.
- Nombres. Los nombres son texto libre.
UPX0/UPX1,.vmp0o.themidason pistas, no pruebas, y un empaquetador puede renombrarse.
Importaciones y exportaciones: capacidades
El directorio de importaciones enumera cada DLL y función que el cargador debe resolver, y el cargador escribe sus direcciones en la tabla de direcciones de importación. Las importaciones son la forma más rápida de ver las capacidades: WinHttpOpen significa HTTP, CreateRemoteThread significa código en otro proceso, RegSetValueExW significa escrituras en el registro. Muy pocas importaciones más LoadLibrary/GetProcAddress sugiere que las reales se resuelven en tiempo de ejecución. La lista de importaciones también da el imphash, que se usa para agrupar muestras (imphash, Rich header y TLSH).
Las DLL exportan funciones por nombre y por ordinal; una DLL con una única exportación, como DllRegisterServer o ServiceMain, revela cómo espera ser cargada.
Recursos, datos de depuración y firma
Los recursos contienen la información de versión (CompanyName, FileDescription, OriginalFilename), el manifiesto (nivel de privilegios solicitado), iconos, cuadros de diálogo y tablas de cadenas, y a veces un ejecutable incrustado. Un OriginalFilename distinto del nombre en disco es una comprobación rápida de suplantación (masquerading).
El directorio de depuración suele contener un registro CodeView con la ruta PDB, un GUID y una edad. Las rutas de compilación como C:\Users\<name>\source\repos\… delatan el entorno del autor (ruta PDB).
La tabla de certificados contiene la firma Authenticode. No se proyecta en memoria y se sitúa tras las secciones, por lo que queda excluida del hash del archivo que se firma. Lo que una firma demuestra y lo que no se trata en Authenticode sin conexión.
Lista de comprobación para un primer triaje
- Calcule los hashes (MD5, SHA-1, SHA-256) y búsquelos en sus fuentes de inteligencia; calcule el imphash.
- Lea las fechas: compilación, depuración, firma. ¿Concuerdan entre sí y con el incidente?
- Revise la firma: si existe, si coincide con el archivo, quién firmó y cuándo.
- Recorra importaciones y cadenas en busca de capacidades e indicadores (URL, direcciones IP, rutas, claves del registro).
- Observe las secciones: permisos, entropía, ubicación del punto de entrada; compruebe si hay overlay.
- Lea la información de versión y la ruta PDB; compárelas con el nombre y la ubicación del archivo.
PE Parser aplica esta lista de comprobación a un archivo o a una colección completa y explica cada indicador en lenguaje claro. Es solo estático: desempaqueta UPX y extrae los ejecutables ocultos dentro de un archivo, pero los demás empaquetadores deben desempaquetarse en otro sitio, y nada de lo que muestra es un veredicto por sí solo.
Preguntas frecuentes
¿Qué es un archivo PE?
Portable Executable es el formato de archivo de los programas y bibliotecas de Windows: .exe, .dll, drivers .sys, .scr, .cpl, .ocx y binarios EFI. Empieza con una cabecera MS-DOS (MZ), seguida de la firma PE, una cabecera de archivo COFF, una cabecera opcional y una tabla de secciones.
¿Qué campos PE importan más en un primer triaje?
Los hashes y el imphash para consultas de inteligencia, las fechas de compilación, depuración y firma, la tabla de importaciones, la tabla de secciones con entropía y permisos, la información de versión, la firma Authenticode y cualquier dato añadido tras la última sección (overlay).