Detours 簡介與簡單使用

什麼是Detours

Detours是微軟開發的一個函數庫,可用於捕獲系統API。--百度百科

利用detours能夠hook到WIN32的API,原理好像是修改調用API的指令使跳轉到用戶的函數。(未驗證)node

Detours的安裝

以vs2015爲例
下載地址:https://www.microsoft.com/ 我下載的版本是Detours Expressv3.0 Build 343 下載以後是免安裝文件,解壓就能玩。
把全部的的文件拷貝到 ++VS2015/VC++ 目錄下面,運行++vs2015兼容命令行工具++,進入目錄++vs2015/vc/src++,執行命令nmake 就能夠用了。生成的lib文件在++lib.X64++和++lib.X86++文件夾中,在項目中包含就能夠了。c++

Detours的使用

首先須要製做dll,例如製做hook WriteConsoleW的dll咱們須要以下幾步:
  • 首先寫用戶的函數
BOOL(WINAPI * OLD_WriteConsoleW)(HANDLE  hConsoleOutput, const VOID *lpBuffer, DWORD   nNumberOfCharsToWrite, LPDWORD lpNumberOfCharsWritten, LPVOID  lpReserved) = WriteConsoleW;

BOOL WINAPI NEW_WriteConsoleW(HANDLE  hConsoleOutput, const VOID *lpBuffer, DWORD   nNumberOfCharsToWrite, LPDWORD lpNumberOfCharsWritten, LPVOID  lpReserved) {
	HANDLE wPip = GetStdHandle(STD_OUTPUT_HANDLE);
	WriteFile(wPip, lpBuffer, nNumberOfCharsToWrite*2, lpNumberOfCharsWritten, NULL);
	return TRUE;
}
  • 而後是調用detours的api寫綁定和解綁函數
void Hook() {
	DetourRestoreAfterWith();
	DetourTransactionBegin();
	DetourUpdateThread(GetCurrentThread());
	DetourAttach((PVOID *)&OLD_WriteConsoleW, NEW_WriteConsoleW);
	DetourTransactionCommit();
}

void UnHook() {
	DetourTransactionBegin();
	DetourUpdateThread(GetCurrentThread());
	DetourDetach((PVOID *)&OLD_WriteConsoleW, NEW_WriteConsoleW);
	DetourTransactionCommit();
}
  • 最後在DllMain中調用Hook()和UnHook()
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		Hook();
		break;
	case DLL_THREAD_ATTACH:
		break;
	case DLL_THREAD_DETACH:
		break;
	case DLL_PROCESS_DETACH:
		UnHook();
		break;
	}
	return TRUE;
}

若是找不到DllMain請打開工程中的++dllmain.cpp++。
必定要有一個導出函數否則以後會報錯0xc000007bapi

而後要將dll加載到exe中

這兒能夠本身寫dll注射器,也能夠調用detours的CreateProcessWithDll,我採用的方法是後者函數

DetourCreateProcessWithDllA(NULL, "C:\\Users\\hasee\\Desktop\\tellnet\\telnet.exe", NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS|CREATE_NEW_CONSOLE, NULL, NULL, &si, pi, "D:\\Visual_studio_test\\VirusExcercise\\Fortelnet\\detoursTest3\\Debug\\detoursTest3.dll", NULL);

前面的參數和Winodes api CreateProcess同樣,倒數第二個是dll地址,最後一個寫NULL就行。工具

至此每當被調用程序的WriteCosoleW要被執行的時候就會先執行咱們的NEW_WriteCosoleW函數。ui

相關文章
相關標籤/搜索