Gestion de la Memoire Windows
Introduction
La gestion de la memoire est une des fonctions les plus critiques du systeme d'exploitation. Elle permet a chaque processus de croire qu'il dispose de toute la memoire a lui seul, tout en partageant la RAM physique entre tous les processus.
Concepts Fondamentaux
Memoire Physique vs Virtuelle
| Type | Description | Caracteristiques |
|---|---|---|
| Memoire Physique (RAM) | Memoire materielle installee | Limitee, rapide |
| Memoire Virtuelle | Abstraction fournie par l'OS | Illusion de memoire illimitee |
Pourquoi la memoire virtuelle?
- Isolation des processus: Chaque processus a son propre espace
- Protection: Un processus ne peut pas acceder a la memoire d'un autre
- Flexibilite: Plus de memoire disponible que la RAM physique
- Simplification: Les programmes n'ont pas a gerer la RAM directement
Espace d'Adressage Virtuel
Architecture 32 bits vs 64 bits
| Architecture | Espace Total | User Space | Kernel Space |
|---|---|---|---|
| 32 bits | 4 Go | 2 Go (ou 3 Go avec /3GB) | 2 Go (ou 1 Go) |
| 64 bits | 256 To theorique | 128 To | 128 To |
Organisation de la memoire d'un processus
Adresses hautes
+------------------+
| Kernel Space | <- Inaccessible en mode utilisateur
+------------------+
| Stack | <- Pile (croit vers le bas)
| | |
| v |
| |
| ^ |
| | |
| Heap | <- Tas (croit vers le haut)
+------------------+
| Data (BSS) | <- Variables non initialisees
+------------------+
| Data (Init) | <- Variables initialisees
+------------------+
| Code | <- Instructions executables
+------------------+
| Reserved | <- Zone protegee (NULL pointer)
+------------------+
Adresses basses (0x0)
Pagination
Concept
La pagination decoupe la memoire en blocs de taille fixe:
- Page: Bloc de memoire virtuelle (4 Ko par defaut sur Windows)
- Frame: Bloc de memoire physique correspondant
- Page Table: Structure qui mappe pages vers frames
Fonctionnement
Adresse Virtuelle Page Table Adresse Physique
[Page Number|Offset] --> [Frame Number] --> [Frame Number|Offset]
Etats d'une page
| Etat | Description |
|---|---|
| Free | Non allouee, disponible |
| Reserved | Reservee mais pas engagee |
| Committed | Allouee et utilisable |
| Shared | Partagee entre processus |
Page File (Fichier d'echange)
Qu'est-ce que le Page File?
Quand la RAM est insuffisante, Windows deplace des pages peu utilisees vers le disque dans le fichier pagefile.sys.
Configuration
# Voir la configuration actuelle
Get-WmiObject Win32_PageFileUsage | Select-Object Name, CurrentUsage, PeakUsage
# Voir la taille configuree
Get-WmiObject Win32_PageFileSetting | Select-Object Name, InitialSize, MaximumSize
Impact sur les performances
| Situation | Performance |
|---|---|
| Page en RAM | Acces: ~100 ns |
| Page sur disque (SSD) | Acces: ~100 us (1000x plus lent) |
| Page sur disque (HDD) | Acces: ~10 ms (100000x plus lent) |
Types de Memoire Windows
Working Set
L'ensemble des pages actuellement en RAM pour un processus.
# Voir le Working Set des processus
Get-Process | Sort-Object WorkingSet64 -Descending |
Select-Object -First 10 Name, @{N='WorkingSet(MB)';E={[math]::Round($_.WorkingSet64/1MB,2)}}
Private Bytes
Memoire allouee exclusivement a un processus (non partageable).
# Voir les Private Bytes
Get-Process | Sort-Object PrivateMemorySize64 -Descending |
Select-Object -First 10 Name, @{N='PrivateBytes(MB)';E={[math]::Round($_.PrivateMemorySize64/1MB,2)}}
Virtual Bytes
Taille totale de l'espace d'adressage virtuel du processus.
Commit Charge
Total de memoire "promise" a tous les processus (peut depasser RAM physique).
# Voir le 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
Concept
Permet de mapper un fichier directement dans l'espace d'adressage d'un processus.
Avantages
- Acces au fichier comme a la memoire
- Partage efficace entre processus
- Gestion automatique par l'OS
Utilisation en PowerShell
# Creer un fichier memory-mapped
Add-Type -AssemblyName System.IO.MemoryMappedFiles
$mmf = [System.IO.MemoryMappedFiles.MemoryMappedFile]::CreateNew(
"MonPartage", # Nom
1024 # Taille en bytes
)
# Ecrire des donnees
$accessor = $mmf.CreateViewAccessor()
$accessor.Write(0, [byte]65) # Ecrire 'A' a la position 0
# Lire des donnees
$value = $accessor.ReadByte(0)
Write-Host "Valeur lue: $([char]$value)"
# Nettoyer
$accessor.Dispose()
$mmf.Dispose()
Heap (Tas)
Concept
Zone de memoire pour l'allocation dynamique pendant l'execution.
Heap Manager Windows
Windows fournit plusieurs types de heap:
- Process Heap: Heap par defaut du processus
- Private Heap: Heap cree par l'application
- Low Fragmentation Heap (LFH): Optimise pour petites allocations
Visualiser les heaps
# Utiliser VMMap ou Process Explorer pour voir les heaps d'un processus
# Ou via debugger
Stack (Pile)
Concept
Zone de memoire pour les variables locales et les appels de fonctions.
Caracteristiques
- Taille fixe par thread (1 Mo par defaut sur Windows)
- Croissance vers les adresses basses
- Acces tres rapide (LIFO)
Stack Overflow
Erreur quand la pile depasse sa taille maximale (recursion infinie, etc.).
Outils d'Analyse Memoire
Task Manager
- Onglet Performance > Memoire
- Onglet Details > Colonnes memoire
Resource Monitor
resmon.exe
Onglet Memoire pour vue detaillee.
Process Explorer (Sysinternals)
procexp.exe
- View > Show Lower Pane
- View > Lower Pane View > DLLs ou Handles
VMMap (Sysinternals)
vmmap.exe
Analyse detaillee de l'espace d'adressage d'un processus.
RAMMap (Sysinternals)
rammap.exe
Vue globale de l'utilisation de la RAM physique.
Protections Memoire Windows
DEP (Data Execution Prevention)
Empeche l'execution de code dans les zones de donnees.
# Verifier le statut DEP
Get-CimInstance Win32_OperatingSystem | Select-Object DataExecutionPrevention_*
ASLR (Address Space Layout Randomization)
Randomise les adresses de chargement pour compliquer les exploits.
CFG (Control Flow Guard)
Valide les cibles des appels de fonctions indirects.
Credential Guard
Isole les credentials dans un environnement virtualise.
# Verifier si Credential Guard est actif
Get-CimInstance -ClassName Win32_DeviceGuard -Namespace root\Microsoft\Windows\DeviceGuard |
Select-Object SecurityServicesRunning
Implications Securite
Attaques liees a la memoire
| Attaque | Description | Protection |
|---|---|---|
| Buffer Overflow | Debordement de tampon | DEP, ASLR, canaries |
| Use-After-Free | Utilisation apres liberation | Safe heap |
| Memory Disclosure | Fuite de donnees memoire | Initialisation |
| Credential Dumping | Vol de credentials en memoire | Credential Guard |
Forensics memoire
La memoire contient des informations precieuses:
- Processus en cours
- Connexions reseau
- Credentials en clair (si pas protege)
- Historique des commandes
- Malwares fileless
Exercices
- Utilisez
Get-Processpour lister les 10 processus consommant le plus de memoire - Ouvrez VMMap et analysez un processus de votre choix
- Verifiez la configuration de votre page file
- Identifiez si DEP et ASLR sont actifs sur votre systeme