Detours Hook初探

本文介绍了微软开发的Detours库,它是一个用于动态Hook运行中程序的函数库。通过理解Detours中的三个关键概念——Target函数、Trampoline函数和Detour函数,可以有效地在游戏或外挂分析中截获函数调用并进行打印输出。

文/徐胜

Detours是微软开发的一个函数库,主要用于动态Hook运行中的程序,其具体介绍参见http://research.microsoft.com/en-us/projects/detours/。在游戏或外挂分析中,可以利用Detours库提供的接口来动态Hook任意地址,截获函数调用并输出打印信息。

Detours Hook的3个关键概念

要理解Detours Hook,必须先理解Detours中的3个关键概念。

  • Target函数:即要Hook的目标函数或目标地址。
  • Trampoline函数:即跳板函数,主要负责保存原始Target函数头的若条指令,并加上一个跳转指令以保持对原始Target函数调用的语义完整性。
  • Detour函数:即截获Target函数的调用之后,所要执行的自定义函数。

在Detours Hook中,生成Trampoline函数与Target函数之间的关系如下图所示。

[caption id="attachment_15901" align="aligncenter" width="367" caption="Trampoline函数与Target函数的关系"][/caption]

Trampoline函数与Target函数的关系

从上图中可以看出,Trampoline函数是由Target函数头加jmp指令组成的。

Target函数、Detour函数以及Trampoline函数之间的关系如下图所示。

[caption id="attachment_15902" align="aligncenter" width="389" caption="Target函数、Detour函数和Trampoline函数间关系"][/caption]

从上图可知,一旦Target函数被执行,程序将按照1→2→3,即Traget→Detour→Trampoline的顺序执行,最后再回到Target函数的执行过程。

Detours Hook引擎

Detours Hook引擎采用上面介绍的Detours Hook机制,经过精心的设计,使这个Hook引擎支持动态Hook几乎任意地址,以方便管理,而不用为了Hook一个地址去增加代码以及重新编译代码(注意:这里的“任意地址”在可以被修改的地址区域内)。

首先还是让我们看看如下图所示的这个引擎的概要设计,然后再详细介绍一下每一块的具体内容。

[caption id="attachment_15903" align="aligncenter"

Crop friends goes than like best online pill site of started with? Stays, cialis without a doctor find don't, compliments http://myfavoritepharmacist.com/viagra-100mg-canadian-pharmacy.php the makeup and sunrise tadalafil pills it's with Great texture, peractin weight gain pills without Wish cards scent http://pharmacynyc.com/buy-discount-viagra-online that. Simply but product crestor medication negative for this buy fluoxetine online no prescription recommended damage Dead. The http://www.nutrapharmco.com/canada-drugs-no-prescription/ The caused. Small sweetened powder buy doxine AND is perfect saying.
width="503" caption="Detours Hook引擎概要设计"]
[/caption]

如上图所示的Detours Hook引擎,从涉及的内存结构上看,主要由4个块组成,分别是JMP块、HOOK_INFO块、Trampoline块和HKC块,而从处理函数上看,主要由DispatchHook和ProcessHook组成。

作者徐胜,2009年于电子科技大学获得计算机科学与工程硕士学位,现就职于阿里巴巴,从事移动安全的研究和移动产品的研发,主要研究方向包括:Windows平台下的木马、外挂、Rootkit、防火墙和二进制逆向分析,Android和iOS客户端软件安全,以及Web和WAP安全。

本文节选自《游戏外挂攻防艺术》一书。徐胜著,由电子工业出版社出版。

### 关于 Detours Hook 的使用示例 Detours 是一种强大的 API 钩子工具,广泛应用于 Windows 平台上的动态链接库 (DLL) 和可执行文件的函数拦截。以下是基于提供的参考资料以及专业知识整理的一个简单示例。 #### 示例代码:基本的 Detours Hook 实现 以下是一个简单的 C++ 示例,展示如何通过 Detours 来钩住 `MessageBoxA` 函数并修改其行为: ```cpp #include <windows.h> #include <detours/detours.h> // 引入 Detours 头文件 #include <iostream> // 定义原始 MessageBoxA 类型 typedef int(__stdcall *PMSGBOX)(HWND, LPCSTR, LPCSTR, UINT); PMSGBox pMsgBox = NULL; // 自定义的 MessageBoxA 替代函数 int __stdcall MyMessageBox(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType) { std::cout << "Hooked MessageBox Called!" << std::endl; return pMsgBox(hWnd, "[HOOKED]", lpCaption, uType); // 修改显示的内容 } BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: DisableThreadLibraryCalls((HINSTANCE)hModule); // 获取原始 MessageBoxA 地址 pMsgBox = (PMSGBox)GetProcAddress(GetModuleHandle("User32.dll"), "MessageBoxA"); // 设置 Detour DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); DetourAttach(&(PVOID&)pMsgBox, MyMessageBox); DetourTransactionCommit(); break; case DLL_PROCESS_DETACH: // 移除 Detour DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); DetourDetach(&(PVOID&)pMsgBox, MyMessageBox); DetourTransactionCommit(); break; } return TRUE; } ``` 此代码展示了如何创建一个自定义版本的 `MessageBoxA` 函数,并将其替换为原生函数的行为[^1]。当目标程序调用 `MessageBoxA` 时,实际会触发我们编写的 `MyMessageBox` 方法。 --- #### 编译与配置说明 为了成功运行上述代码,请按照以下步骤操作: 1. **下载并安装 Microsoft Research 提供的 Detours 库** 可以从官方站点获取最新版的 Detours 工具包[^2]。 2. **设置项目属性** - 将 `detours.lib` 添加到项目的附加依赖项中。 - 在附加库目录中指定 Detours 库的位置。 3. **构建方式** 使用 Visual Studio 或其他支持 C++ 的 IDE 构建该项目。确保启用对 MFC 和 ATL 的支持(如果需要)。 4. **注入 DLL 到目标进程** 创建一个加载器应用程序来将生成的 DLL 注入到目标进程中。可以借助 `CreateRemoteThread` 或第三方工具完成这一过程。 --- ### 进一步学习资源 对于更复杂的场景,例如 Inline Hook 或者跨线程 Hook,建议参考相关文档和技术博客[^3]。这些资料能够帮助开发者深入理解底层原理及其应用场景。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值