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
| Tipo | Descripción | Características |
|---|---|---|
| Memoria Física (RAM) | Memoria de hardware instalada | Limitada, rápida |
| Memoria Virtual | Abstracción proporcionada por el sistema operativo | Ilusión de memoria ilimitada |
¿Por qué la memoria virtual?
- Aislamiento de procesos: Cada proceso tiene su propio espacio
- Protección: Un proceso no puede acceder a la memoria de otro
- Flexibilidad: Más memoria disponible que la RAM física
- Simplificación: Los programas no tienen que gestionar la RAM directamente
Espacio de Direccionamiento Virtual
Arquitectura 32 bits vs 64 bits
| Arquitectura | Espacio Total | User Space | Kernel Space |
|---|---|---|---|
| 32 bits | 4 GB | 2 GB (o 3 GB con /3GB) | 2 GB (o 1 GB) |
| 64 bits | 256 TB teóricos | 128 TB | 128 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
| Estado | Descripción |
|---|---|
| Free | No asignada, disponible |
| Reserved | Reservada pero no comprometida |
| Committed | Asignada y utilizable |
| Shared | Compartida 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ón | Rendimiento |
|---|---|
| Página en RAM | Acceso: ~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
| Ataque | Descripción | Protección |
|---|---|---|
| Buffer Overflow | Desbordamiento de búfer | DEP, ASLR, canaries |
| Use-After-Free | Uso después de liberar | Safe heap |
| Memory Disclosure | Fuga de datos de memoria | Inicialización |
| Credential Dumping | Robo de credenciales en memoria | Credential 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
- Utilice
Get-Processpara listar los 10 procesos que consumen más memoria - Abra VMMap y analice un proceso de su elección
- Verifique la configuración de su page file
- Identifique si DEP y ASLR están activos en su sistema