Pular para o conteúdo principal

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​

TipoDescriçãoCaracterísticas
Memória Física (RAM)Memória de hardware instaladaLimitada, rápida
Memória VirtualAbstração fornecida pelo SOIlusão de memória ilimitada

Por que memória virtual?​

  1. Isolamento de processos: Cada processo tem seu próprio espaço
  2. Proteção: Um processo não pode acessar a memória de outro
  3. Flexibilidade: Mais memória disponível do que a RAM física
  4. Simplificação: Os programas não precisam gerenciar a RAM diretamente

Espaço de Endereçamento Virtual​

Arquitetura 32 bits vs 64 bits​

ArquiteturaEspaço TotalEspaço do UsuárioEspaço do Kernel
32 bits4 GB2 GB (ou 3 GB com /3GB)2 GB (ou 1 GB)
64 bits256 TB teórico128 TB128 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​

EstadoDescrição
FreeNão alocada, disponível
ReservedReservada mas não comprometida
CommittedAlocada e utilizável
SharedCompartilhada 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çãoDesempenho
Página na RAMAcesso: ~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​

AtaqueDescriçãoProteção
Buffer OverflowEstouro de bufferDEP, ASLR, canários
Use-After-FreeUso após liberaçãoSafe heap
Memory DisclosureVazamento de dados de memóriaInicialização
Credential DumpingRoubo de credenciais na memóriaCredential 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​

  1. Use Get-Process para listar os 10 processos que mais consomem memória
  2. Abra o VMMap e analise um processo de sua escolha
  3. Verifique a configuração do seu page file
  4. Identifique se DEP e ASLR estão ativos no seu sistema

Referências​