Skip to content

cnthigu/krnl-function-hook

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

kernel-function-hooking

Demonstração educacional de Function Hooking em kernel Windows.

A Função que Hookeamos

NtOpenCompositionSurfaceSectionInfo

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ção

Hook Process

Por que NtOpenCompositionSurfaceSectionInfo?

Esta 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

Outras funções que funcionam:

  • NtOpen* (maioria das funções NtOpen)
  • Funções com "Composition" no nome

Funções para evitar:

  • Funções com "SecureCookie" (causam BSOD)
  • Funções em regiões críticas do sistema

Após Fazer o Hook

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ção
  • FF 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.

Outras Funções Disponíveis

Podemos procurar mais funções e encontrei esse site excelente: https://j00ru.vexillium.org/syscalls/win32k/64/

  1. Driver substitui os primeiros bytes da função por shellcode
  2. Shellcode redireciona execução para nossa função hook_handle
  3. User Mode chama a função hookada para operações de memória
  4. Kernel processa a requisição e retorna resultado

Como Executar

1. Compilar

# Abrir kernel_mode.sln no Visual Studio
# Build Solution (Ctrl+Shift+B)
# Projeto configurado apenas para Release x64

2. Preparar o Ambiente

⚠️ IMPORTANTE: Drivers kernel precisam ser carregados de forma especial. Você tem duas opções:

Opção A: Modo Teste do Windows (Recomendado para Iniciantes)

# 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

Opção B: KDMapper (Para Drivers Não Assinados)

# 1. Baixar kdmapper: https://github.com/TheCruZ/kdmapper
# 2. Abrir DebugView como administrador
# 3. Carregar driver
kdmapper.exe kernel_mode.sys

3. Executar a Demonstração

# 1. Abrir notepad
notepad

# 2. Executar demo
user_mode.exe

Saída Esperada

Hook Process

Estrutura do Projeto

kernel_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

Referências e Recursos Adicionais

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

About

Windows kernel function hooking demonstration shellcode to intercept system calls

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published