IntermedioWindows.NETdnSpyde4dotdeobfuscaciónanálisis

Análisis de Malware .NET con dnSpy y de4dot: Guía Práctica

Guía práctica de análisis de malware .NET. Uso de dnSpy para decompilación y debugging, de4dot para deobfuscación, análisis de RATs como Agent Tesla y AsyncRAT, y técnicas de identificación de obfuscadores .NET (ConfuserEx, SmartAssembly, Babel).

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

.NET malware: el código fuente está a la vista

El análisis de malware .NET es fundamentalmente diferente al análisis de malware nativo. Cuando un desarrollador compila un programa en C#, el resultado no es código máquina x86/x64: es MSIL (Microsoft Intermediate Language), un bytecode de nivel intermedio que se compila a código nativo en runtime por el JIT (Just-In-Time compiler).

La consecuencia para el analista: MSIL se puede decompilar a C# casi perfecto. Nombres de clases, métodos, variables, strings, lógica de control. Es como tener acceso al código fuente original, salvo que el desarrollador haya aplicado ofuscación.

Esta ventaja hace que el análisis de malware .NET sea más accesible para analistas que no son expertos en assembly, y más rápido incluso para los que sí lo son.

Identificación de assemblies .NET

Indicadores en el PE

IndicadorCómo verificar
Data Directory 14 (CLR Runtime Header)pestudio, CFF Explorer: COM Descriptor directory no es 0
Import de mscoree.dll _CorExeMainpestudio, pefile: úsolo tiene este import
Strings "mscorlib", "System."strings o FLOSS
Detect It EasyDIE identifica ".NET" con versión de framework
CAPAReporta capability "compiled as .NET"

Versiones de .NET

FrameworkIdentificaciónImpacto en análisis
.NET Framework 2.0-4.8PE clásico con CLR headerdnSpy, ILSpy funcionan perfectamente
.NET Core / .NET 5-8Single-file publish, ReadyToRunPuede requerir extracción del assembly del bundle
Native AOT (.NET 8+)Compilado a nativo, sin ILSe pierde la ventaja de decompilación. Analizar como nativo

Herramientas esenciales

dnSpy / dnSpyEx

AspectoDetalle
TipoDecompilador + Debugger .NET
Lenguajes decompiladosC#, VB.NET, IL
DebuggingPuede debuggear assemblies .NET paso a paso
EdiciónPermite editar IL y recompilar (útil para patchear checks anti-analysis)
EstadoOriginal archivado, fork activo: dnSpyEx

Workflow básico con dnSpy:

  1. Abrir el assembly en dnSpy
  2. Navegar al EntryPoint (Main o constructor del Form principal)
  3. Leer el código decompilado como C#
  4. Identificar: URLs de C2, claves de cifrado, técnicas de persistencia
  5. Si está ofuscado: usar de4dot primero, luego reabrir en dnSpy
  6. Para análisis dinámico: poner breakpoints y debuggear

de4dot

AspectoDetalle
TipoDeobfuscador .NET automático
InputAssembly .NET ofuscado
OutputAssembly .NET deobfuscado
SoportaConfuserEx, SmartAssembly, Dotfuscator, Babel, Eazfuscator, Agile.NET, y más

Uso básico:

# Deobfuscar automaticamente (detecta el obfuscador)
de4dot.exe malware.exe -o malware_clean.exe

# Forzar un obfuscador especifico
de4dot.exe malware.exe --strtyp delegate --strtok 0x06000042 -o clean.exe

# Solo renombrar simbolos (sin string decryption)
de4dot.exe malware.exe --dont-rename -o renamed.exe

Otras herramientas

HerramientaUso
ILSpyDecompilador .NET (alternativa a dnSpy, sin debugger)
dotPeek (JetBrains)Decompilador gratuito, integración con ReSharper
CAPADetección automática de capacidades
pestudioIdentificación rápida de .NET y sus características
monodisDecompilador de Mono (para assemblies Linux)
AsmResolverLibrería para manipulación programática de assemblies
dnlibLibrería .NET para leer/escribir assemblies (usada por de4dot)

Obfuscadores .NET y cómo identificarlos

Obfuscadores comunes en malware

ObfuscadorIdentificaciónde4dot soportePrevalencia
ConfuserExStrings con caracteres Unicode, control flow flattening agresivoParcial (strings sí, CF parcial)Muy alta
SmartAssemblyRecursos embebidos comprimidos, strings cifradasAlta
.NET ReactorCódigo nativo embebido, anti-decompilationParcialAlta
DotfuscatorRenaming (Dotfuscator Community en VS)Sí (renaming)Media
Babel ObfuscatorMSIL cifrado, virtualizationMedia
Eazfuscator.NETStrings cifradas, control flowMedia
Agile.NETString encryption, code virtualizationBaja
Crypto ObfuscatorStrings + resources cifradosBaja
CustomOfuscación propia sin herramienta comercialNo (manual)Variable

ConfuserEx: el más común en malware

ConfuserEx es open source y gratuito, lo que lo hace popular entre desarrolladores de malware. Sus protecciones:

  • Renaming: clases y métodos renombrados a caracteres Unicode ilegibles
  • String encryption: strings cifradas y descifradas en runtime
  • Control flow flattening: lógica de if/else/loops convertida en switch con dispatcher
  • Anti-debug: checks de debugger integrados
  • Anti-dump: impedir dump de memoria
  • Resource encryption: recursos embebidos cifrados

Deobfuscación: de4dot maneja strings y renaming. Control flow flattening requiere herramientas adicionales o análisis manual.

Familias de malware .NET más comunes

Agent Tesla (Infostealer)

AspectoDetalle
TipoInfostealer / Keylogger
LenguajeC# (.NET)
OfuscadorConfuserEx, SmartAssembly, .NET Reactor (varía)
CapacidadesKeylogger, screenshot, credential theft (navegadores, email, FTP), clipboard
ExfiltraciónSMTP (email), FTP, HTTP POST, Telegram Bot API
PersistenciaRegistry Run keys, Scheduled Tasks
DistribuciónPhishing (adjuntos Office, ISO, RAR)

Análisis típico:

  1. Deobfuscar con de4dot
  2. Abrir en dnSpy, buscar clase "Main" o "Form1"
  3. Buscar strings: SMTP server, email, password, FTP URL, Telegram bot token
  4. Identificar módulos: KeyLogger, ScreenCapture, BrowserCredentials, EmailCredentials
  5. Extraer IOCs: C2 URLs, credenciales del operador, Telegram chat ID

AsyncRAT

AspectoDetalle
TipoRemote Access Trojan (open source)
Código fuenteDisponible en GitHub (NYAN-x-CAT/AsyncRAT-C-Sharp)
OfuscadorVariable (el builder permite elegir)
CapacidadesRemote desktop, keylogger, file manager, process manager, shell, webcam
C2TCP con certificado SSL auto-firmado
ConfiguraciónEmbebida en Settings class, a veces cifrada con AES

Extraer configuración:

// Buscar en dnSpy la clase "Settings" o "Config"
public static class Settings
{
    public static string Host = "decrypt(encoded_host)";
    public static int Port = 8808;
    public static string Key = "decrypt(encoded_key)";
    public static string Mutex = "AsyncMutex_xxxxx";
    public static string Certificate = "decrypt(cert_data)";
}

Quasar RAT

Similar a AsyncRAT (open source, C#), pero con arquitectura cliente-servidor más robusta. El análisis sigue el mismo workflow: deobfuscar, buscar Settings/Config, extraer C2 y credenciales.

Workflow completo de análisis

Paso 1: triage

1. Calcular hash (SHA256)
2. Buscar en VirusTotal
3. Identificar como .NET (DIE, pestudio)
4. Identificar obfuscador (DIE, dnSpy)
5. Ejecutar CAPA para capacidades automáticas

Paso 2: deobfuscación

de4dot.exe sample.exe -o sample_clean.exe

# Si de4dot no identifica el obfuscador:
de4dot.exe sample.exe --un-name "!^[a-zA-Z]" -o sample_clean.exe

Paso 3: análisis estático en dnSpy

1. Abrir sample_clean.exe en dnSpy
2. Ir al EntryPoint (Boton derecho en assembly → Go to Entry Point)
3. Leer Main(): identificar flujo principal
4. Buscar clases de configuracion (Settings, Config, Connection)
5. Buscar strings de interes: URLs, IPs, paths, claves
6. Identificar mecanismos de persistencia
7. Identificar tecnicas de evasion (IsDebuggerPresent, Sleep, sandbox checks)
8. Documentar IOCs

Paso 4: análisis dinámico (si necesario)

1. En dnSpy: Debug → Start Debugging (F5)
2. Poner breakpoint en funciones de interes:
   - Funcion de descifrado de configuracion
   - Funcion de conexion C2
   - Funcion de persistencia
3. Ejecutar hasta el breakpoint
4. Inspeccionar variables locales (valores descifrados)
5. Extraer configuracion descifrada

Paso 5: extracción de IOCs

Tipo de IOCDónde buscar en el código
C2 IP/DomainClase Settings/Config, métodos de conexión
C2 PortClase Settings/Config
Encryption keyClase de cifrado, Settings
MutexCreateMutex calls, Settings
Persistence pathRegistry key values, file paths
User-agentHTTP client configuration
Telegram Bot TokenStrings que empiezan con números y contienen ":"
SMTP credentialsHost, port, username, password del email de exfiltración

Técnicas de anti-analysis en .NET

Anti-debugging

// Check comun en malware .NET
if (Debugger.IsAttached)
    Environment.Exit(0);

// Timing check
Stopwatch sw = Stopwatch.StartNew();
Thread.Sleep(1000);
if (sw.ElapsedMilliseconds > 1500)  // Demasiado lento = debugger
    Environment.Exit(0);

Bypass en dnSpy: editar el IL para invertir la condición o NOP el check. Boton derecho en la instrucción → Edit IL Instructions.

Anti-sandbox

// Check de VM
if (Environment.MachineName.Contains("SANDBOX"))
    Environment.Exit(0);

// Check de procesos de analisis
string[] badProcesses = { "wireshark", "procmon", "x64dbg", "dnspy" };
foreach (var p in Process.GetProcesses())
    if (badProcesses.Any(b => p.ProcessName.ToLower().Contains(b)))
        Environment.Exit(0);

Resource encryption

Muchos malware .NET almacenan su payload real como recurso cifrado:

// Patron comun: cargar recurso, descifrar, ejecutar
byte[] resource = Properties.Resources.payload;
byte[] decrypted = AES_Decrypt(resource, key);
Assembly.Load(decrypted).EntryPoint.Invoke(null, null);

El payload real solo existe descifrado en memoria. Para extraerlo: breakpoint después del descifrado y dumpar el array de bytes.

Mapeo MITRE ATT&CK

TécnicaIDContexto .NET
Obfuscated FilesT1027ConfuserEx, SmartAssembly
Deobfuscate/DecodeT1140Runtime string decryption
Input Capture: KeyloggingT1056.001SetWindowsHookEx desde .NET
Screen CaptureT1113Graphics.CopyFromScreen()
Credentials from BrowsersT1555.003SQLite read de Chrome/Firefox DBs
Application Layer ProtocolT1071HTTP/SMTP/Telegram C2

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.