Demonstração educacional de Function Hooking em kernel Windows.
Esta função está localizada no driver dxgkrnl.sys (DirectX Graphics Kernel) e é responsável por operações relacionadas a superfícies de composição gráfica.
# ANTES (função original):
NtOpenCompositionSurfaceSectionInfo:
xor eax, eax
ret
# DEPOIS (com nosso hook):
NtOpenCompositionSurfaceSectionInfo:
mov rax, 0x1234567890ABCDEF ; Endereço da nossa função
jmp rax ; Pula para nossa funçãoEsta função foi escolhida porque:
- Está no
dxgkrnl.sys(DirectX Graphics Kernel) - Raramente é chamada (menos chance de crash)
- É exportada (podemos encontrá-la facilmente)
- Funciona bem para comunicação usermode ↔ kernel
- Boa para fins educacionais
NtOpen*(maioria das funções NtOpen)- Funções com "Composition" no nome
- Funções com "SecureCookie" (causam BSOD)
- Funções em regiões críticas do sistema
Agora que entendemos como a função está antes do hook, vamos ver exatamente o que vamos colocar no lugar dos bytes originais:
48 B8 [endereço de 64 bits] FF E0
│ │ └─────────┬─────────┘ │ │
│ │ │ │ └─> JMP RAX
└─ └─────────────┴─────────────┴───> MOV RAX, <endereço>
Detalhamento:
48 B8: Opcode para MOV RAX, imm64[8 bytes]: Endereço da nossa funçãoFF E0: Opcode para JMP RAX
Este shellcode de 12 bytes substituirá os primeiros bytes da função original, fazendo com que qualquer chamada para NtOpenCompositionSurfaceSectionInfo seja redirecionada para nossa função personalizada.
Podemos procurar mais funções e encontrei esse site excelente: https://j00ru.vexillium.org/syscalls/win32k/64/
- Driver substitui os primeiros bytes da função por shellcode
- Shellcode redireciona execução para nossa função
hook_handle - User Mode chama a função hookada para operações de memória
- Kernel processa a requisição e retorna resultado
# Abrir kernel_mode.sln no Visual Studio
# Build Solution (Ctrl+Shift+B)
# Projeto configurado apenas para Release x64# 1. Habilitar modo teste
bcdedit /set testsigning on
# 2. Reiniciar o computador
# 3. Usar sc.exe para carregar o driver
sc create kernel_mode type= kernel binPath= C:\caminho\para\kernel_mode.sys
sc start kernel_mode# 1. Baixar kdmapper: https://github.com/TheCruZ/kdmapper
# 2. Abrir DebugView como administrador
# 3. Carregar driver
kdmapper.exe kernel_mode.sys# 1. Abrir notepad
notepad
# 2. Executar demo
user_mode.exekernel_mode/
├── kernel_mode/ # Driver kernel
│ ├── main.cpp # DriverEntry + logs
│ ├── hook.cpp/h # Function hooking
│ ├── memory.cpp/h # Operações de memória
│ └── kernel_mode.inf # Arquivo do driver
├── user_mode/ # Aplicação user mode
│ └── main.cpp # Demo simples
└── kernel_mode.sln # Solução Visual Studio
Encontrando funções no Windows com WinDbg — Parte 1
Nota: Este é meu blog pessoal com anotações de estudo. Se ajudar no seu aprendizado, fique à vontade para usar!
Este post complementa este projeto com:
- Como usar WinDbg para análise de funções
- Detalhes técnicos sobre
NtOpenCompositionSurfaceSectionInfo - Análise assembly antes e depois do hook
- Dicas importantes sobre funções para evitar
- Conceitos de assembly x64 essenciais

