使用Detours进行HOOK

本文介绍了Detours,微软研发的用于Windows应用的动态代码重定向工具,可用于跟踪、调试和性能分析。文章详细讲解了如何配置Detours并展示了如何使用SleepHook功能在Sleep函数调用时弹出窗口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Detours介绍
Detours是微软研究院开发的一款软件工具,用于Windows平台上的应用程序重定向和修改。
它可以在运行时修改应用程序的执行路径,允许开发人员注入自定义代码来改变应用程序的
行为,而不需要修改其源代码。Detours通常用于进行应用程序的跟踪、调试、性能分析以及
行为修改等任务。Detours的工作原理是通过截取目标应用程序的API调用,然后将这些调用
重定向到开发人员自己编写的代码中。这使得开发人员可以在应用程序执行过程中拦截、检
查和修改其行为,从而实现各种目的,比如记录函数调用、插入日志、进行性能分析、实现安
全措施等。Detours提供了一个灵活的API,使得开发人员可以轻松地编写自己的重定向代码,
并且支持对32位和64位的应用程序。它在Windows平台上被广泛应用于软件开发、调试和研
究领域,特别是在需要对二进制程序进行修改和分析的场景下,Detours是一个非常有用的工具。
NuGet安装Detours配置
1.使用新版VS支持NuGet安装
对项目右键单击管理NuGet程序包

在这里插入图片描述

2.	在浏览中输入Detours并搜索下载第一个并安装

在这里插入图片描述
在这里插入图片描述

3.安装完成会项目目录中可以看到Detours

在这里插入图片描述
在这里插入图片描述

4.配置include目录
正常情况下NuGet将自动适配如果出现问题手动进行如下配置。
该目录位于packages\Detours.4.0.1\lib\native\include下打开VS的项目属性打开
C/C++ -> 常规 -> 附件包含目录将include输入进去。

在这里插入图片描述

5.配置lib库文件
	在C/C++ -> 输入 -> 附加依赖项中填写libs目录中对应位数的lib文件。

在这里插入图片描述

源码编译Detours
如果NuGet安装出现问题的情况下也可以使用源码编译Detours下面讲解如何编译lib库。
下载:https://github.com/microsoft/detours
解压后目录结构如下:

请添加图片描述

总共有两个文件夹samples和src,下面分别编译x64和x86的lib库首先打开VS的
x64 Native Tools Command Prompt for VS 2022工具可以如下方式打开

请添加图片描述

运行之后cd到src目录输入nmake进行编译lib库

请添加图片描述

可以看到成功了lib文件会保存到根目录的lib.X64文件夹下面,同道理编译X86用的是
x86 Native Tools Command Prompt for VS 2022跟X64一样的编译。
安装源码编译的Detours
新建一个vs项目准备使用Detours,在使用之前确保已经编译好了在项目右键找到如下:
第一步:配置属性->VC++目录->包含目录

请添加图片描述

选择Detours根目录下的include文件夹

第二步:配置属性->VC++目录->库目录
填写Detours对应根目录的lib库目录,比如我是64位的那就是lib.X64目录跟链接器的区别是一个是目录一个是绝对路径的lib文件。

请添加图片描述

第三步:配置属性->链接器->输入->附加依赖项

请添加图片描述

选择对应版本的lib库添加到附加依赖项里面即可。

请添加图片描述

Detours进行Sleep Hook
下面是进行的Sleep Hook演示代码,在调用Sleep函数的时候进行一个弹窗。
#include <Windows.h>
#include "detours.h"
static VOID(WINAPI* OldSleep)(_In_ DWORD dwMilliseconds) = Sleep;
VOID WINAPI NewSleep(_In_ DWORD dwMilliseconds)
{
    MessageBoxA(0, "hook ok", "hook ok", 0);
    return OldSleep(dwMilliseconds);
}
void Hook(PVOID* oldAddress, PVOID newAddress)
{
    DetourTransactionBegin();
    DetourUpdateThread(GetCurrentThread());
    DetourAttach(oldAddress, newAddress);
    DetourTransactionCommit();
}

void UnHook(PVOID* oldAddress, PVOID newAddress)
{
    DetourTransactionBegin();
    DetourUpdateThread(GetCurrentThread());
    DetourDetach(oldAddress, newAddress);
    DetourTransactionCommit();
}

int main()
{
    Hook(&(PVOID&)OldSleep, NewSleep);
    Sleep(0);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虚构之人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值