Detours -- Hook API (MessageBoxW)

Detours是微软开发的一个函数库,可用于捕获系统API。

准备工作

在用其进行程序开发之前,得做一些准备工作。
一.下载Detours
  在微软官网上可免费下载Detours [1]  
二.安装Detours
  一路NEXT
  三.生成Detours库
  在安装后的文件夹下找不到直接可以拿来用的LIB文件,但是却有SRC文件(在**\Microsoft Research\Detours Express 2.1\src下)。该文件夹下还有Makefile,可以直接用来生成库。
  将Detours路径下的SCR文件夹拷贝到**\Microsoft Visual Studio 9.0\VC路径下,注意是整个文件夹(其它版本VC自己照着复制)
  在system32目录找到cmd右键以管理员身份运行,切换至 c:\Program Files\Microsoft Visual Studio 9.0\VC\bin目录运行vcvars32.bat
  切换到\Microsoft Visual Studio9.0\VC\SRC,然后输入..\bin\nmake指令,编译成功后在\Microsoft Visual Studio9.0\VC\Lib文件下就能找到detoured.lib与detours.lib文件了。

简单例子

//通过detours库HOOK API
#include ".\\Detours\\detours.h"
#pragma comment(lib, ".\\Detours\\detours.lib")
#pragma comment(lib, ".\\Detours\\detoured.lib")


//保存原API函数地址
static int (WINAPI* OLD_MessageBoxW)(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType) = MessageBoxW;

//自定义MessageBox
int WINAPI NEW_MessageBoxW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType)
{
	//在这里可以做自己想做的事情,做完后可以继续调用原API函数,也可以阻止掉.
	//...

	//继续调用原来的API函数
	int ret = OLD_MessageBoxW(hWnd, L"输入参数已修改", L"[测试]", uType);

	return ret;
}


VOID HookMessageBox()
{
	DetourRestoreAfterWith();
	DetourTransactionBegin();
	DetourUpdateThread(GetCurrentThread());		//更新所有线程,确保所有拦截点都能正确更新

	//这里可以连续多次调用DetourAttach,表明HOOK多个函数
	DetourAttach(&(PVOID&)OLD_MessageBoxW, NEW_MessageBoxW);

	DetourTransactionCommit();
}


VOID UnHookMessageBox()
{
	DetourTransactionBegin();
	DetourUpdateThread(GetCurrentThread());

	//这里可以连续多次调用DetourDetach,表明撤销多个函数HOOK
	DetourDetach(&(PVOID&)OLD_MessageBoxW, NEW_MessageBoxW);

	DetourTransactionCommit();
}


你可能感兴趣的:(Detours -- Hook API (MessageBoxW))