Detours, Galen Hunt ve Doug Brubacher tarafından 1999 yılında Microsoft'ta geliştirilen ve "Detours: Binary Interception of Win32 Functions" başlıklı bir makalede tanıtılan bir kütüphanedir. Bu kütüphane, özellikle mevcut işletim sistemleri ve uygulamaları işlevselliğine erişimi olmayan araştırmacılar için yazılmıştır. Detours, bir programın kaynak koduna erişim sağlanamadığında bile, Windows işletim sistemindeki (Win32) fonksiyonları kesintiye uğratma, izleme veya genişletme imkanı sunar.
Detours’un işleyişi şu şekildedir: Diyelim ki erişemediğimiz bir binary dosyada, yani çalıştırılabilir bir programda belirli bir fonksiyon, başka bir fonksiyonu çağırıyor. Ancak biz, bu çağrıyı yakalamak ve belirli işlemler yapmak istiyoruz. Detours, bu çağrıyı başka bir "detour fonksiyonuna" yönlendirir ve burada istediğimiz işlemleri gerçekleştirebiliriz. Bu işlemler tamamlandığında, eğer gerekirse orijinal fonksiyona dönüş yapılabilir.
Trampoline İşlevi:
Bu süreçte kullanılan "trampoline" (trampolin) adı verilen bir mekanizma vardır. Trampolin, orijinal fonksiyona giden bir tür proxy (ara bağlantı) olarak çalışır. Hook kurulumu sırasında, hedef fonksiyonun başındaki birkaç talimat trampolin fonksiyonuna kopyalanır ve yerine detour fonksiyonuna giden bir yönlendirme talimatı (jump) yerleştirilir. Trampolin üzerinden orijinal fonksiyona yapılan çağrı, fonksiyonun herhangi bir müdahale olduğunu fark etmeden çalışmasını sağlar.

EDR ILE DEOURS:
Bu sistem çağrısı, bir dosya veya cihaz için handle açmak amacıyla kullanılır ve EDR çözümleri bunu, kötü niyetli erişim taleplerini izlemek için bağlayabilir.

DEMO :
Sanırım artık ne yapmak istediğimi anlamış oldunuz.
Bu kod, Windows işletim sisteminde çalışan programların MessageBox API işlevini "hook" (yakalama veya yönlendirme) işlemi ile değiştiren bir DLL örneğidir. Microsoft'un Detours kütüphanesini kullanarak, programdaki MessageBox çağrılarının orijinal işlev yerine özel olarak tanımlanmış HookedMessageBox işlevine yönlendirilmesi sağlanır. Bu özel işlev, aslında bir mesaj kutusu göstermeden yalnızca "HookedMessageBox() called. No popup on screen!" mesajını komut satırına yazdırır ve IDOK değeri döndürür.
Kodun İşleyişi:



Detours’un işleyişi şu şekildedir: Diyelim ki erişemediğimiz bir binary dosyada, yani çalıştırılabilir bir programda belirli bir fonksiyon, başka bir fonksiyonu çağırıyor. Ancak biz, bu çağrıyı yakalamak ve belirli işlemler yapmak istiyoruz. Detours, bu çağrıyı başka bir "detour fonksiyonuna" yönlendirir ve burada istediğimiz işlemleri gerçekleştirebiliriz. Bu işlemler tamamlandığında, eğer gerekirse orijinal fonksiyona dönüş yapılabilir.
Trampoline İşlevi:
Bu süreçte kullanılan "trampoline" (trampolin) adı verilen bir mekanizma vardır. Trampolin, orijinal fonksiyona giden bir tür proxy (ara bağlantı) olarak çalışır. Hook kurulumu sırasında, hedef fonksiyonun başındaki birkaç talimat trampolin fonksiyonuna kopyalanır ve yerine detour fonksiyonuna giden bir yönlendirme talimatı (jump) yerleştirilir. Trampolin üzerinden orijinal fonksiyona yapılan çağrı, fonksiyonun herhangi bir müdahale olduğunu fark etmeden çalışmasını sağlar.

EDR ILE DEOURS:
Bu sistem çağrısı, bir dosya veya cihaz için handle açmak amacıyla kullanılır ve EDR çözümleri bunu, kötü niyetli erişim taleplerini izlemek için bağlayabilir.
- Adımlar:
- Detours, ntdll!NtCreateFile() işlevinin başına bir JMP talimatı ekleyerek bu işlevi bir kanca işlevine yönlendirir (örneğin, edr!HookedNtCreateFile()).
- HookedNtCreateFile(), parametreleri kaydederek, dosya veya cihaz erişimi hakkında bilgi toplar.
- Son olarak, HookedNtCreateFile() işlevi gerçek NtCreateFile() çağrısını gerçekleştirmek için orijinal işlevi çalıştırır.

Kod:
KERNEL32!SleepStub:
00007ffa`9d6fada0 e9d353febf jmp 00007ffa`5d6e0178
DEMO :
Kod:
/*
author: alixan
*/
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#pragma comment(lib, "user32.lib")
int main(void){
printf("hookme.exe: Starting.\n");
MessageBox(NULL, "First message", "HOOKS", MB_OK);
MessageBox(NULL, "Second message", "HOOKS", MB_OK);
MessageBox(NULL, "Third message", "HOOKS", MB_OK);
printf("hookme.exe: OK!\n");
return 0;
}
Bu kod, basit bir Windows uygulaması olarak çalışarak kullanıcıya ardışık üç mesaj kutusu gösterir.
Windows API’sinin MessageBox fonksiyonunu kullanarak,
"HOOKS" başlığı altında sırasıyla "First message", "Second message" ve "Third message" içeriği ile
üç mesaj kutusu açar. Her bir mesaj kutusunda, kullanıcı tarafından kapatılabilen bir
"Tamam" (OK) butonu bulunur. Program başlarken ve biterken, komut satırına sırasıyla "hookme.exe: Starting."
ve "hookme.exe: OK!" mesajlarını yazdırır.
Sanırım artık ne yapmak istediğimi anlamış oldunuz.
Kod:
/*
author: alixan
*/
#include <stdio.h>
#include <windows.h>
#include "detours.h"
#pragma comment(lib, "user32.lib")
// pointer to original MessageBox
int (WINAPI * pOrigMessageBox)(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType) = MessageBox;
BOOL Hookem(void);
BOOL UnHookem(void);
// Hooking function
int HookedMessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType) {
printf("HookedMessageBox() called. No popup on screen!\n");
return IDOK;
}
// Set hooks on MessageBox
BOOL Hookem(void) {
LONG err;
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)pOrigMessageBox, HookedMessageBox);
err = DetourTransactionCommit();
printf("MessageBox() hooked! (res = %d)\n", err);
return TRUE;
}
// Revert all changes to original code
BOOL UnHookem(void) {
LONG err;
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourDetach(&(PVOID&)pOrigMessageBox, HookedMessageBox);
err = DetourTransactionCommit();
printf("Hook removed from MessageBox() with result = %d\n", err);
return TRUE;
}
BOOL WINAPI DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID reserved) {
switch (dwReason) {
case DLL_PROCESS_ATTACH:
Hookem();
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
UnHookem();
break;
}
return TRUE;
}
Bu kod, Windows işletim sisteminde çalışan programların MessageBox API işlevini "hook" (yakalama veya yönlendirme) işlemi ile değiştiren bir DLL örneğidir. Microsoft'un Detours kütüphanesini kullanarak, programdaki MessageBox çağrılarının orijinal işlev yerine özel olarak tanımlanmış HookedMessageBox işlevine yönlendirilmesi sağlanır. Bu özel işlev, aslında bir mesaj kutusu göstermeden yalnızca "HookedMessageBox() called. No popup on screen!" mesajını komut satırına yazdırır ve IDOK değeri döndürür.
Kodun İşleyişi:
- Hook İşlemi Başlatma: Hookem fonksiyonu, Detours kütüphanesini kullanarak MessageBox işlevini HookedMessageBox ile değiştirir.
- Hook’u Kaldırma: UnHookem fonksiyonu, Detour işlemini geri alarak MessageBox işlevini orijinal haline döndürür.
- DLL Giriş Noktası: DllMain, DLL yüklendiğinde Hookem fonksiyonunu çağırarak yönlendirmeyi aktif eder. DLL kaldırıldığında ise UnHookem işlevini çalıştırarak değişiklikleri geri alır.






