Skip to content

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.

Publicado el Actualizado el 6 min de lectura

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

ParteUbicaciónQué se obtiene de ella
Cabecera MS-DOSdesplazamiento 0, empieza por MZe_lfanew, el desplazamiento de la cabecera PE; el stub DOS y, a menudo, el Rich header
Firma PE + cabecera de archivo COFFen e_lfanewmáquina (x86, x64, ARM64), número de secciones, TimeDateStamp, características (EXE o DLL)
Cabecera opcionaljusto despuésPE32 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 seccionestras la cabecera opcionalnombre, tamaño virtual y en disco, desplazamiento en el archivo y permisos de cada sección
Directorios de datosdentro de las seccionesimportaciones, exportaciones, recursos, certificados, depuración, TLS, configuración de carga, reubicaciones, .NET
Overlaytras la última seccióncualquier 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, .vmp0 o .themida son 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

  1. Calcule los hashes (MD5, SHA-1, SHA-256) y búsquelos en sus fuentes de inteligencia; calcule el imphash.
  2. Lea las fechas: compilación, depuración, firma. ¿Concuerdan entre sí y con el incidente?
  3. Revise la firma: si existe, si coincide con el archivo, quién firmó y cuándo.
  4. Recorra importaciones y cadenas en busca de capacidades e indicadores (URL, direcciones IP, rutas, claves del registro).
  5. Observe las secciones: permisos, entropía, ubicación del punto de entrada; compruebe si hay overlay.
  6. 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).

Artículos relacionados

Triaje estático paso a paso de ejecutables de Windows con PE Parser, gratuito: cargue archivos o un ZIP, lea los indicadores, compare y exporte.
Localice y copie archivos EXE, DLL y SYS sospechosos de un equipo Windows o de una imagen sin ejecutarlos: PowerShell, Velociraptor, imágenes y trampas.
Dónde guarda sus fechas un ejecutable de Windows, cuáles son fiables, cómo se delatan las compilaciones reproducibles y el timestomping, y cómo usarlas.