在官网安装https://github.com/microsoft/detours
下载下来后如下
现在我们需要nmake运行makefile文件
这需要我们下载vs(visual studio Visual Studio: IDE and Code Editor for Software Developers and Teams),不建议使用vscode,我整了好久都没整出来
下载的时候记住你下载的位置,默认·下载的话一般在这里面
C:\Program Files\Microsoft Visual Studio
然后我们需要找到nmake.exe所在的位置
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\bin\Hostx64\x64
(我是x64,所以后面是Hostx64)
然后将这个路径添加到系统环境变量中,这样我们就可以使用namke了
进入我们保存Detours的文件夹下面
现在还不能直接nmake,因为会出现报错:fatal error C1034: windows.h: 不包括路径集(踩坑之一)
这个时候需要先运行vs中的一个bat文件,我的路径如下,直接将这个文件拖入cmd命令窗口中
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat
然后就可以运行nmake,但是我最后还是有报错,不过并不影响后续的操作,因此暂时忽略
运行完成后可以看到Detours里面的src文件夹下面有detours.h与detours.cpp,在lib.x64文件夹下面有detours.lib,我们后续使用Detours就需要这几个文件。
在vs2022中使用Detours
注意,这里使用这几个文件的需要将文件复制到项目下面来,打开你的项目文件,确保下面有这几个文件,因为vs添加文件的话是不会将文件复制过来的(踩坑之一)。
一个使用Detours实现Inline HOOK的实例代码
#include <windows.h>
#include <iostream>
#include "detours.h"
#pragma comment (lib,"detours.lib")
// 声明被Hook的原始函数指针
typedef BOOL(WINAPI* PFnMessageBoxW)(HWND, LPCWSTR, LPCWSTR, UINT);
// 定义一个指向原始MessageBoxW函数的指针
PFnMessageBoxW pfnMessageBoxW = MessageBoxW;
// 自定义的Hook函数,替代MessageBoxW
BOOL WINAPI MyMessageBoxW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType) {
// 在这里可以添加你的Hook逻辑
std::wcout << "成功HOOK" << std::endl;
// 调用原始的MessageBoxW函数
return pfnMessageBoxW(hWnd, L"Hooked!", lpCaption, uType);
}
int main() {
// 初始化Detours库
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)pfnMessageBoxW, MyMessageBoxW); // 进行Hook
DetourTransactionCommit();
// 调用MessageBoxW,此时将调用到MyMessageBoxW
MessageBoxW(nullptr, L"Hello, Detours!", L"Original", MB_OK);
// 卸载Detours
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourDetach(&(PVOID&)pfnMessageBoxW, MyMessageBoxW); // 卸载Hook
DetourTransactionCommit();
return 0;
}