Skip to content

Detectar ejecutables empaquetados: UPX, entropía y más

Indicios estáticos de un EXE Windows empaquetado o protegido: nombres de sección, entropía, secciones W+X, punto de entrada, importaciones, overlay y trampas.

Publicado el Actualizado el 5 min de lectura

En resumen. Un empaquetador (packer) comprime o cifra el programa real y añade un pequeño stub que lo restaura en memoria. De forma estática se ve el stub: pocas importaciones, nombres de sección extraños, un gran bloque de alta entropía y, a veces, una sección con permisos de escritura y ejecución y un punto de entrada fuera de .text. Ningún indicio es concluyente por sí solo; juntos son fiables. La solución es desempaquetar —con la herramienta del propio empaquetador cuando existe, o de forma dinámica en un sandbox— y volver a analizar.

Los indicios, uno a uno

Nombres de sección. Los empaquetadores suelen dar nombre a sus secciones: UPX usa UPX0 (vacía en disco, grande en memoria) y UPX1 (los datos comprimidos más el stub); MPRESS usa .MPRESS1/.MPRESS2; VMProtect, .vmp0/.vmp1; Themida, .themida. Los nombres son triviales de cambiar, así que son pistas, aunque las muestras reales rara vez se molestan en hacerlo.

Marcadores. UPX escribe la cadena mágica UPX! y una cadena de versión en las cabeceras. En eso se apoya upx -d para descomprimir, y por eso manipularla rompe upx -d (proyecto UPX).

Entropía. La entropía de Shannon, en bits por byte, mide lo aleatorios que parecen los bytes. El código x86/x64 compilado suele situarse en torno a 5–6,8; los datos comprimidos o cifrados se acercan a 8. PE Parser señala las secciones con 7,2 o más (ignorando .rsrc, donde las imágenes y los archivos comprimidos son normales).

Permisos. Un stub debe escribir el código desempaquetado en algún sitio y después ejecutarlo. Una sección marcada a la vez como escribible y ejecutable es rara en la salida de un compilador y frecuente en los empaquetadores.

Punto de entrada. Los compiladores sitúan el punto de entrada en la sección de código. Un stub suele vivir en su propia sección, con frecuencia la última.

Importaciones. Un programa empaquetado importa lo que necesita el stub —normalmente LoadLibraryA, GetProcAddress, VirtualProtect, VirtualAlloc, ExitProcess— y resuelve el resto en tiempo de ejecución. Menos de diez importaciones, incluida GetProcAddress, es una señal fuerte. Además, esto inutiliza el imphash para agrupar: todos los archivos empaquetados con la misma herramienta lo comparten.

Tamaño en disco frente a tamaño virtual. Una sección con 0 bytes en disco pero un tamaño virtual grande (UPX0) es espacio que el stub llena en tiempo de ejecución.

Overlay. Algunos empaquetadores, instaladores y droppers añaden su carga útil después de la última sección en lugar de dentro de ella.

El ejemplo, leído de forma estática

El m64.exe sintético del ejemplo de PE Parser muestra la mayoría de los indicios a la vez, de forma inofensiva (su único código es un ret): una sección llamada UPX1 llena de bytes aleatorios (entropía 7,96) y marcada como RWX, un TLS callback, un overlay de 4 KB de ruido e importaciones que coinciden con grupos de comportamiento conocidos. La herramienta indica «UPX» solo por el nombre de la sección —no hay marcador UPX!— y explica en qué evidencia se basa cada detección.

Falsos positivos esperables

  • Los instaladores (NSIS, Inno Setup, archivos autoextraíbles) contienen grandes overlays o recursos comprimidos.
  • El software comercial protegido y los videojuegos usan VMProtect, Themida o Denuvo de forma legítima.
  • Los binarios de Go y Rust son grandes y están enlazados estáticamente; no están empaquetados, pero tienen una disposición de secciones poco habitual.
  • Los ensamblados .NET solo importan mscoree.dll!_CorExeMain; el código real es IL en los metadatos.
  • Archivos firmados: una firma válida de un editor conocido reduce la prioridad, pero existe malware firmado.

Qué hacer a continuación

  1. UPX: suelte el archivo en PE Parser, que lo desempaqueta de forma estática —también cuando la cabecera UPX! se ha borrado o las secciones se han renombrado para que upx -d falle— y reconstruye las importaciones originales, de modo que el imphash coincide con el build original. Para otros empaquetadores con desempaquetador, ejecútelo sobre una copia y analice el resultado.
  2. Si no, desempaquete de forma dinámica en un sandbox aislado y vuelque la memoria del proceso.
  3. Registre también los hashes de la muestra empaquetada: otras víctimas tendrán la versión empaquetada.

La detección de PE Parser es un pequeño conjunto de heurísticas documentadas escritas para la herramienta —nombres de sección, marcadores, cadenas del runtime, el Rich header—, no una base de datos de firmas como la de Detect It Easy. Tómela como una pista y lea la guía del formato PE para saber dónde se encuentra cada indicio dentro del archivo.

Preguntas frecuentes

¿Cómo saber si un EXE está empaquetado sin ejecutarlo?

Busque secciones ejecutables de alta entropía, secciones con permisos de escritura y ejecución a la vez, un punto de entrada fuera de .text o en la última sección, muy pocas importaciones con LoadLibrary y GetProcAddress, nombres de sección de empaquetadores como UPX0 y UPX1, y marcadores de empaquetadores como la cadena UPX!.

¿Qué entropía indica que un archivo está empaquetado?

Una entropía cercana a 8 bits por byte indica datos comprimidos o cifrados. El código compilado suele situarse entre aproximadamente 5 y 6,8; valores por encima de unos 7,2 en una sección ejecutable son un fuerte indicio de empaquetado, pero las imágenes, los archivos comprimidos y los certificados también tienen alta entropía.

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.