概述: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弹窗,该库的原理与我们上面手动实现的方式是相同的.

/* 
代码来自 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 原理分析

参考文章: