Intermediomemory forensicsprocesosVolatilityWindowsdeteccion

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.

MalwareIntel Research··10 min lectura
Serie: Memory Forensics — Parte 4

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:

  1. 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.

  2. Analizar el handle table del padre declarado. Si services.exe (el supuesto padre) no tiene un handle al proceso hijo, no lo creo realmente.

  3. Buscar el handle PROC_THREAD_ATTRIBUTE_PARENT_PROCESS. El proceso real que creo el hijo tendra un handle al proceso suplantado como padre.

  4. 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:

  1. Ejecutar windows.pstree. Revisar visualmente el arbol. Buscar ramificaciones inesperadas.
  2. Ejecutar windows.cmdline. Verificar rutas de ejecutables. Buscar parametros sospechosos.
  3. Comparar windows.pslist con windows.psscan. Buscar procesos ocultos.
  4. Verificar procesos criticos: una sola instancia de lsass.exe, wininit.exe, services.exe.
  5. Verificar svchost.exe: todos hijos de services.exe, todos con flag -k.
  6. Buscar procesos con nombres similares a procesos legitimos (masquerading).
  7. Revisar timestamps: procesos creados fuera del horario normal o mucho despues del arranque.
  8. 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

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.