AvanzadoWindowsevasiónpackerscryptersofuscaciónantivirus

Evasión de Antivirus: Ofuscación, Packers y Crypters

Análisis técnico de técnicas de evasión de antivirus en Windows. Packers (UPX, Themida, VMProtect), crypters, ofuscación de código, polimorfismo, metamorfismo y cómo los analistas identifican y deshacen estas protecciones.

MalwareIntel Research··9 min lectura
Serie: Malware en Windows — Parte 9

La carrera armamentística entre malware y antivirus

Los antivirus detectan malware de tres formas: firmas (hash del archivo), heurísticas (patrones de código sospechoso) y behavioral (comportamiento en ejecución). El malware responde con tres contramedidas: packers (cambiar el hash), ofuscación (ocultar patrones de código) y técnicas anti-sandbox (evadir análisis behavioral).

Esta carrera lleva más de tres décadas y no tiene ganador definitivo. Cada mejora en detección produce una mejora en evasión, y viceversa. Este artículo analiza las técnicas de evasión desde la perspectiva del analista que necesita entenderlas para deshacerlas.

Packers: comprimir para ocultar

Concepto

Un packer toma un ejecutable PE y lo comprime o cifra. El resultado es un nuevo PE que contiene:

  1. Stub de descompresión: código que se ejecuta primero
  2. Datos comprimidos/cifrados: el PE original
  3. Al ejecutarse: el stub descomprime el PE original en memoria y le transfiere el control
PE Original (detectable)     →    PE Empaquetado (no detectable por firma)
┌──────────────────┐              ┌──────────────────────────┐
│ .text (código)   │   PACK →    │ .UPX0 (vacía, se llena)  │
│ .data (datos)    │              │ .UPX1 (datos comprimidos)│
│ .rsrc (recursos) │              │ Stub descompresión       │
└──────────────────┘              └──────────────────────────┘
                                  Entry point → Stub → Descomprime → OEP

Packers comunes

PackerTipoUsoDetección
UPXCompresión (open source)Malware commodity, reducir tamañoTrivial: upx -d para desempaquetar
Themida/WinLicenseProtector comercialMalware avanzado, software legítimoDifícil: virtualización de código
VMProtectProtector comercialMalware avanzado, juegosMuy difícil: VM-based obfuscation
ASPackCompresiónMalware legacyFácil: herramientas automáticas
MPRESSCompresiónMalware moderadoFácil-Medio
Enigma ProtectorProtectorMalware + software legítimoMedio
ObsidiumProtectorMalware moderadoMedio
PECompactCompresiónLegacyFácil

Indicadores de packing en el PE

IndicadorValor normalValor empaquetadoHerramienta
Entropía de .text5.5 - 6.57.0 - 7.99pestudio, DIE
Número de imports20-200+1-5 (solo GetProcAddress, LoadLibrary)pestudio, pefile
Nombres de secciones.text, .data, .rsrc.UPX0, .vmp0, .themida, .enigmaDIE, CFF Explorer
Entry pointInicio de .textÚltima sección o sección con nombre de packerPE-bear
Tamaño raw vs virtualSimilarRaw mucho menor que virtual (se expande en memoria)pefile

Desempaquetado (unpacking)

Método 1: Automático con UPX

upx -d packed_sample.exe -o unpacked_sample.exe

Solo funciona con UPX no modificado. Muchas variantes de malware modifican UPX headers para que la herramienta oficial falle.

Método 2: Dump de memoria

  1. Ejecutar el sample en una sandbox o debugger
  2. Esperar a que el stub descomprima el payload en memoria
  3. Dumpar la región de memoria que contiene el PE descomprimido
  4. Reconstruir el PE (fix imports con Scylla/ImpRec)

Método 3: Debugging manual

  1. Cargar en x64dbg
  2. Ejecutar hasta el entry point del packer
  3. Buscar el OEP (Original Entry Point): el punto donde el stub transfiere control al código original
  4. Breakpoint en el OEP
  5. Dumpar la imagen en memoria
  6. Reconstruir IAT (Import Address Table) con Scylla

Encontrar el OEP

Técnicas para identificar el OEP en un PE empaquetado:

TécnicaDescripción
ESP trickBreakpoint hardware en el valor de ESP al inicio. Cuando se restaura (ret o jmp), estás cerca del OEP
Tail jumpBuscar un jmp largo al final del stub que salta a una dirección distante (el OEP)
Section permissionsBreakpoint en VirtualProtect: cuando el stub cambia permisos de la sección de código a RX, el unpacking terminó
API callsBreakpoint en APIs que el malware real llamaría (no el stub): cuando se llaman, el código original está ejecutándose

Crypters: cifrar para evadir

Concepto

Un crypter cifra el payload con una clave y genera un nuevo ejecutable que contiene:

  1. Stub de descifrado: código que descifra el payload
  2. Payload cifrado: el malware original cifrado
  3. Clave: embebida en el stub o derivada de una fuente
Payload original → [Cifrado AES/RC4/XOR] → Payload cifrado
                                             ↓
                                   ┌─────────────────────┐
                                   │ Nuevo ejecutable:    │
                                   │ ├─ Stub descifrado   │
                                   │ ├─ Clave (embebida)  │
                                   │ └─ Payload cifrado   │
                                   └─────────────────────┘

Crypters FUD (Fully Undetectable)

El underground vende crypters como servicio:

TierPrecio típicoGarantíaFrecuencia de actualización
Free/público0 USDNinguna (detectado en horas)Nunca
Budget10-50 USD/mes"FUD en momento de venta"Semanal
Premium50-200 USD/mesFUD garantizado, re-crypt si detectanDiaria
Private200-1000 USD/mesFUD exclusivo, pocos clientesContinua

Los crypters FUD se testean contra VirusTotal (o servicios alternativos que no reportan a los vendors como antiscan.me). Cuando una detección aparece, el operador actualiza el stub.

Cifrados comunes en crypters

CifradoUsoDetección
XOR simpleCrypters básicosTrivial: patrón XOR visible en la entropía
RC4Crypters mediosMedio: clave embebida, buscar patrón RC4
AESCrypters avanzadosDifícil: requiere encontrar la clave
Custom cipherCrypters premiumVariable: depende de la implementación

Ofuscación de código

Nivel de código fuente

TécnicaDescripciónImpacto en análisis
RenamingVariables y funciones con nombres aleatoriosDificulta lectura pero no análisis automatizado
Control flow flatteningConvertir if/else/loops en un switch giganteDificulta seguir la lógica del programa
Dead code insertionAñadir código que nunca se ejecutaIncrementa tamaño y confunde heurísticas
String encryptionCifrar strings en compile-time, descifrar en runtimeOculta URLs, claves, mensajes
Opaque predicatesCondicionales que siempre evalúan igual pero parecen variablesConfunde análisis estático
API hashingReemplazar nombres de API por hashesOculta imports del análisis estático

Nivel de binario

TécnicaDescripción
Instruction substitutionReemplazar mov eax, 0 por xor eax, eax (equivalentes)
Register reassignmentUsar registros diferentes en cada compilación
Junk code insertionInsertar instrucciones que no afectan el resultado (nops, push/pop)
Code transpositionReordenar bloques de código con jumps

Polimorfismo y metamorfismo

Polimorfismo

El malware polimórfico cambia su apariencia (cifrado del cuerpo) en cada instancia pero mantiene el mismo código funcional subyacente:

Instancia 1: [Stub A] + [Payload cifrado con Key1]
Instancia 2: [Stub B] + [Payload cifrado con Key2]
Instancia 3: [Stub C] + [Payload cifrado con Key3]

Cada instancia tiene un hash diferente y un stub diferente,
pero el payload descifrado es identico.

Ejemplos históricos: Storm Worm, Virut, Sality.

Metamorfismo

El malware metamórfico reescribe su propio código en cada generación, produciendo funcionalmente equivalente pero estructuralmente diferente:

Generacion 1: mov eax, 5 / add eax, 3
Generacion 2: push 5 / pop eax / sub eax, -3
Generacion 3: xor eax, eax / or eax, 8

Las tres generaciones producen eax=8, pero el codigo es diferente.

El metamorfismo verdadero es raro en malware moderno por su complejidad. La mayoría del malware usa polimorfismo (cifrado variable) o packers comerciales.

Anti-análisis: más allá de la evasión de firmas

Anti-debugging

TécnicaAPI/MétodoBypass
IsDebuggerPresentChecks PEB.BeingDebugged flagPatchear PEB.BeingDebugged a 0
NtQueryInformationProcess(ProcessDebugPort)Query al kernelHook en ntdll o ScyllaHide plugin
Timing checksGetTickCount deltaNOP los checks
INT 2DExcepción que se comporta diferente en debuggerIgnorar la excepción
Hardware breakpoint detectionGetThreadContext lee DR0-DR7Clear hardware breakpoints

Anti-sandbox

TécnicaQué detectaBypass (sandbox)
Check CPU countSandboxes suelen tener 1-2 CPUsConfigurar sandbox con 4+ CPUs
Check RAMSandboxes suelen tener 2 GBConfigurar 8+ GB
Check disk sizeSandboxes tienen discos pequeñosDisco virtual de 100+ GB
Check screen resolutionResoluciones atípicasResolución estándar (1920x1080)
Check recent filesSandbox vacía no tiene archivos recientesPopular con documentos falsos
Check username"admin", "user", "sandbox", "malware"Username realista
Sleep accelerationSandbox acelera los Sleep()Emular sleep real
Mouse movementSin movimiento de ratónSimular movimiento
Check processesVMware Tools, VBoxService, WiresharkOcultar procesos de análisis
CPUID checkHypervisor present bitEnmascarar CPUID

Herramientas del analista

HerramientaUso
Detect It Easy (DIE)Identificar packer, compilador, linker
Exeinfo PEDetección de packers con base de datos extensa
pestudioTriage rápido: imports, strings, entropía, indicadores
x64dbgDebugging dinámico para unpacking manual
ScyllaReconstrucción de IAT tras dump de memoria
pe-unmapperConversión de dump de memoria a PE válido
de4dotDeobfuscador para .NET (Confuser, SmartAssembly, etc.)
CAPADetección de capacidades (incluye packing indicators)
Entropy analysis (binwalk, pestudio)Identificar secciones cifradas/comprimidas

Mapeo MITRE ATT&CK

TécnicaIDDescripción
Obfuscated Files or InformationT1027Ofuscación general
Software PackingT1027.002Uso de packers
Compile After DeliveryT1027.004Compilar payload en el sistema objetivo
Indicator Removal from ToolsT1027.005Eliminar indicadores del binario
Dynamic API ResolutionT1027.007Resolver APIs en runtime
Stripped PayloadsT1027.008Eliminar símbolos y debug info
Embedded PayloadsT1027.009Payload embebido en recurso
Virtualization/Sandbox EvasionT1497Anti-sandbox checks
Debugger EvasionT1622Anti-debugging

Fuentes y referencias

Preguntas frecuentes

Artículos relacionados

Este contenido tiene fines exclusivamente educativos y de investigación en ciberseguridad defensiva. No se proporcionan binarios maliciosos ni payloads ejecutables. El uso indebido de esta información es responsabilidad exclusiva del usuario. Leer disclaimer completo.