Analisis de Procesos en Memoria Windows: pslist, pstree y Deteccion de Anomalias
Analisis forense de procesos en volcados de memoria Windows con Volatility 3. Uso de pslist, pstree, psscan y cmdline para detectar procesos sospechosos, anomalias PPID, procesos ocultos y tecnicas de evasion como PPID spoofing y process masquerading.
Los procesos cuentan la historia del incidente
Cuando un atacante compromete un sistema Windows, todo lo que hace se refleja en procesos. Ejecutar un payload crea un proceso. Lanzar un shell inverso crea un proceso. Moverse lateralmente con PsExec crea un proceso. Exfiltrar datos crea un proceso. Incluso el malware fileless, que evita escribir en disco, necesita ejecutarse dentro de un proceso.
El analisis de procesos en memoria es la primera y mas importante linea de investigacion en memory forensics. Volatility 3 ofrece varios plugins que revelan no solo que procesos estaban activos, sino sus relaciones jerarquicas, lineas de comandos, timestamps y discrepancias que delatan actividad maliciosa.
La estructura EPROCESS de Windows
Cada proceso en Windows tiene una estructura EPROCESS en el espacio del kernel. Esta estructura contiene toda la informacion que el kernel necesita para gestionar el proceso:
- UniqueProcessId: el PID.
- InheritedFromUniqueProcessId: el PPID (proceso padre).
- ImageFileName: los primeros 15 caracteres del nombre del ejecutable.
- CreateTime / ExitTime: timestamps de creacion y finalizacion.
- ActiveProcessLinks: punteros a la lista doblemente enlazada de procesos activos.
- Token: el token de seguridad que define los privilegios del proceso.
- Peb: puntero al Process Environment Block en espacio de usuario.
- VadRoot: raiz del arbol de Virtual Address Descriptors.
Las estructuras EPROCESS estan enlazadas en una lista circular doblemente enlazada a traves de ActiveProcessLinks. El kernel recorre esta lista cuando necesita enumerar procesos, y las herramientas del sistema (Administrador de Tareas, tasklist) usan APIs que tambien recorren esta lista.
Plugin pslist: la lista oficial de procesos
vol -f memory.raw windows.pslist
pslist recorre la lista ActiveProcessLinks empezando desde PsActiveProcessHead, exactamente como lo haria el Administrador de Tareas. Muestra:
PID PPID ImageFileName Offset(V) Threads Handles SessionId CreateTime
4 0 System 0xfa8000c17040 120 - - 2026-06-01 10:00:00
88 4 Registry 0xfa8000d23080 4 - - 2026-06-01 10:00:00
396 4 smss.exe 0xfa8001234560 2 29 - 2026-06-01 10:00:01
516 396 csrss.exe 0xfa8001567890 12 543 0 2026-06-01 10:00:02
564 396 wininit.exe 0xfa8001678900 3 82 0 2026-06-01 10:00:03
572 508 csrss.exe 0xfa8001789010 14 432 1 2026-06-01 10:00:03
620 508 winlogon.exe 0xfa8001890120 5 126 1 2026-06-01 10:00:04
680 564 services.exe 0xfa8001901230 8 298 0 2026-06-01 10:00:05
700 564 lsass.exe 0xfa8001a12340 9 687 0 2026-06-01 10:00:05
La informacion clave por columna:
- PID/PPID: identificadores del proceso y su padre.
- ImageFileName: nombre del ejecutable (truncado a 15 caracteres).
- Threads/Handles: un proceso con 0 threads activos pero sin ExitTime puede ser anomalo.
- SessionId: 0 para servicios del sistema, 1 o superior para sesiones de usuario.
- CreateTime: cuando se creo el proceso.
Plugin pstree: relaciones padre-hijo
vol -f memory.raw windows.pstree
pstree muestra la misma informacion que pslist pero organizada como arbol jerarquico:
PID PPID ImageFileName CreateTime
4 0 System 2026-06-01 10:00:00
* 88 4 Registry 2026-06-01 10:00:00
* 396 4 smss.exe 2026-06-01 10:00:01
** 516 396 csrss.exe 2026-06-01 10:00:02
** 564 396 wininit.exe 2026-06-01 10:00:03
*** 680 564 services.exe 2026-06-01 10:00:05
**** 1024 680 svchost.exe 2026-06-01 10:00:10
**** 1136 680 svchost.exe 2026-06-01 10:00:11
*** 700 564 lsass.exe 2026-06-01 10:00:05
** 620 508 winlogon.exe 2026-06-01 10:00:04
El arbol de procesos es la herramienta mas poderosa para detectar anomalias porque visualiza las relaciones que deben seguir patrones especificos en Windows.
El arbol de procesos normal de Windows
Windows tiene un arbol de procesos predecible. Conocerlo es requisito para detectar desviaciones. El arbol normal de un Windows 10/11:
System (PID 4) es el primer proceso, creado por el kernel. PPID 0. Siempre PID 4.
smss.exe (Session Manager Subsystem). Hijo de System. Crea la primera instancia de csrss.exe y wininit.exe para la sesion 0 (sistema), y csrss.exe y winlogon.exe para la sesion 1 (usuario).
csrss.exe (Client/Server Runtime Subsystem). Dos instancias como minimo: una para sesion 0, otra para sesion 1. Padre: smss.exe. Nota: smss.exe termina su instancia original y crea una nueva para cada sesion, por lo que el PPID de csrss.exe puede apuntar a un smss.exe que ya no existe.
wininit.exe. Hijo de smss.exe (sesion 0). Inicia services.exe, lsass.exe y lsaiso.exe.
services.exe (Service Control Manager). Hijo de wininit.exe. Es el padre de todos los procesos svchost.exe y de los servicios del sistema.
lsass.exe (Local Security Authority). Hijo de wininit.exe. Solo debe haber UNA instancia. Gestiona autenticacion y credenciales.
svchost.exe (Service Host). Siempre hijo de services.exe. Ejecuta servicios de Windows. La linea de comandos siempre contiene -k seguido del grupo de servicios.
explorer.exe. Proceso del escritorio del usuario. Hijo de userinit.exe (que termina tras lanzar explorer, por lo que el PPID puede no existir).
Anomalias que delatan actividad maliciosa
Anomalia 1: PPID incorrecto
Cada proceso critico de Windows tiene un padre predeterminado. Si el padre es diferente, algo va mal:
- svchost.exe cuyo padre NO es services.exe: posible malware ejecutandose como svchost.
- lsass.exe cuyo padre NO es wininit.exe: critico, posible robo de credenciales.
- cmd.exe o powershell.exe hijo de winword.exe, excel.exe o outlook.exe: explotacion de documento.
- cmd.exe hijo de w3wp.exe (IIS worker): posible web shell.
Anomalia 2: procesos con nombres similares (masquerading)
Atacantes nombran sus binarios con nombres parecidos a procesos legitimos:
- scvhost.exe (c y v intercambiadas) en lugar de svchost.exe
- svch0st.exe (cero en lugar de o)
- csrss.exe ejecutandose desde C:\Users\ en lugar de C:\Windows\System32\
Para detectar masquerading, combina pslist con cmdline:
vol -f memory.raw windows.cmdline
Esto muestra la ruta completa del ejecutable de cada proceso. Un proceso svchost.exe cuya ruta no es C:\Windows\System32\svchost.exe es sospechoso.
Anomalia 3: procesos duplicados donde solo deberia haber uno
Procesos que deben tener una unica instancia:
- lsass.exe: solo una instancia. Dos lsass.exe indica que uno es malicioso.
- wininit.exe: solo una instancia.
- services.exe: solo una instancia.
- System: solo uno, siempre PID 4.
Anomalia 4: timestamps sospechosos
Un proceso que se creo mucho despues del arranque del sistema, a una hora inusual (3 AM en un servidor que nadie opera de noche), o que tiene un CreateTime anterior al del proceso System, es sospechoso.
vol -f memory.raw windows.pslist | sort -k8
Ordenar por timestamp de creacion ayuda a ver que procesos se lanzaron fuera de lo normal.
Anomalia 5: procesos sin hilos
Un proceso con 0 threads activos pero sin ExitTime registrado puede indicar un proceso zombie o uno que esta siendo ocultado. Los procesos normales tienen al menos un hilo activo.
Plugin psscan: encontrar procesos ocultos
vol -f memory.raw windows.psscan
psscan no recorre la lista enlazada de procesos activos. En su lugar, escanea toda la memoria fisica buscando el pool tag de las estructuras EPROCESS. Esto significa que encuentra:
- Procesos activos (los mismos que pslist).
- Procesos terminados cuya estructura EPROCESS aun no fue reciclada.
- Procesos ocultos por DKOM (Direct Kernel Object Manipulation), que fueron desenlazados de ActiveProcessLinks.
La comparacion entre pslist y psscan revela procesos ocultos:
# Exportar PIDs de ambos plugins
vol -f memory.raw windows.pslist -r csv | cut -d, -f1 > pslist_pids.txt
vol -f memory.raw windows.psscan -r csv | cut -d, -f1 > psscan_pids.txt
# Comparar
diff pslist_pids.txt psscan_pids.txt
Un proceso que aparece en psscan pero no en pslist esta oculto o terminado. Si tiene threads activos, es un proceso que un rootkit esta ocultando.
Plugin cmdline: la linea de comandos completa
vol -f memory.raw windows.cmdline
Muestra la linea de comandos completa con la que se lanzo cada proceso. Es crucial para:
- Verificar la ruta del ejecutable (detectar masquerading).
- Ver argumentos de ejecucion (parametros de malware, scripts PowerShell).
- Identificar procesos lanzados con parametros sospechosos.
Ejemplo de salida con anomalia:
PID Process CommandLine
1024 svchost.exe C:\Windows\System32\svchost.exe -k netsvcs
4321 svchost.exe C:\Users\Public\svchost.exe -connect 185.100.87.202:443
El segundo svchost.exe tiene una ruta incorrecta y parametros que indican conexion a un servidor C2.
Plugin envars: variables de entorno
vol -f memory.raw windows.envars --pid 4321
Las variables de entorno de un proceso pueden revelar el contexto de ejecucion: el usuario, la ruta, el directorio temporal, variables personalizadas que el malware pueda haber definido.
Detectar PPID Spoofing
PPID Spoofing es una tecnica donde el malware crea un proceso con un PPID falso. Usando la API CreateProcess con PROC_THREAD_ATTRIBUTE_PARENT_PROCESS, un proceso puede especificar cualquier proceso como su padre en la estructura EPROCESS.
Esto significa que un cmd.exe malicioso puede parecer hijo de services.exe en lugar de mostrar su verdadero padre. Las herramientas de deteccion basadas solo en el PPID seran enganadas.
Para detectar PPID Spoofing en memoria:
-
Verificar coherencia del token de seguridad. Si un proceso dice ser hijo de services.exe pero tiene el token de seguridad del usuario "JuanPerez", hay PPID spoofing. services.exe corre como SYSTEM.
-
Analizar el handle table del padre declarado. Si services.exe (el supuesto padre) no tiene un handle al proceso hijo, no lo creo realmente.
-
Buscar el handle PROC_THREAD_ATTRIBUTE_PARENT_PROCESS. El proceso real que creo el hijo tendra un handle al proceso suplantado como padre.
-
ETW (Event Tracing for Windows) en memoria. Si hay trazas ETW en el dump, el evento de creacion de proceso mostrara el PID real del creador.
Caso practico: analisis de procesos en un sistema comprometido
Supongamos un dump de memoria donde el SOC detecto trafico sospechoso. Ejecutamos pslist y pstree:
vol -f compromised.raw windows.pstree
Observamos:
** 620 508 winlogon.exe 2026-06-01 10:00:04
*** 3100 620 explorer.exe 2026-06-01 10:05:30
**** 4200 3100 chrome.exe 2026-06-01 10:10:00
**** 5500 3100 WINWORD.EXE 2026-06-01 14:22:15
***** 5600 5500 cmd.exe 2026-06-01 14:22:18
****** 5700 5600 powershell.exe 2026-06-01 14:22:19
La cadena WINWORD.EXE -> cmd.exe -> powershell.exe es un indicador clasico de explotacion de macro maliciosa en un documento de Word. El usuario abrio un documento a las 14:22, y tres segundos despues se lanzo un cmd.exe y un PowerShell desde Word.
Verificamos con cmdline:
vol -f compromised.raw windows.cmdline --pid 5700
PID Process CommandLine
5700 powershell.exe powershell.exe -nop -w hidden -enc SQBFAFgAIAAoAE4AZQB3AC...
El flag -enc con una cadena Base64 larga es la firma clasica de un payload PowerShell ofuscado. Los parametros -nop (no profile) y -w hidden (ventana oculta) confirman intento de evasion.
Ahora revisamos netscan para ver si ese PowerShell establecio conexion:
vol -f compromised.raw windows.netscan | grep 5700
Offset Proto LocalAddr LocalPort ForeignAddr ForeignPort State PID Owner
0xfa800... TCPv4 192.168.1.50 49832 185.100.87.202 443 ESTABLISHED 5700 powershell.exe
Conexion establecida a una IP externa por HTTPS. Este es el canal C2.
Checklist de analisis de procesos
Para cada volcado de memoria, sigue este orden:
- Ejecutar
windows.pstree. Revisar visualmente el arbol. Buscar ramificaciones inesperadas. - Ejecutar
windows.cmdline. Verificar rutas de ejecutables. Buscar parametros sospechosos. - Comparar
windows.pslistconwindows.psscan. Buscar procesos ocultos. - Verificar procesos criticos: una sola instancia de lsass.exe, wininit.exe, services.exe.
- Verificar svchost.exe: todos hijos de services.exe, todos con flag
-k. - Buscar procesos con nombres similares a procesos legitimos (masquerading).
- Revisar timestamps: procesos creados fuera del horario normal o mucho despues del arranque.
- Verificar SessionId: servicios del sistema en sesion 0, procesos de usuario en sesion 1 o superior.
Proximo paso
Con los procesos sospechosos identificados, el siguiente paso es profundizar en su contenido: DLLs cargadas, handles abiertos y regiones de memoria. En el proximo articulo cubrimos dlllist, handles y la deteccion de DLLs inyectadas y procesos hollowed.
Preguntas frecuentes
Libros recomendados
Artículos relacionados
Volatility 3: Instalacion, Configuracion y Primeros Pasos
Analisis de DLLs y Handles en Memoria: dlllist, handles y Deteccion de Inyeccion
Malfind y Deteccion de Code Injection en Memoria con Volatility 3
AMSI Bypass: Técnicas de Evasión y Contramedidas Defensivas
Análisis de Malware .NET con dnSpy y de4dot: Guía Práctica
Anatomía de un PE: Entendiendo los Ejecutables de Windows para Análisis de Malware
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.