什么是Hook

 Hook 技术又叫做钩子函数,在系统没有调用该函数之前,钩子程序就先捕获该消息,钩子函数先得到控制权,这时钩子函数既可以加工处理(改变)该函数的执行行为,还可以强制结束消息的传递。简单来说,就是接管程序正常的运行流程,让程序做一些我们想让他做的事情。

inline-hook

XXX(正在施工)
XXX(正在施工)
XXX(正在施工)

使用Detours进行hook

Detours是微软开发的一个函数库,可用于捕获系统API。
下载地址https://github.com/Microsoft/Detours
编译方法https://blog.csdn.net/z971130192/article/details/100565010

使用Detours hook MessageBox

要调用Detours进行hook,首先要去 项目->属性->链接器->常规->附加库目录 中将编译出来对应版本的lib库目录添加

img

使用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//导入需要用到的头文件
#include "./Detours/include/detours.h"

//定义一个函数指针 普通指向一个A变量是没有执行权的 只有读写权 如果写成函数指针就可以被执行
int
(WINAPI* Real_MessageBox)(
HWND hWnd,
LPCTSTR lpText,
LPCTSTR lpCaption,
UINT uType
) = MessageBox;
// 进行hook操作 return给函数指针
int WINAPI My_MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType)
{
lpText = "hello";
return Real_MessageBox(hWnd, lpText, lpCaption, uType);
}
//这里我设置了一个check box来控制hook开关
void CPage8::OnBnClickedCheck1()
{
if (((CButton*)GetDlgItem(IDC_CHECK1))->GetCheck())
{
//DetourTransactionBegin() 对detours进行初始化
DetourTransactionBegin();
//DetourUpdateThread(GetCurrentThread()) 更新进行detours的线程
DetourUpdateThread(GetCurrentThread());
//进行hook拦截
DetourAttach(&(PVOID&)Real_MessageBox,My_MessageBox);
//调用detourtransactioncommit进行实际的拦截操作
DetourTransactionCommit();
}
else
{
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
////将拦截的函数从原函数的地址上解除
DetourDetach(&(PVOID&)Real_MessageBox, My_MessageBox);
DetourTransactionCommit();
}
}