[Windows Hook]MinHook库的使用方式

Posted CodeBowl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Windows Hook]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文件结构

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

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

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

2.2 解决方案结构

可以直接生成第一个项目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

以上是关于[Windows Hook]MinHook库的使用方式的主要内容,如果未能解决你的问题,请参考以下文章

MinHook测试与分析(x86下 E8,E9,EB,CALL指令测试,且逆推测试微软热补丁)

[原创]MinHook测试与分析(x64下 E9,EB,CALL指令测试,且逆推测试微软热补丁)

无法链接MinHook库

Windows Hook链机制详解

微信PC(windows微信)HOOK

Windows Dll InjectionProcess InjectionAPI Hook