MinHook库的使用方式
MinHook的GitHub地址: https://github.com/TsudaKageyu/minhook
官方文档说明:MinHook - The Minimalistic x86/x64 API Hooking Library
MinHook就是通过Inline Hook实现的,通过生成库文件,在我们的项目中包含头文件以及对应库文件就可以实现Hook。
学习一个库,先学习怎么用,然后再阅读源码学习原理。
1.Hook
简单引入:
“Hook” 翻译过来的意思是“挂钩” “钩子”,在程序执行的时候,在适当的位置对程序运行流程进行监控、拦截即为Hook技术。
这里可以看我之前的文章:《Windows Hook的简单介绍——此树是我栽,此路是我开》
2.MinHook
极简主义的x86/x64API挂钩库.
MinHook通过Inline Hook实现的,通过生成库文件,在我们的项目中包含头文件以及对应库文件就可以实现Hook。
2.1文件结构
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DqeOSf22-1634385579059)(C:\Users\11073\AppData\Roaming\Typora\typora-user-images\image-20211014224154089.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存失败,源站可能有防盗链机制,建议将图片保存下来直接上传下上传(i2Xz9guPZKbw-1634380852832)(C:\Users\11073\AppData\Roaming\Typora\typora-user-images\image-20211014224154089.png)(C:\Users\11073\AppData\Roaming\Typora\typora-user-images\image-20211014224154089.png)]](https://i-blog.csdnimg.cn/blog_migrate/f0d2574d0f88699277b36b2aa848cc8d.png)
build目录:包含各种版本解决方案,可以选择对应的版本进行生成
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z9mhd1xU-1634380852836)(C:\Users\11073\AppData\Roaming\Typora\typora-user-images\image-20211014230031614.png)]](https://i-blog.csdnimg.cn/blog_migrate/c4b4140c2ad9b812d0bbfb5688c315cc.png)
include目录:需要包含到我们项目的头文件目录
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qwQUWgWv-1634380852839)(C:\Users\11073\AppData\Roaming\Typora\typora-user-images\image-20211014230128642.png)]](https://i-blog.csdnimg.cn/blog_migrate/16a73b6d8644878cebeda17d155ea2ca.png)
每一个对应版本的解决方案目录介绍:
lib目录:生成对应的静态库目录,包含x64与x86
bin目录:生成对应的动态库目录,包含x64与x86
2.2 解决方案结构
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Focbxub4-1634380852841)(C:\Users\11073\AppData\Roaming\Typora\typora-user-images\image-20211014230231639.png)]](https://i-blog.csdnimg.cn/blog_migrate/3de1e679cd20c575f3f58589e6c3d8bc.png)
可以直接生成第一个项目libMinHook,生成库文件,把需要的头文件MinHook.h包含到自己的项目中,需要注意的是根据需要Hook的进程是64位还是32位而选择对应生成库文件版本,否则Hook会不生效
生成第二个项目是直接可以生成静态库对应的dll,可以用于动态Loadlibrary,但是还是建议直接生成静态库直接生成到我们自己的项目中,因为我们自己的项目是需要生成一个注入目标进程的dll。
minhook使用
学习minhook的使用,就直接举个例子吧,据最常见的hook弹窗的例子。
0x00 例子1 Hook Windows弹窗 MessageboxA
实验过程
一个正常的hook流程应该是这样子的。
1.一个正常弹窗的exe,也就是目标进程
2.实现一个hook的dll
3.想办法把dll注入到目标进程中
但是,我们此文,是为了学习MinHook库的使用,所以我们简化步骤,省去注入和加载dll的过程:
1.实现一个目标进程,有弹窗;调用MinHook的lib,实现Hook函数,调用hook函数,实现对MessageBoxA的hook。
实验代码
1.正常调用MessageBoxA代码:
MessageBoxA(NULL, "Orgin MessageBox", "tip", NULL); //注入前调用
2.调用MinHook.lib
#include "../include/MinHook.h"
#if defined _M_X64
#pragma comment(lib, "libMinHook.x64.lib")
#elif defined _M_IX86
#pragma comment(lib, "libMinHook.x86.lib")
#endif
3.实现一个假的messageboxa函数
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;
}
4.MinHook的安装Hook和卸载Hook
MinHook已经把Hook函数封装的比较好了,我们实现hook只需要以下几个函数
4.1MH_Initialize()初始化
4.2 创造hook函数
MH_STATUS WINAPI MH_CreateHook(LPVOID pTarget, LPVOID pDetour, LPVOID *ppOriginal);
4.3 启动Hook函数
MH_STATUS WINAPI MH_EnableHook(LPVOID pTarget);
此时hook函数已经可以生效了,下面的就是卸载Hook函数了
4.4 卸载Hook函数
MH_Uninitialize();
完整代码
// MinHook_user.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
#include "include\MinHook.h"
#if defined _M_X64
#pragma comment(lib, "libMinHook.x64.lib")
#elif defined _M_IX86
#pragma comment(lib, "libMinHook.x86.lib")
#endif
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();
}
}
int main()
{
int key = 0;
std::cout << "input key to starthook" << std::endl;
std::cin >>key ;
//安装Hook函数
SetHook();
//调用正常MessageBoxA函数
MessageBoxA(NULL, "Orgin MessageBox", "tip", NULL);
std::cout << "input key to UnHook" << std::endl;
std::cin >> key;
//卸载Hook函数
UnHook();
getchar();
return 0;
}
实验效果
Ohhhhh,成功!

本文介绍了如何使用MinHook库进行API Hook,详细讲解了MinHook的文件结构和解决方案,通过一个实例展示了如何Hook Windows弹窗函数MessageBoxA,包括初始化、创建hook、启动和卸载Hook的步骤,并分享了实验效果。
793





