1.Detours文件夹中有所需要用到的lib文件和h文件
2.将Detours文件夹拖动到工作目录下
3.附加包含目录,这样在添加头文件时就不需要填写目录而是直接可以填写头文件名,VS可以根据附加包含目录知道头文件在工作目录的哪个文件夹里
4.在工程里面添加一个筛选器Detours
5将工作目录下的detours41x86.lib直接拖动到工程中的筛选器里面。
ps:(当然也可以不拖到库文件到工程中,因为这样有时候可能会感觉很混乱。
在连接器-输出里面的附加依赖项中添加 detours41x86.lib
然后在连接器-常规中的附加库目录中添加库文件所在目录Detours
)
6.添加以下代码
#include"detours.h"
BOOL HookApi(IN PVOID* oldApi/*存储要HOOK的函数地址的变量*/, IN PVOID newApi/*新的函数地址*/)
{
BOOL br = FALSE;
DetourRestoreAfterWith();//恢复原来状态
DetourTransactionBegin();//拦截开始
DetourUpdateThread(GetCurrentThread());//刷新当前线程
//这里可以连续多次调用DetourAttach,表明HOOK多个函数
//DetourAttach(&(PVOID&)OldCreateMutexA,NewCreateMutexA);
DetourAttach(oldApi, newApi);
//br返回NO_ERROR表示成功
br = DetourTransactionCommit();//让拦截生效
return br == NO_ERROR ? TRUE : FALSE;
}
BOOL UnHookApi(IN PVOID* oldApi/*存储要HOOK的函数地址的变量*/, IN PVOID newApi/*新的函数地址*/)
{
BOOL br = FALSE;
DetourTransactionBegin();//HOOK开始
DetourUpdateThread(GetCurrentThread());;//刷新当前线程
//这里可以连续多次调用DetourDetach,表明撤销多个函数HOOK
DetourDetach(oldApi, newApi);//卸载HOOK
br = DetourTransactionCommit();//HOOK生效
return br == NO_ERROR ? TRUE : FALSE;
}
7.示例代码
int API(int a,int b)
{
return a+b;
}
typedef int (*A)(int a,int b);
static A g_HookFunc = API;
int MyFunc(int a,int b)
{
a++;//先执行我们要做的事
//g_HookFunc(a,b);//再执行原有API要做的事,注意不能直接API(),会死循环
//return 10000;这样返回的话1+1最终等于10000
return g_HookFunc(a, b);
}
int main()
{
//printf("g_HookFuncHOOK前:%p\n", g_HookFunc);
HookApi((PVOID*)&g_HookFunc, MyFunc);
//printf("g_HookFuncHOOK后:%p\n", g_HookFunc);
//printf("MyFunc=%p\n", MyFunc);
int nRet = API(1,1);
printf("1+1=%d", nRet);
UnHookApi((PVOID*)&g_HookFunc, MyFunc);
}
//无论用于不用,传给被HOOK函数的参数都在那里
8.执行结果
虽然内联HOOK现在很鸡肋了,就当是简单记录一下静态库的使用吧