Saltar al contenido principal

Gestión de la Memoria en Windows

Introducción​

La gestión de la memoria es una de las funciones más críticas del sistema operativo. Permite que cada proceso crea que dispone de toda la memoria para sí mismo, mientras comparte la RAM física entre todos los procesos.

Conceptos Fundamentales​

Memoria Física vs Virtual​

TipoDescripciónCaracterísticas
Memoria Física (RAM)Memoria de hardware instaladaLimitada, rápida
Memoria VirtualAbstracción proporcionada por el sistema operativoIlusión de memoria ilimitada

¿Por qué la memoria virtual?​

  1. Aislamiento de procesos: Cada proceso tiene su propio espacio
  2. Protección: Un proceso no puede acceder a la memoria de otro
  3. Flexibilidad: Más memoria disponible que la RAM física
  4. Simplificación: Los programas no tienen que gestionar la RAM directamente

Espacio de Direccionamiento Virtual​

Arquitectura 32 bits vs 64 bits​

ArquitecturaEspacio TotalUser SpaceKernel Space
32 bits4 GB2 GB (o 3 GB con /3GB)2 GB (o 1 GB)
64 bits256 TB teóricos128 TB128 TB

Organización de la memoria de un proceso​

Direcciones altas
+------------------+
| Kernel Space | <- Inaccesible en modo usuario
+------------------+
| Stack | <- Pila (crece hacia abajo)
| | |
| v |
| |
| ^ |
| | |
| Heap | <- Heap (crece hacia arriba)
+------------------+
| Data (BSS) | <- Variables no inicializadas
+------------------+
| Data (Init) | <- Variables inicializadas
+------------------+
| Code | <- Instrucciones ejecutables
+------------------+
| Reserved | <- Zona protegida (puntero NULL)
+------------------+
Direcciones bajas (0x0)

Paginación​

Concepto​

La paginación divide la memoria en bloques de tamaño fijo:

  • Page: Bloque de memoria virtual (4 KB por defecto en Windows)
  • Frame: Bloque de memoria física correspondiente
  • Page Table: Estructura que mapea páginas a frames

Funcionamiento​

Dirección Virtual          Page Table          Dirección Física
[Page Number|Offset] --> [Frame Number] --> [Frame Number|Offset]

Estados de una página​

EstadoDescripción
FreeNo asignada, disponible
ReservedReservada pero no comprometida
CommittedAsignada y utilizable
SharedCompartida entre procesos

Page File (Archivo de intercambio)​

¿Qué es el Page File?​

Cuando la RAM es insuficiente, Windows mueve páginas poco usadas al disco en el archivo pagefile.sys.

Configuración​

# Ver la configuración actual
Get-WmiObject Win32_PageFileUsage | Select-Object Name, CurrentUsage, PeakUsage

# Ver el tamaño configurado
Get-WmiObject Win32_PageFileSetting | Select-Object Name, InitialSize, MaximumSize

Impacto en el rendimiento​

SituaciónRendimiento
Página en RAMAcceso: ~100 ns
Página en disco (SSD)Acceso: ~100 us (1000x más lento)
Página en disco (HDD)Acceso: ~10 ms (100000x más lento)

Tipos de Memoria en Windows​

Working Set​

El conjunto de páginas actualmente en RAM para un proceso.

# Ver el Working Set de los procesos
Get-Process | Sort-Object WorkingSet64 -Descending |
Select-Object -First 10 Name, @{N='WorkingSet(MB)';E={[math]::Round($_.WorkingSet64/1MB,2)}}

Private Bytes​

Memoria asignada exclusivamente a un proceso (no compartible).

# Ver los Private Bytes
Get-Process | Sort-Object PrivateMemorySize64 -Descending |
Select-Object -First 10 Name, @{N='PrivateBytes(MB)';E={[math]::Round($_.PrivateMemorySize64/1MB,2)}}

Virtual Bytes​

Tamaño total del espacio de direccionamiento virtual del proceso.

Commit Charge​

Total de memoria "prometida" a todos los procesos (puede exceder la RAM física).

# Ver el Commit Charge global
Get-CimInstance Win32_OperatingSystem |
Select-Object @{N='CommitTotal(GB)';E={[math]::Round($_.TotalVirtualMemorySize/1MB,2)}},
@{N='CommitUsed(GB)';E={[math]::Round(($_.TotalVirtualMemorySize - $_.FreeVirtualMemory)/1MB,2)}}

Memory-Mapped Files​

Concepto​

Permite mapear un archivo directamente en el espacio de direccionamiento de un proceso.

Ventajas​

  • Acceso al archivo como si fuera memoria
  • Compartición eficiente entre procesos
  • Gestión automática por el sistema operativo

Uso en PowerShell​

# Crear un archivo memory-mapped
Add-Type -AssemblyName System.IO.MemoryMappedFiles

$mmf = [System.IO.MemoryMappedFiles.MemoryMappedFile]::CreateNew(
"MonPartage", # Nombre
1024 # Tamaño en bytes
)

# Escribir datos
$accessor = $mmf.CreateViewAccessor()
$accessor.Write(0, [byte]65) # Escribir 'A' en la posición 0

# Leer datos
$value = $accessor.ReadByte(0)
Write-Host "Valor leído: $([char]$value)"

# Limpiar
$accessor.Dispose()
$mmf.Dispose()

Heap​

Concepto​

Zona de memoria para la asignación dinámica durante la ejecución.

Heap Manager de Windows​

Windows proporciona varios tipos de heap:

  • Process Heap: Heap por defecto del proceso
  • Private Heap: Heap creado por la aplicación
  • Low Fragmentation Heap (LFH): Optimizado para pequeñas asignaciones

Visualizar los heaps​

# Utilizar VMMap o Process Explorer para ver los heaps de un proceso
# O mediante debugger

Stack (Pila)​

Concepto​

Zona de memoria para variables locales y llamadas a funciones.

Características​

  • Tamaño fijo por hilo (1 MB por defecto en Windows)
  • Crece hacia direcciones bajas
  • Acceso muy rápido (LIFO)

Stack Overflow​

Error cuando la pila excede su tamaño máximo (recursión infinita, etc.).


Herramientas de Análisis de Memoria​

Task Manager​

  • Pestaña Rendimiento > Memoria
  • Pestaña Detalles > Columnas de memoria

Resource Monitor​

resmon.exe

Pestaña Memoria para vista detallada.

Process Explorer (Sysinternals)​

procexp.exe
  • View > Show Lower Pane
  • View > Lower Pane View > DLLs o Handles

VMMap (Sysinternals)​

vmmap.exe

Análisis detallado del espacio de direccionamiento de un proceso.

RAMMap (Sysinternals)​

rammap.exe

Vista global del uso de la RAM física.


Protecciones de Memoria en Windows​

DEP (Data Execution Prevention)​

Impide la ejecución de código en zonas de datos.

# Verificar el estado de DEP
Get-CimInstance Win32_OperatingSystem | Select-Object DataExecutionPrevention_*

ASLR (Address Space Layout Randomization)​

Aleatoriza las direcciones de carga para dificultar los exploits.

CFG (Control Flow Guard)​

Valida los destinos de las llamadas de funciones indirectas.

Credential Guard​

Aísla las credenciales en un entorno virtualizado.

# Verificar si Credential Guard está activo
Get-CimInstance -ClassName Win32_DeviceGuard -Namespace root\Microsoft\Windows\DeviceGuard |
Select-Object SecurityServicesRunning

Implicaciones de Seguridad​

Ataques relacionados con la memoria​

AtaqueDescripciónProtección
Buffer OverflowDesbordamiento de búferDEP, ASLR, canaries
Use-After-FreeUso después de liberarSafe heap
Memory DisclosureFuga de datos de memoriaInicialización
Credential DumpingRobo de credenciales en memoriaCredential Guard

Forense de memoria​

La memoria contiene información valiosa:

  • Procesos en ejecución
  • Conexiones de red
  • Credenciales en texto claro (si no están protegidas)
  • Historial de comandos
  • Malware fileless

Ejercicios​

  1. Utilice Get-Process para listar los 10 procesos que consumen más memoria
  2. Abra VMMap y analice un proceso de su elección
  3. Verifique la configuración de su page file
  4. Identifique si DEP y ASLR están activos en su sistema

Referencias​