The Art of Memory Forensics

Introduccion
El libro explica en sus primeros capitulos estructuras relevantes del sistema operativo Windows y, aunque fue publicado en 2014, muchas de estas estructuras crÃticas, como _EPROCESS, _PEB, VadRoot siguen siendo fundamentales en el análisis de memoria actual. Si bien estas estructuras pueden cambiar con cada nueva versión de Windows., su núcleo permanece relativamente estable.
A continuación, se presentan estructuras de _EPROCESS correspondientes a tres versiones del sistema operativo Windows: dos de Windows 11 —la versión 23H2 (2023 Update, "Nickel R2") y la versión 24H2 (2024 Update, "Germanium")— y una de Windows 7, especÃficamente de Windows Server 2008 R2 con Service Pack 1.
Si bien las estructuras de Windows 11 son en su mayorÃa similares entre sÃ, presentan ligeras diferencias que se vuelven más evidentes con cada nueva actualización. Estas diferencias son aún más notorias al compararlas con versiones anteriores como Windows 7.
Entonces este libro proporciona un punto de partida sólido que nos permite estudiar en mayor profundidad e investigar mas por nuestra cuenta. Además, nos introduce conceptos importantes como hooks, rootkits, procesos ocultos, entre otros aspectos del malware en memoria teoricamente.
En aquel entonces, se trabajaba principalmente con Volatility 2 en Python 2; sin embargo, desde el 16 de mayo de 2025, dicho repositorio fue archivado oficialmente y marcado como de solo lectura.

Aunque el desarrollo de Volatility 2 se ha detenido, muchos de sus plugins han sido reescritos para Python 3 en la nueva versión: Volatility 3, que presenta una arquitectura modular y soporte para sistemas más modernos
En esta reseña compartiré lo que considero más valioso que este libro puede ofrecernos, y aprovecharé para agradecer a sus autores: Michael Hale Ligh, Andrew Case, Jaime Levy y Aaron Walters. Conocà este libro hace muchos años, pero en ese entonces no lograba entenderlo. Ahora, finalmente lo comprendo y me siento muy feliz.
Este libro lo puedes encontrar fácilmente en Internet, pero decidà comprarlo y tenerlo en fÃsico en mi casa. Para mÃ, tenerlo en las manos es muy valioso y me genera un vÃnculo distinto.

Estructura y temas principales
El libro se divide en 4 partes que abordan la teorÃa y práctica del análisis de memoria en los sistemas operativos Windows, Linux y macOS. Cada sección está compuesta por varios capÃtulos que combinan fundamentos técnicos con casos reales, utilizando como herramienta principal Volatility2.
Introducción a la memoria forense
Esta primera parte del capitulo 1 enseña las bases teóricas del computador. Aquà se explican los conceptos fundamentales del funcionamiento de los sistemas operativos

En la imagen explica como el CPU trabaja con el MMU (Memory Management Unit), y como a su ves el MMU trabaja con el TLB (Translation Lookaside Buffer) que es una cache que el MMU mantiene.

Luego, el libro explica qué es la paginación, un mecanismo fundamental que permite traducir direcciones de memoria virtuales en direcciones fÃsicas.
En el uso normal del sistema, esta traducción ocurre de forma automática gracias al MMU, pero cuando estamos depurando o analizando memoria a bajo nivel, es necesario realizarla de forma manual para interpretar correctamente las estructuras y direcciones.
En arquitecturas de 32 bits, cuando se utilizan páginas de 4 KB, la dirección virtual de 32 bits se divide en tres partes:
1 .- La primera parte (bits 31–22) sirve como Ãndice para ubicar el Page Directory (PDE).
2 .- La segunda parte (bits 21–12) sirve como Ãndice para ubicar el Page Table (PTE).
3 .- La tercera parte (bits 11–0) es el offset, que indica la posición dentro de la página fÃsica.

Este sistema permite que un espacio de direcciones virtual sea más grande que la memoria fÃsica disponible, y que cada proceso tenga su propia vista aislada de la memoria. La traducción ocurre mediante estructuras residentes en memoria llamadas directorios y tablas de páginas, gestionadas por el MMU.
Un mecanismo similiar funciona en 64 bits pero ya no de dos componentes de busqueda como el PD y el PT si no de 4 llamado PML4
1 .- PML4 - Page Map Leve 4
2 .- Page Directory Pointer table
3 .- Page DIrectory
4 .- Page Table

Al utilizar diferentes estructuras de paginación para distintos procesos, un sistema operativo puede proporcionar a cada proceso la apariencia de un entorno de programación único mediante un espacio de direcciones lineal virtualizado.
Notarás que en las imágenes anteriores se muestra un valor de CR3.
CR3 es un registro de control del CPU que almacena la dirección fÃsica de la tabla raÃz de paginación: el Page Directory en arquitecturas de 32 bits, o el Page Map Level 4 (PML4) en arquitecturas de 64 bits. A partir de esta dirección base, se puede llevar a cabo el proceso de traducción de una dirección virtual a su correspondiente dirección fÃsica, recorriendo las estructuras de paginación del sistema. Este procedimiento, aunque muy técnico y detallado, se realiza de forma automática por la Unidad de Gestión de Memoria (MMU) durante la ejecución del sistema, y por herramientas como Volatility durante el análisis forense.
Sin embargo, cuando realizamos depuración o análisis a bajo nivel, es necesario llevar a cabo esta traducción manualmente, interpretando cada nivel de la jerarquÃa de paginación paso a paso.
Luego en el capÃtulo 2 se abordan las estructuras de datos, centrándose principalmente en aquellas utilizadas en el lenguaje de programación C. Estas estructuras son fundamentales para entender cómo se organiza la información en la memoria RAM y cómo se representan en sistemas operativos modernos como Windows. Se debe tener una comprensión básica de estas estructuras para interpretar correctamente el contenido de la memoria, detectar modificaciones maliciosas y aplicar técnicas de análisis forense con mayor precisión.
Nos comentan los tipos de datos que tiene C, y que Windows también define muchos de sus propios tipos basados ​​en estos tipos básicos que se pueden ver en los archivos de encabezado y la documentación de Windows.

Nos enseñan otro tipo de datos, estructura de datos, llamado bitmap que permite representar el estado de un conjunto de elementos mediante una secuencia de bits. Cada bit de esta estructura indica una condición binaria (por ejemplo, activo/inactivo, libre/ocupado, habilitado/deshabilitado) correspondiente a un recurso identificado por su posición en el conjunto. Su ventaja es que solo un unico byte puede representar hasta ocho elementos.

En la imagen se representan 65,535 cuadraditos, es decir, (2^16) -1, que corresponde al total de puertos posibles en un sistema. Para gestionar esta gran cantidad de valores, el sistema utiliza un bitmap: una estructura que emplea un bit por cada puerto para indicar si está en uso (1) o libre (0). Como se muestra en la figura, algunos bytes contienen bits en 1, lo que significa que esos puertos especÃficos están ocupados.
En la siguiente sección, el libro presenta las listas enlazadas, que son estructuras que almacenan elementos conectados entre sà mediante punteros, en lugar de estar organizados en bloques contiguos como ocurre con los arrays.
Se describen cuatro tipos fundamentales. Aunque existen variantes más especializadas, estas cuatro forman la base sobre la cual se construyen la mayorÃa de implementaciones modernas.
Singly Linked List (lista enlazada simple): cada nodo apunta únicamente al siguiente. Solo puede recorrerse en una dirección (hacia adelante).

Doubly Linked List (lista doblemente enlazada): cada nodo contiene dos punteros: Blink (al nodo anterior) y Flink (al siguiente). Se puede recorrer en ambos sentidos y es muy común en estructuras internas de Windows, como listas de procesos, módulos o controladores.
Circular Linked List (lista circular): el último nodo apunta nuevamente al primero, formando un ciclo cerrado. Es ampliamente utilizada en el kernel de Linux para estructuras como la lista de procesos (task_struct) o la gestión de sockets.

Embedded Doubly Linked List (lista doble embebida): se trata de una lista doblemente enlazada en la que la estructura de enlaces (_LIST_ENTRY) está embebida dentro del objeto principal (ActiveProcessLinks). Este diseño es común en Windows y es clave para entender cómo se enlazan procesos, controladores u otros objetos del sistema. Al seguir un puntero Flink, no se accede directamente a la estructura del objeto, sino al campo de enlace embebido dentro de ella. Por eso, para recuperar la estructura completa, es necesario restar el offset del campo donde se encuentra el LIST_ENTRY.

Forense en Windows
Forense en Linux
Forense en MacOX
Lo que aprendi
Relevancia
Conclusión
Last updated