-
-
[分享]Win API HOOK 之 Detours
-
发表于:
2012-11-4 13:45
8576
-
[分享]Win API HOOK 之 Detours
相信不少刚学HOOK的朋友,还在苦恼HOOK代码写起来麻烦,有的朋友甚至不会计算HOOK地址.
Detours 解决了所有的问题了.
Detours 是M$ 出的一个库.
下载地址:
http://research.microsoft.com/en-us/projects/detours/ 最新版本是3.0. 下载后,需自行安装 编译.
配置:
1 将Detours安装目录中的src拷贝至VS安装目录/Microsoft Visual Studio 9.0/VC/bin
2 打开CMD控制台
3 将/Microsoft Visual Studio 9.0/VC/bin/vcvars32.bat拖入控制台运行
4 控制台进入到/Microsoft Visual Studio 9.0/VC/bin目录下,输入运行nmake
Detours功能:
1 拦截x86机器上的任意的win32 API函数。
2 插入任意的数据段到PE文件中,修改DDL文件的导入表。 Detours库可以拦截任意的API调用,拦截代码是在动态运行时加载的。Detours替换目标API最前面的几条指令,使其无条件的跳转到用户提供的拦截函数。被替换的API函数的前几条指令被保存到trampoline 函数(就是内存中一个数据结构)中. trampoline保存了被替换的目标API的前几条指令和一个无条件转移,转移到目标API余下的指令。
当执行到目标API时,直接跳到用户提供的拦截函数中执行,这时拦截函数就可以执行自己的代码了。当然拦截函数可以直接返回,也可以调用trampoline函数,trampoline函数将调用被拦截的目标API,目标API调用结束后又会放回到拦截函数。下图就是Detours API拦截的逻辑流程:
#include "stdafx.h"
#include "detours.h"
#pragma comment(lib, "detours.lib")
#pragma warning(disable : 4098)
static int (WINAPI* MESSAGEBOXA)(HWND hWnd,
LPCTSTR lpText,
LPCTSTR lpCaption,
UINT uType) = MessageBoxA;
int WINAPI DealMsgProc(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType)
{
BOOL bRet;
strcpy((PCHAR)lpText, "Hello Kitty!");
bRet = MESSAGEBOXA(hWnd, lpText, lpCaption, uType);
return bRet;
}
VOID Hook()
{
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)MESSAGEBOXA, DealMsgProc);
DetourTransactionCommit();
}
VOID UnHook ()
{
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourDetach(&(PVOID&)MESSAGEBOXA, DealMsgProc);
DetourTransactionCommit();
}
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
{
Hook ();
}
else if (ul_reason_for_call == DLL_PROCESS_DETACH)
{
UnHook ();
}
return TRUE;
}
模块和头文件.7z
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课