[Windows Hook]MinHook库的使用方式
Posted CodeBowl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Windows Hook]MinHook库的使用方式相关的知识,希望对你有一定的参考价值。
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,成功!
参考链接
以上是关于[Windows Hook]MinHook库的使用方式的主要内容,如果未能解决你的问题,请参考以下文章
MinHook测试与分析(x86下 E8,E9,EB,CALL指令测试,且逆推测试微软热补丁)