Análisis Estático de Malware: Herramientas y Metodología Paso a Paso
Guía completa de análisis estático de malware. Triage con strings/FLOSS/pestudio, análisis de PE/ELF headers, detección de packers, extracción de IOCs, YARA rules, y el workflow paso a paso que todo analista debe dominar antes del análisis dinámico.
Antes de ejecutar: mira primero
El análisis estático es siempre el primer paso. Ejecutar una muestra sin examinarla es como abrir un paquete sospechoso sin inspeccionarlo. El análisis estático te dice qué tipo de malware es, qué capacidades tiene, si está empaquetado, y qué IOCs puedes extraer, todo sin riesgo de infección.
Este artículo es un workflow completo: desde que recibes una muestra hasta que tienes un informe de triage listo para decidir si necesitas análisis dinámico.
Workflow de análisis estático
Fase 1: identificación (2 minutos)
# 1. Calcular hashes
md5sum sample
sha256sum sample
# 2. Identificar tipo de archivo
file sample
# PE32 executable? ELF? PDF? Office document?
# 3. Buscar en VirusTotal
# Subir hash (no el archivo) primero
# Si tiene resultados: nombre de familia, detecciones, comportamiento
# Si no tiene: muestra posiblemente nueva/targeted
VirusTotal como primer paso: si 40 engines detectan la muestra como "Trojan.GenericKD", ya tienes una clasificación. Si 0 engines la detectan, puede ser una muestra nueva, custom, o un falso positivo. Ambos casos son interesantes.
Fase 2: strings (5 minutos)
Las strings son la fuente de información más rápida. Un solo comando puede revelar URLs de C2, mensajes de rescate, claves de registro, y rutas de archivos.
# Strings ASCII y Unicode
strings -a sample > strings_ascii.txt
strings -a -el sample > strings_unicode.txt
# FLOSS: strings ofuscadas (stack strings, decoded strings)
floss sample > strings_floss.txt
# Buscar patrones interesantes
grep -iE 'http[s]?://' strings_ascii.txt # URLs
grep -iE '([0-9]{1,3}\.){3}[0-9]{1,3}' strings_ascii.txt # IPs
grep -iE '\.exe|\.dll|\.bat|\.ps1' strings_ascii.txt # Archivos
grep -iE 'password|passwd|login|token|key' strings_ascii.txt # Credenciales
grep -iE 'HKLM|HKCU|CurrentVersion\\Run' strings_ascii.txt # Registry
grep -iE 'cmd\.exe|powershell|wscript' strings_ascii.txt # Ejecucion
Qué buscar en strings:
| Tipo | Ejemplo | Significado |
|---|---|---|
| URLs | http://c2.example.com/gate.php | C2 server |
| IPs | 192.168.1.100:4444 | C2 IP y puerto |
| Paths | C:\Users\Public\payload.exe | Ubicacion del payload |
| Registry keys | Software\Microsoft\Windows\CurrentVersion\Run | Persistencia |
| Comandos | cmd.exe /c vssadmin delete shadows | Ransomware pre-cifrado |
| Mensajes | Your files have been encrypted | Nota de rescate |
| Mutex | Global\MutexName123 | Mutex para evitar doble ejecucion |
| User-agent | Mozilla/5.0 (compatible; MSIE 10.0) | Tráfico HTTP del malware |
| PDB path | C:\Users\dev\project\Release\rat.pdb | Path de desarrollo |
| Base64 | Strings largas de caracteres alfanuméricos | Datos codificados |
Fase 3: headers y estructura (5 minutos)
PE (Windows)
# pestudio: herramienta visual, carga el PE y muestra todo
pestudio sample.exe
# O via linea de comando con pefile (Python)
python3 -c "
import pefile
pe = pefile.PE('sample.exe')
print(f'Compile time: {pe.FILE_HEADER.TimeDateStamp}')
print(f'Entry point: {hex(pe.OPTIONAL_HEADER.AddressOfEntryPoint)}')
print(f'Sections: {len(pe.sections)}')
for section in pe.sections:
name = section.Name.decode().rstrip('\\x00')
print(f' {name}: entropy={section.get_entropy():.2f}, size={section.SizeOfRawData}')
print('Imports:')
for entry in pe.DIRECTORY_ENTRY_IMPORT:
print(f' {entry.dll.decode()}:')
for imp in entry.imports[:5]:
print(f' {imp.name.decode() if imp.name else hex(imp.ordinal)}')
"
pestudio es la herramienta más eficiente para triage de PE. En una sola pantalla muestra: hashes, timestamp, imports sospechosas, strings marcadas, secciones con entropía, indicadores de malware, y score de riesgo.
ELF (Linux)
readelf -h sample # ELF header
readelf -S sample # Secciones
readelf --dyn-syms sample # Imports dinamicos
checksec --file=sample # Mitigaciones de seguridad
Fase 4: detección de packers (2 minutos)
# Detect It Easy (GUI o CLI)
diec sample
# Output ejemplo:
# PE32
# Compiler: Microsoft Visual C/C++(2019-2022)
# Packer: UPX(3.96)[NRV2E]
# Linker: Microsoft Linker(14.29)
| Resultado | Acción |
|---|---|
| No packer detectado | Proceder con análisis estático normal |
| UPX detectado | Desempaquetar con upx -d y re-analizar |
| Themida/VMProtect | Análisis dinámico obligatorio (unpacking manual complejo) |
| Packer desconocido | Verificar entropía. Si mayor a 7.0, probablemente packed |
| .NET con ConfuserEx | Deobfuscar con de4dot primero |
Fase 5: CAPA (3 minutos)
CAPA de Mandiant detecta automáticamente capacidades del malware analizando las APIs importadas, strings y patrones de código:
capa sample
# Output ejemplo:
# +-----------------------------+-------------------------------------------+
# | ATT&CK Tactic | ATT&CK Technique |
# |-----------------------------+-------------------------------------------|
# | DEFENSE EVASION | Obfuscated Files or Information [T1027] |
# | DISCOVERY | System Information Discovery [T1082] |
# | COLLECTION | Input Capture: Keylogging [T1056.001] |
# | COMMAND AND CONTROL | Application Layer Protocol [T1071] |
# | EXFILTRATION | Exfiltration Over C2 Channel [T1041] |
# +-----------------------------+-------------------------------------------+
#
# | Capability | Namespace |
# |-----------------------------+-------------------------------------------|
# | receive data | communication |
# | send data | communication |
# | create process | host-interaction/process |
# | write file | host-interaction/file-system |
# | capture keyboard input | collection/keylog |
# | encrypt data using AES | data-manipulation/encryption |
# +-----------------------------+-------------------------------------------+
CAPA mapea automáticamente a MITRE ATT&CK y proporciona una vista rápida de las capacidades sin necesidad de leer todo el disassembly.
Fase 6: extracción de IOCs (5 minutos)
Compilar todos los IOCs encontrados:
| Tipo | Valor | Fuente |
|---|---|---|
| SHA256 | abc123... | Hash del sample |
| MD5 | def456... | Hash del sample |
| C2 URL | http://evil.com/gate.php | Strings |
| C2 IP | 192.168.1.100 | Strings |
| C2 Port | 4444 | Strings |
| Mutex | Global\MutexXYZ | Strings |
| Registry key | HKCU...\Run\UpdateService | Strings |
| File dropped | C:\Users\Public\svc.exe | Strings |
| User-agent | Mozilla/5.0 ... MSIE 10 | Strings |
| PDB path | C:\dev\rat\Release\client.pdb | Debug directory |
| Compile time | 2026-05-15 14:30:00 | PE header |
| Packer | UPX 3.96 | DIE |
Fase 7: clasificación y decisión
Con toda la información, clasificar:
| Clasificación | Indicadores | Siguiente paso |
|---|---|---|
| Malware conocido | VT tiene detecciones, familia identificada | Documentar IOCs, buscar TTP en ATT&CK |
| Malware empaquetado | Entropía alta, pocas imports, packer detectado | Desempaquetar, re-analizar |
| Malware desconocido/nuevo | VT sin resultados, imports sospechosas | Análisis dinámico en sandbox |
| Posible falso positivo | VT con pocas detecciones, imports normales | Análisis dinámico para confirmar |
| Documento malicioso | Office/PDF con macros/scripts | olevba/oletools para extraer macro |
Herramientas de análisis estático
Triage rápido
| Herramienta | OS | Uso principal | Coste |
|---|---|---|---|
| pestudio | Windows | Triage de PE: imports, strings, indicadores | Gratuito |
| Detect It Easy (DIE) | Multi | Packer/compilador detection | Gratuito |
| CAPA | Multi | Detección automática de capacidades | Gratuito |
| FLOSS | Multi | Strings ofuscadas (stack strings) | Gratuito |
| strings | Multi | Strings ASCII/Unicode básico | Built-in |
| file | Multi | Identificación de tipo de archivo | Built-in |
| ssdeep | Multi | Fuzzy hashing (similitud entre muestras) | Gratuito |
Análisis profundo
| Herramienta | OS | Uso principal | Coste |
|---|---|---|---|
| Ghidra | Multi | Decompilación, análisis de código | Gratuito (NSA) |
| IDA Pro | Multi | Decompilación (estándar de la industria) | Comercial |
| radare2/rizin | Multi | RE framework CLI | Gratuito |
| Binary Ninja | Multi | Decompilación moderna | Comercial |
| x64dbg (estático) | Windows | Inspección de PE, patching | Gratuito |
| CFF Explorer | Windows | Editor de PE headers | Gratuito |
| PE-bear | Multi | Visualización de estructura PE | Gratuito |
Documentos maliciosos
| Herramienta | Tipo | Uso |
|---|---|---|
| olevba | Python | Extraer y analizar macros VBA de Office |
| oleid | Python | Identificar características sospechosas en OLE |
| rtfobj | Python | Extraer objetos OLE de RTF |
| pdfid | Python | Identificar elementos sospechosos en PDF |
| pdf-parser | Python | Analizar estructura de PDF |
| XLMMacroDeobfuscator | Python | Deobfuscar macros Excel 4.0 (XLM) |
Análisis de .NET
| Herramienta | Uso |
|---|---|
| dnSpy/dnSpyEx | Decompilación + debugging de .NET |
| ILSpy | Decompilación de .NET |
| de4dot | Deobfuscación de .NET |
| dotPeek | Decompilación (JetBrains) |
YARA: escribir reglas para detección
Regla básica
rule MyMalware_Detector {
meta:
description = "Detects MyMalware based on strings and imports"
author = "MalwareIntel"
date = "2026-05-21"
hash = "abc123..."
strings:
$url = "http://c2.example.com/gate.php" ascii
$mutex = "Global\\MutexXYZ" ascii wide
$cmd = "vssadmin delete shadows" ascii nocase
$mz = { 4D 5A } // MZ header (hex)
condition:
$mz at 0 and (2 of ($url, $mutex, $cmd))
}
YARA con imports
import "pe"
rule Suspicious_PE_Imports {
meta:
description = "PE with injection-related imports"
condition:
pe.imports("kernel32.dll", "CreateRemoteThread") and
pe.imports("kernel32.dll", "VirtualAllocEx") and
pe.imports("kernel32.dll", "WriteProcessMemory")
}
Template de informe de triage
# Informe de Triage: [nombre_muestra]
## Identificación
- **SHA256**: [hash]
- **MD5**: [hash]
- **Tipo**: PE32/ELF/Office/PDF
- **Tamaño**: [bytes]
- **VT detecciones**: [X/Y]
- **Familia**: [si identificada]
- **Primera vista en VT**: [fecha]
## Análisis estático
- **Compilador**: [GCC/MSVC/Go/Rust/.NET]
- **Timestamp**: [fecha compilación]
- **Packer**: [UPX/Themida/ninguno]
- **Entropía**: [valor]
- **Arquitectura**: [x86/x64/ARM/MIPS]
## Capacidades (CAPA)
- [Lista de capacidades detectadas]
- [Mapeo ATT&CK]
## IOCs extraídos
| Tipo | Valor | Confianza |
|------|-------|-----------|
| C2 URL | ... | Alta |
| C2 IP | ... | Alta |
| Mutex | ... | Media |
| Registry | ... | Media |
| File | ... | Media |
## Strings relevantes
- [Strings más significativos]
## Clasificación
- **Tipo**: [RAT/Infostealer/Ransomware/Loader/Backdoor]
- **Riesgo**: [Critico/Alto/Medio/Bajo]
- **Siguiente paso**: [Análisis dinámico / Documentar / Escalar]
Mapeo MITRE ATT&CK
| Técnica del analista | Qué revela del malware |
|---|---|
| Hash lookup (VT) | Familia, prevalencia, detecciones |
| Strings extraction | C2, comportamiento, mensajes |
| Import analysis | Capacidades (inyección, red, cifrado, persistencia) |
| Packer detection | Evasión, necesidad de unpacking |
| CAPA analysis | Mapeo automático a ATT&CK |
| PDB path analysis | Entorno de desarrollo, atribución |
| Timestamp analysis | Timeline, posible falsificación |
Fuentes y referencias
- Sikorski, M. & Honig, A. "Practical Malware Analysis." No Starch Press, 2012.
- Monnappa, K. "Learning Malware Analysis." Packt Publishing, 2018.
- Mandiant. "CAPA." https://github.com/mandiant/capa
- Mandiant. "FLOSS." https://github.com/mandiant/flare-floss
- Winitor. "pestudio." https://www.winitor.com/
- horsicq. "Detect It Easy." https://github.com/horsicq/Detect-It-Easy
- VirusTotal. https://www.virustotal.com/
- YARA. "The Pattern Matching Swiss Knife." https://virustotal.github.io/yara/
Preguntas frecuentes
Libros recomendados
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.