[Windows Hook]MinHook库的使用方式

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


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)]

build目录:包含各种版本解决方案,可以选择对应的版本进行生成

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z9mhd1xU-1634380852836)(C:\Users\11073\AppData\Roaming\Typora\typora-user-images\image-20211014230031614.png)]

include目录:需要包含到我们项目的头文件目录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qwQUWgWv-1634380852839)(C:\Users\11073\AppData\Roaming\Typora\typora-user-images\image-20211014230128642.png)]

每一个对应版本的解决方案目录介绍:
lib目录:生成对应的静态库目录,包含x64与x86
bin目录:生成对应的动态库目录,包含x64与x86

2.2 解决方案结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Focbxub4-1634380852841)(C:\Users\11073\AppData\Roaming\Typora\typora-user-images\image-20211014230231639.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测试分析02 (x64)

MinHook 分析01 (x86的jmp+offset类型hook)

使用MinHook进行APIHook

32/64 MinHook 库的使用方式

MinHook库的使用 64位下,过滤LoadLibraryExW

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值