Intercepção de Funções com a Biblioteca Detours

Para interceptar uma função de destino, dois componentes são essenciais: um ponteiro contendo o endereço da função original e uma função de desvio. Ambas devem compartilhar a mesma assinatura de chamada, incluindo número de parâmetros e convenção de chamada. Isso garante o alinhamento coreto da stack e preservação de registradores entre os contextos.

Desenvolvedores devem incluir o cabeçalho detours.h e vincular com detours.lib:

// dllmain.cpp
#include "pch.h"
#pragma comment(lib, "detours.lib")

static VOID(WINAPI* RealDelay)(DWORD duration) = Sleep;

VOID WINAPI HookedDelay(DWORD duration)
{
    ULONGLONG start = GetTickCount64();
    RealDelay(duration);
    ULONGLONG end = GetTickCount64();

    WCHAR log[256];
    swprintf_s(log, L"Delay executado: %llu ms", end - start);
    MessageBoxW(NULL, log, L"Info", MB_OK);
}

BOOL APIENTRY DllMain(HMODULE hMod,
                      DWORD reason,
                      LPVOID reserved)
{
    if (DetourIsHelperProcess()) return TRUE;

    switch (reason) {
    case DLL_PROCESS_ATTACH:
        DetourRestoreAfterWith();
        
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        DetourAttach(&(PVOID&)RealDelay, HookedDelay);
        DetourTransactionCommit();
        break;
    case DLL_PROCESS_DETACH:
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        DetourDetach(&(PVOID&)RealDelay, HookedDelay);
        DetourTransactionCommit();
        break;
    }
    return TRUE;
}

A rotina DetourAttach realiza a intercepção dentro de uma transação demarcada por DetourTransactionBegin/DetourTransactionCommit. O segundo parâmetro referencia o ponteiro original, não a função em si, pois seu endereço já está armazenado nele.

DetourUpdateThread atualiza o contexto de execução durante transações. Quando confirmada, a transação gera uma função trampolim que redireciona chamadas para a função substituta, preservando a capacidade de invocar a implementação original.

Para remover a intercepção, DetourDetach reverte as modificações na função alvo e desaloca o trampolim. Para deploy, a intercepção deve estar encapsulada em DLLs, utilizando técnicas como injeção por thread remota ou as APIs especializadas:

  • DetourCreateProcessWithDllEx
  • DetourCreateProcessWithDlls

DetourRestoreAfterWith deve ser invocado no ponto de entrada da DLL. Em ambientes mistos x86/x64, a exportação ordinal 1 deve referir-se a DetourIsHelperProcess para coordenação interna.

Instalação via vcpkg:

vcpkg install detours:x86-windows
vcpkg install detours:x64-windows

Tags: Detours hooking Windows-API dll-injection function-interception

Publicado em 9-6 00:21