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