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>
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

