¿Qué son los packers y la ofuscación, y cómo se detectan en un binario?
Respuesta breve
El empaquetado comprime o cifra la carga útil real y le antepone un stub que la desempaqueta en memoria en tiempo de ejecución; la ofuscación transforma el código o los datos para resistir la lectura y las firmas. El empaquetado se detecta por una entropía de sección alta cercana a 8,0, una tabla de imports diminuta o solo de stub, nombres de sección inusuales o escribibles-ejecutables como UPX0, un punto de entrada fuera de .text, un gran tamaño virtual frente a un pequeño tamaño en bruto, y detectores como Detect It Easy o PEiD. Ninguno de estos es concluyente por sí solo, así que los analistas ponderan varias señales juntas y confirman observando el desempaquetado en tiempo de ejecución.
La mayoría del malware común y dirigido está empaquetado para reducir su huella y, más importante, para derrotar las firmas estáticas y ralentizar a los analistas. Los entrevistadores preguntan esto para comprobar que sabes reconocer rápidamente un ejemplar empaquetado en lugar de malgastar horas desensamblando un stub.
Empaquetado frente a ofuscación
Un packer toma la carga útil real, la comprime o la cifra, y la envuelve en un pequeño stub de desempaquetado. En tiempo de ejecución, el stub reserva memoria, restaura el código original y le transfiere la ejecución — así que en disco solo ves el stub más un blob opaco. La ofuscación es más amplia: el aplanamiento del flujo de control, instrucciones basura, predicados opacos, cifrado de cadenas y hashing de API hacen todos el código más difícil de leer y de identificar, esté o no empaquetado el archivo. El empaquetado oculta la carga útil; la ofuscación oculta la lógica.
Señales de detección
Ninguna señal por sí sola es prueba — se acumulan:
- Entropía alta. Secciones que miden cerca de 8,0 bits por byte indican compresión o cifrado. Salvedad: los medios comprimidos y los instaladores legítimos también puntúan alto, así que la entropía es una pista, no un veredicto.
- Tabla de imports diminuta. Un programa real importa decenas de API; uno empaquetado a menudo importa solo
LoadLibraryyGetProcAddressporque lo resuelve todo dinámicamente tras desempaquetar. - Secciones extrañas. Nombres como
UPX0/UPX1, secciones marcadas como escribibles y ejecutables, o un tamaño en bruto pequeño con un gran tamaño virtual. - Ubicación del punto de entrada. Un punto de entrada fuera de
.text, en una sección escribible, es sospechoso. - Detectores. Detect It Easy (DIE), las firmas de PEiD y los gráficos de entropía identifican muchos packers conocidos por su nombre.
Confirmarlo
La confirmación decisiva es dinámica: ejecutar el ejemplar y verlo reservar memoria ejecutable y escribir en ella (el desempaquetado). Una buena respuesta dice que la detección es probabilística de forma estática y segura de forma dinámica.
Posibles preguntas de seguimiento
- ¿Por qué un binario empaquetado suele tener solo LoadLibrary y GetProcAddress en sus imports?
- ¿La entropía alta es prueba de empaquetado? ¿Qué produce falsos positivos?
- ¿En qué se diferencia la ofuscación del empaquetado en cuanto a lo que protege?