採用微軟的 detours1.5 為核心, detours.h和detours.lib自己到網上下。
代碼如下:
MsHookApi.h
/****************************************************************************<br />API HOOK 採用微軟的Detours1.5為核心</p><p>使用方法:<br />參照例子,首先使用DefHookApi或者DefHookDApi構造自己替換的API函數,<br />然後在StartHook函數中添加動態或者靜態HOOK,<br />最後在程式需要的地方或者DLL的入口調用StartHook,在出口調用StopHook。</p><p>其中 InDllToProcess 函數的功能是啟動進程,並注入DLL。<br />****************************************************************************/</p><p>#include <tchar.h><br />#include <stdio.h><br />#include <windows.h></p><p>#include "detours.h"<br />#pragma comment(lib, "detours.lib")</p><p>extern "C" __declspec( dllexport) BOOL InDllToProcess(TCHAR *ExeCmdline, TCHAR *ExeDir, TCHAR *DllPath);</p><p>//靜態替換方法<br />//DetourFunctionWithTrampoline((PBYTE)中間函數名,<br />//(PBYTE)目標函數名);<br />//定義中間函數<br />//DETOUR_TRAMPOLINE(類型 WINAPI 中間函數明(參數...),源函數名);<br />//中間函數過程<br />//類型 WINAPI 中間函數明(參數...){函數過程}<br />//DetourRemove((PBYTE)中間函數名,(PBYTE)目標函數名)<br />#define DefHookApi(SourceFunctionName,FunctionType,FunctionParameter) /<br />DETOUR_TRAMPOLINE(FunctionType WINAPI Real_##SourceFunctionName##FunctionParameter,SourceFunctionName); /<br />FunctionType WINAPI Mine_##SourceFunctionName##FunctionParameter<br />//用法<br />//DefHookAPI(源API函數名,源API函數類型,源API函數參數) //參數格式:(參數1,參數2...)<br />//{<br />//return;<br />//}<br />#define HookApi(SourceFunctionName) /<br />AddHookApi((PBYTE)Real_##SourceFunctionName,(PBYTE)Mine_##SourceFunctionName);<br />//用法<br />//HookAPI(源API函數名);<br />//*************************************************************</p><p>//動態替換方法<br />//中間函數=DetourFunction(源函數地址,目標函數地址);<br />#define DefHookDApi(SourceFunctionName,FunctionType,FunctionParameter) /<br />typedef FunctionType (WINAPI *P##SourceFunctionName)##FunctionParameter; /<br />P##SourceFunctionName Real_##SourceFunctionName = NULL; /<br />BOOL Hook##SourceFunctionName##Tag=FALSE; /<br />FunctionType WINAPI Mine_##SourceFunctionName##FunctionParameter<br />//用法<br />//DefHookDApi(源API函數名,源API函數類型,源API函數參數) //參數格式:(參數1,參數2...)<br />//{<br />//return;<br />//}<br />#define HookDApi(SourceFunctionName,SourceFunctionAddress) /<br />if(!Hook##SourceFunctionName##Tag){ /<br />Hook##SourceFunctionName##Tag=TRUE; /<br />Real_##SourceFunctionName = (P##SourceFunctionName)DetourFunction((PBYTE)SourceFunctionAddress,(PBYTE)Mine_##SourceFunctionName); /<br />AddHookDApi((PBYTE)Real_##SourceFunctionName,(PBYTE)Mine_##SourceFunctionName); }<br />//用法<br />//HookDAPI(源API函數名,源API函數名地址)<br />///////////////////////////////////////////////////////////////</p><p>//定義結構<br />///////////////////////////////////////////////////////////////<br />typedef struct tagHOOKAPIINFO//HOOK結構<br />{<br />UINT Count;//個數<br />PBYTE RealObjectApiName[250];//源API名<br />PBYTE MineObjectApiName[250];//目標API名<br />}HOOKAPIINFO, *PHOOKAPIINFO;</p><p>typedef struct tagHOOKDAPIINFO//HOOK結構<br />{<br />UINT Count;//個數<br />PBYTE RealObjectApiName[250];//源API名<br />PBYTE MineObjectApiName[250];//目標API名<br />}HOOKDAPIINFO, *PHOOKDAPIINFO;<br />///////////////////////////////////////////////////////////////</p><p>VOID TrampolineWith(VOID);//替換API函數<br />VOID UnTrampolineWith(VOID);//恢複API函數</p><p>//添加靜態HOOK資訊<br />VOID AddHookApi(PBYTE ObjectApiName, PBYTE SourceApiName);<br />//添加動態HOOK資訊<br />VOID AddHookDApi(PBYTE RealObjectApiName, PBYTE MineObjectApiName);</p><p>VOID StartHook();<br />VOID StopHook();</p><p>
MsHookApi.cpp
#include "MsHookApi.h"</p><p>HOOKAPIINFOHookApiInfo;<br />HOOKAPIINFOHookDApiInfo;</p><p>//注入DLL到進程<br />BOOL InDllToProcess(TCHAR *ExeCmdline, TCHAR *ExeDir, TCHAR *DllPath)<br />{<br />/*TCHAR szFilePath[MAX_PATH] = {0};<br />TCHAR szDetouredDllPath[MAX_PATH] = {0};<br />if(GetModuleFileName(NULL, szFilePath, MAX_PATH) <= 0)<br />{<br />return FALSE;<br />}<br />(*strrchr(szFilePath, '//')) = '/0';<br />_tcscpy(szDetouredDllPath, szFilePath);<br />_tcscat(szDetouredDllPath, _T("//detoured.dll"));*/</p><p>STARTUPINFO si;<br />PROCESS_INFORMATION pi;<br />ZeroMemory(&si, sizeof(si));<br />ZeroMemory(&pi, sizeof(pi));<br />si.cb = sizeof(si);</p><p>return DetourCreateProcessWithDll(NULL,<br />ExeCmdline,<br />NULL,<br />NULL,<br />TRUE,<br />CREATE_DEFAULT_ERROR_MODE,<br />NULL,<br />ExeDir,<br />&si,<br />&pi,<br />DllPath,<br />NULL);<br />}</p><p>//替換API函數<br />VOID TrampolineWith(VOID)<br />{<br />UINT i;<br />for(i=0; i<HookApiInfo.Count; i++)<br />{<br /> DetourFunctionWithTrampoline(HookApiInfo.RealObjectApiName[i], HookApiInfo.MineObjectApiName[i]);<br />}<br />}<br />//恢複API函數<br />VOID UnTrampolineWith(VOID)<br />{<br />UINT i;<br />for(i=0; i<HookApiInfo.Count; i++)//初始化靜態API函數<br />{<br />DetourRemoveWithTrampoline(HookApiInfo.RealObjectApiName[i], HookApiInfo.MineObjectApiName[i]);<br />}<br />for(i=0; i<HookDApiInfo.Count; i++)//初始化動態API函數<br />{<br />DetourRemoveWithTrampoline(HookDApiInfo.RealObjectApiName[i], HookDApiInfo.MineObjectApiName[i]);<br />}<br />}</p><p>//添加靜態HOOK函數<br />VOID AddHookApi(PBYTE RealObjectApiName,PBYTE MineObjectApiName)<br />{<br />UINT i;<br />BOOL blFound = FALSE;</p><p>//檢查靜態HOOK資訊裡是否已經有這個函數<br />for(i=0; i<HookApiInfo.Count; i++)<br />{<br />if(HookApiInfo.RealObjectApiName[i] == RealObjectApiName)<br />blFound = TRUE;<br />}<br />//如果沒有就添加<br />if(!blFound)<br />{<br />HookApiInfo.Count++;<br />HookApiInfo.RealObjectApiName[i] = RealObjectApiName;<br />HookApiInfo.MineObjectApiName[i] = MineObjectApiName;<br />}<br />}</p><p>//添加動態HOOK函數<br />VOID AddHookDApi(PBYTE RealObjectApiName,PBYTE MineObjectApiName)<br />{<br />UINT i;<br />BOOL blFound = FALSE;</p><p>//檢查動態HOOK資訊裡是否已經有這個函數<br />for(i=0; i<HookDApiInfo.Count; i++)<br />{<br />if(HookDApiInfo.RealObjectApiName[i] == RealObjectApiName)<br />blFound = TRUE;<br />}<br />//如果沒有就添加<br />if(!blFound)<br />{<br />HookDApiInfo.Count++;<br />HookDApiInfo.RealObjectApiName[i] = RealObjectApiName;<br />HookDApiInfo.MineObjectApiName[i] = MineObjectApiName;<br />}<br />}</p><p>//------------------------------------------------------------------------------------<br />//********************** 例子 *********************************//</p><p>//MessageBoxA, 靜態攔截<br />DefHookApi(MessageBoxA, int,<br /> (HWND hWnd,<br /> LPCTSTR lpText,<br /> LPCTSTR lpCaption,<br /> UINT uType))<br />{<br />int iRet = Real_MessageBoxA(hWnd, lpText, "A", uType);<br />return iRet;<br />}</p><p>//MessageBoxW, 動態攔截<br />DefHookDApi(MessageBoxW, int,<br /> (HWND hWnd,<br /> LPCWSTR lpText,<br /> LPCWSTR lpCaption,<br /> UINT uType))<br />{<br />int iRet = Real_MessageBoxW(hWnd, lpText, L"W", uType);<br />return iRet;<br />}</p><p>VOID StartHook()<br />{<br />HookApi(MessageBoxA);//靜態HOOK</p><p>HMODULE hUser = LoadLibrary(_T("User32.dll"));//動態HOOK<br />if(hUser)<br />{<br />FARPROC fnProc = GetProcAddress(hUser, _T("MessageBoxW"));<br />if(fnProc)<br />{<br />HookDApi(MessageBoxW, fnProc);<br />}<br />FreeLibrary(hUser);<br />}</p><p>TrampolineWith();<br />}</p><p>VOID StopHook()<br />{<br />UnTrampolineWith();<br />}<br />