模块 60 - API Hooking - MinHook 库
恶意软件开发课程 - API Hooking - MinHook 库
模块 60 - API Hooking - MinHook 库#
[!IMPORTANT] 本知识库声明
本知识库由本人整理自互联网 MalDev Academy 泄露资源,并由本人手动翻译为中文,过程中增加了大量关键技术提示与实践心得。
- 内容完整性:并未修改任何核心代码与技术逻辑,仅做汉化与注释加强。
- 版权归属:原始知识产权归原作者/官方所有。
- 支持正版:本仓库仅供内部学习交流,如果您有经济能力,请务必支持正版课程。
- 权利申诉:如相关内容侵犯了您的权益,请联系我,我将立即核实并删除。
API Hooking - MinHook 库#
简介#
MinHook ↗ 是一个用 C 语言编写的挂钩库,可用于实现 API Hooking。它兼容 Windows 上的 32 位和 64 位应用程序,并使用 x86/x64 汇编进行内联挂钩,这一点与 Detours 库类似。与其他挂钩库相比,MinHook 更为简单,且 API 更加轻量,非常易于上手。
使用 MinHook 库#
与 Detours 库类似,使用 MinHook 需要将静态库文件(.lib)和 MinHook.h ↗ 头文件包含到 Visual Studio 项目中。
MinHook 核心 API#
MinHook 通过初始化内部结构来存储安装或移除 Hook 所需的信息。其核心流程包括:
- 调用
MH_Initialize初始化库。 - 调用
MH_CreateHook创建钩子。 - 调用
MH_EnableHook启用钩子。 - 不再需要时调用
MH_DisableHook禁用钩子。 - 最后调用
MH_Uninitialize清理资源。
核心函数列表:
- MH_Initialize ↗ - 初始化 HOOK_ENTRY 结构。
- MH_CreateHook ↗ - 创建钩子。
- MH_EnableHook ↗ - 启用已创建的钩子。
- MH_DisableHook ↗ - 移除钩子。
- MH_Uninitialize ↗ - 清理初始化的结构。
这些 API 返回 MH_STATUS 枚举值。执行成功返回 MH_OK (0),失败则返回非零错误码。
💡 初学者提示:初始化规范
MH_Initialize应在程序开始时仅调用一次,而MH_Uninitialize则应在程序退出前调用一次。不需要在每次安装 Hook 时都重新初始化。
Hook 替代函数#
我们继续使用 MessageBoxA 的例子。
// 用于存储原始函数的指针
fnMessageBoxA g_pMessageBoxA = NULL;
INT WINAPI MyMessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType) {
printf("[+] 拦截到原始参数:\n");
printf("\t - 内容 : %s\n", lpText);
printf("\t - 标题 : %s\n", lpCaption);
// 调用原始函数
return g_pMessageBoxA(hWnd, "这是篡改后的内容", "劫持成功", uType);
}c注意:这里 g_pMessageBoxA 初始化为 NULL。与 Detours库不同,MinHook 的 MH_CreateHook 会 自动 帮我们填充这个指针的值,使其指向原始的函数入口,从而防止死循环。
安装 Hook 流程#
BOOL InstallHook() {
if (MH_Initialize() != MH_OK) return FALSE;
// 安装钩子:
// 参数 1: 目标 API 地址
// 参数 2: 我们的劫持函数
// 参数 3: 用于接收原始 API 地址的指针(即 g_pMessageBoxA)
if (MH_CreateHook(&MessageBoxA, &MyMessageBoxA, (LPVOID*)&g_pMessageBoxA) != MH_OK) {
return FALSE;
}
// 启用钩子
if (MH_EnableHook(&MessageBoxA) != MH_OK) {
return FALSE;
}
return TRUE;
}c卸载 Hook 流程#
MinHook 不使用事务系统,操作更加直接。
BOOL Unhook() {
// 禁用指定 API 的钩子
if (MH_DisableHook(&MessageBoxA) != MH_OK) return FALSE;
// 清理库状态
if (MH_Uninitialize() != MH_OK) return FALSE;
return TRUE;
}c演示#
运行逻辑与 Detours 版本一致:
- 正常调用一次。
- 安装并启用 Hook 后调用:内容被修改(Hook 生效)。
- 禁用 Hook 后调用:恢复正常。

🎯 总结#
在本模块中,我们学习了:
- MinHook 的易用性:相比于 Detours,MinHook 的 API 更加直观,且不需要管理事务。
- 自动指针处理:理解了 MinHook 如何自动处理原始函数指针,降低了开发者出错的概率。
- 零检测规避:学习了如何利用轻量化工具在内存中无声无息地监控系统函数。
💡 关键要点
- 为什么选择 MinHook? 它比 Detours 更小,代码更少,非常适合集成到那些对体积敏感的小型恶意软件载荷中。
- 多重挂钩:MinHook 也能非常方便地同时挂钩多个不同的 API。
📚 下一步学习
IAT 隐藏与 API Hooking 的基础章节到此结束。在接下来的进阶课程中,我们将更深入地探讨这些技术的集成以及如何对抗更强大的检测系统!