Detours内联HOOK

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现在很鸡肋了,就当是简单记录一下静态库的使用吧

猜你喜欢

转载自blog.csdn.net/sanqiuai/article/details/124690573