Gerenciamento de Memória no Windows
Introdução
O gerenciamento de memória é uma das funções mais críticas do sistema operacional. Ele permite que cada processo acredite que possui toda a memória para si, enquanto compartilha a RAM física entre todos os processos.
Conceitos Fundamentais
Memória Física vs Virtual
| Tipo | Descrição | Características |
|---|---|---|
| Memória Física (RAM) | Memória de hardware instalada | Limitada, rápida |
| Memória Virtual | Abstração fornecida pelo SO | Ilusão de memória ilimitada |
Por que memória virtual?
- Isolamento de processos: Cada processo tem seu próprio espaço
- Proteção: Um processo não pode acessar a memória de outro
- Flexibilidade: Mais memória disponível do que a RAM física
- Simplificação: Os programas não precisam gerenciar a RAM diretamente
Espaço de Endereçamento Virtual
Arquitetura 32 bits vs 64 bits
| Arquitetura | Espaço Total | Espaço do Usuário | Espaço do Kernel |
|---|---|---|---|
| 32 bits | 4 GB | 2 GB (ou 3 GB com /3GB) | 2 GB (ou 1 GB) |
| 64 bits | 256 TB teórico | 128 TB | 128 TB |
Organização da memória de um processo
Endereços altos
+------------------+
| Kernel Space | <- Inacessível em modo usuário
+------------------+
| Stack | <- Pilha (cresce para baixo)
| | |
| v |
| |
| ^ |
| | |
| Heap | <- Heap (cresce para cima)
+------------------+
| Data (BSS) | <- Variáveis não inicializadas
+------------------+
| Data (Init) | <- Variáveis inicializadas
+------------------+
| Code | <- Instruções executáveis
+------------------+
| Reserved | <- Zona protegida (ponteiro NULL)
+------------------+
Endereços baixos (0x0)
Paginação
Conceito
A paginação divide a memória em blocos de tamanho fixo:
- Page: Bloco de memória virtual (4 KB por padrão no Windows)
- Frame: Bloco correspondente de memória física
- Page Table: Estrutura que mapeia páginas para frames
Funcionamento
Endereço Virtual Page Table Endereço Físico
[Page Number|Offset] --> [Frame Number] --> [Frame Number|Offset]
Estados de uma página
| Estado | Descrição |
|---|---|
| Free | Não alocada, disponível |
| Reserved | Reservada mas não comprometida |
| Committed | Alocada e utilizável |
| Shared | Compartilhada entre processos |
Page File (Arquivo de troca)
O que é o Page File?
Quando a RAM é insuficiente, o Windows move páginas pouco utilizadas para o disco no arquivo pagefile.sys.
Configuração
# Ver a configuração atual
Get-WmiObject Win32_PageFileUsage | Select-Object Name, CurrentUsage, PeakUsage
# Ver o tamanho configurado
Get-WmiObject Win32_PageFileSetting | Select-Object Name, InitialSize, MaximumSize
Impacto no desempenho
| Situação | Desempenho |
|---|---|
| Página na RAM | Acesso: ~100 ns |
| Página no disco (SSD) | Acesso: ~100 us (1000x mais lento) |
| Página no disco (HDD) | Acesso: ~10 ms (100000x mais lento) |
Tipos de Memória no Windows
Working Set
O conjunto de páginas atualmente na RAM para um processo.
# Ver o Working Set dos processos
Get-Process | Sort-Object WorkingSet64 -Descending |
Select-Object -First 10 Name, @{N='WorkingSet(MB)';E={[math]::Round($_.WorkingSet64/1MB,2)}}
Private Bytes
Memória alocada exclusivamente para um processo (não compartilhável).
# Ver os Private Bytes
Get-Process | Sort-Object PrivateMemorySize64 -Descending |
Select-Object -First 10 Name, @{N='PrivateBytes(MB)';E={[math]::Round($_.PrivateMemorySize64/1MB,2)}}
Virtual Bytes
Tamanho total do espaço de endereçamento virtual do processo.
Commit Charge
Total de memória "prometida" para todos os processos (pode exceder a RAM física).
# Ver o 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
Conceito
Permite mapear um arquivo diretamente no espaço de endereçamento de um processo.
Vantagens
- Acesso ao arquivo como se fosse memória
- Compartilhamento eficiente entre processos
- Gerenciamento automático pelo SO
Uso em PowerShell
# Criar um arquivo memory-mapped
Add-Type -AssemblyName System.IO.MemoryMappedFiles
$mmf = [System.IO.MemoryMappedFiles.MemoryMappedFile]::CreateNew(
"MonPartage", # Nome
1024 # Tamanho em bytes
)
# Escrever dados
$accessor = $mmf.CreateViewAccessor()
$accessor.Write(0, [byte]65) # Escrever 'A' na posição 0
# Ler dados
$value = $accessor.ReadByte(0)
Write-Host "Valor lido: $([char]$value)"
# Limpar
$accessor.Dispose()
$mmf.Dispose()
Heap
Conceito
Área de memória para alocação dinâmica durante a execução.
Heap Manager do Windows
O Windows fornece vários tipos de heap:
- Process Heap: Heap padrão do processo
- Private Heap: Heap criado pela aplicação
- Low Fragmentation Heap (LFH): Otimizado para pequenas alocações
Visualizar os heaps
# Use o VMMap ou Process Explorer para ver os heaps de um processo
# Ou via debugger
Stack (Pilha)
Conceito
Área de memória para variáveis locais e chamadas de função.
Características
- Tamanho fixo por thread (1 MB por padrão no Windows)
- Cresce em direção aos endereços baixos
- Acesso muito rápido (LIFO)
Stack Overflow
Erro quando a pilha excede seu tamanho máximo (recursão infinita, etc.).
Ferramentas de Análise de Memória
Task Manager
- Aba Desempenho > Memória
- Aba Detalhes > Colunas de memória
Resource Monitor
resmon.exe
Aba Memória para visão detalhada.
Process Explorer (Sysinternals)
procexp.exe
- View > Show Lower Pane
- View > Lower Pane View > DLLs ou Handles
VMMap (Sysinternals)
vmmap.exe
Análise detalhada do espaço de endereçamento de um processo.
RAMMap (Sysinternals)
rammap.exe
Visão global do uso da RAM física.
Proteções de Memória no Windows
DEP (Data Execution Prevention)
Impede a execução de código em áreas de dados.
# Verificar o status do DEP
Get-CimInstance Win32_OperatingSystem | Select-Object DataExecutionPrevention_*
ASLR (Address Space Layout Randomization)
Randomiza os endereços de carregamento para dificultar exploits.
CFG (Control Flow Guard)
Valida os alvos de chamadas de funções indiretas.
Credential Guard
Isole as credenciais em um ambiente virtualizado.
# Verificar se o Credential Guard está ativo
Get-CimInstance -ClassName Win32_DeviceGuard -Namespace root\Microsoft\Windows\DeviceGuard |
Select-Object SecurityServicesRunning
Implicações de Segurança
Ataques relacionados à memória
| Ataque | Descrição | Proteção |
|---|---|---|
| Buffer Overflow | Estouro de buffer | DEP, ASLR, canários |
| Use-After-Free | Uso após liberação | Safe heap |
| Memory Disclosure | Vazamento de dados de memória | Inicialização |
| Credential Dumping | Roubo de credenciais na memória | Credential Guard |
Forense de memória
A memória contém informações valiosas:
- Processos em execução
- Conexões de rede
- Credenciais em texto claro (se não protegidas)
- Histórico de comandos
- Malwares fileless
Exercícios
- Use
Get-Processpara listar os 10 processos que mais consomem memória - Abra o VMMap e analise um processo de sua escolha
- Verifique a configuração do seu page file
- Identifique se DEP e ASLR estão ativos no seu sistema