概述:MinHook——一个mini的Hook库。如何使用及原理解析

MinHook 说明

MinHook 是一个用C语言实现的 mini 的 Hook 项目,可同时适用于 x86/x64环境下,支持静态编译到项目中,目前 :star: Github Start 4K。

Github地址:TsudaKageyu/minhook: The Minimalistic x86/x64 API Hooking Library for Windows

使用

如何使用 MinHook ?

使用非常简单,初始化、创建Hook、启用Hook。大致代码如下所示:

Hook 实现修改弹窗: 实现Hook MsgBox弹窗,该库的原理与我们上面手动实现的方式是相同的.

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
41
42
43
44
45
46
47
48
49
/* 
代码来自 C/C++ MinHook 库的使用技巧 - lyshark - 博客园
https://www.cnblogs.com/LyShark/p/13653435.html
*/
#include <Windows.h>
#include <MinHook.h>

#pragma comment(lib,"libMinHook.x86.lib")

typedef int (WINAPI *OldMessageBox)(HWND, LPCSTR, LPCSTR, UINT);

OldMessageBox fpMessageBoxA = NULL;

int WINAPI MyMessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)
{
int ret = fpMessageBoxA(hWnd, "Hook Inject", lpCaption, uType);
return ret;
}

void SetHook()
{
if (MH_Initialize() == MB_OK)
{
MH_CreateHook(&MessageBoxA, &MyMessageBoxA, reinterpret_cast<void**>(&fpMessageBoxA));
MH_EnableHook(&MessageBoxA);
}
}

void UnHook()
{
if (MH_DisableHook(&MessageBoxA) == MB_OK)
{
MH_Uninitialize();
}
}

BOOL APIENTRY DllMain(HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
SetHook();
break;
case DLL_PROCESS_DETACH:
UnHook();
break;
}
return TRUE;
}

这里还有其他一些例子,参考文章:C/C++ MinHook 库的使用技巧 - lyshark - 博客园

MinHook 原理分析

参考文章: