[Windows Hook]MinHook库的使用方式

[C++调试技巧] MinHook 介绍|文档|例子 MinHook是一个基于微软Detours的一个可移植Hook库,它使用了内存污染和跳转技术来实现Hook.通过使用MinHook,你可以在不需要修改原来函数代码的情况下,运行时更改函数定义.这对于调试,测试,以及在其他程序中注入自己的代码都非常有用.使用MinHook来挂钩函数,即使这些函数是由编译器优化过的,MinHook也可以在不修改原来代码的情况下Hook.这使得MinHook特别适合用于对受保护函数进行Hook但是它也有一些限制。 阅读详情
AI摘要

本文介绍了如何使用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

告别硬编码:用MinHook库轻松实现Windows API Hook(附完整DLL注入流程) 本文详细介绍了如何使用MinHook库实现Windows API Hook,并提供了完整的DLL注入流程。MinHook以其轻量级和易用性成为API拦截的首选工具,支持跨平台和线程安全,适用于监控应用程序行为或修改系统功能。通过实战示例,帮助开发者快速掌握这一关键技术。 阅读详情

相关推荐

基于minhook的Windows HOOK

MinHook是一个基于微软Detours技术的可移植Hook库,它允许开发者在运行时更改函数定义,而无需修改原始函数代码。

小龙在线 1032

MinHook 介绍

MinHook是一个基于微软Detours的一个可移植Hook库,它使用了内存污染和跳转技术来实现Hook。通过使用MinHook,你可以在不需要修改原来函数代码的情况下,运行时更改函数定义。这对于调试、测试、以及在其他程序中注入自己的代码都非常有用。使用MinHook来挂钩函数,即使这些函数是由编译器优化过的,MinHook也可以在不修改原来代码的情况下Hook。这使得MinHook特别适合用于但是它也有一些限制当然,MinHook毕竟是,你只需要稍微处理一下,便可以保证兼容与稳定性。

顺其自然~专栏 2227

别再为授权费头疼了!手把手教你免授权搞定西门子、马扎克等12种主流数控机床的数据采集

本文提供了一套免授权采集西门子、马扎克等12种主流数控机床数据的实战指南,帮助中小型机加工车间节省80%以上的采集成本。通过TCP/UDP协议逆向工程和跨平台数据整合,实现经济、灵活且可持续的数据采集方案,涵盖设备兼容性处理、数据频率优化等关键问题。

weixin_26873711的博客 709

minhook探究

在接口的设计,hook的兼容性等方面,还是值得我们初学者解决的。熟悉inline hook的,在阅读了minhook的代码之后就会发现,它也是用的这种hook方法。紧接着是一个jmp指令,但是跳转的地址看起来有点不对,实际上是反汇编引擎解析有误,从源码中可以知道这里实际上是跳转到一个绝对地址(0xff,0x25,0x000000,0x7fff05fa4175),也就是CreateFileA第二条指令开始的地方(0x7fff05fa4175)。总的来说还是好用的。

pureman_mega的博客 1143

Python介绍与安装

Python介绍与安装

acegi13579的专栏 3224

打包可以在Hadoop 3.3.1和Hive 3.1.2上使用的Tez 0.10.1 minimal

编译打包可以在Hadoop 3.3.1和Hive 3.1.2上使用的Tez 0.10.1

qq_42013533的博客 2618

4.5 MinHook 挂钩技术

MinHook是一个轻量级的Hooking库,可以在运行时劫持函数调用。它支持钩子API函数和普通函数,并且可以运行在32位和64位Windows操作系统上。其特点包括易于使用、高性能和低内存占用。MinHook使用纯汇编语言实现,在安装和卸载钩子时只需要短暂地锁定目标线程,因此对目标线程的影响非常小。读者可自行下载对应的库文件,本节所使用的是版本,并配置好对应的包含文件以及库目录,如下图所示;

507

精通DC-DC变换器:Boost升压电路全解析

Boost升压变换器是一种将低直流电压转换为高直流电压的常用电路。其核心工作原理是通过电感储能:开关导通时电感充电,关断时电感与电源串联向负载供电。关键公式表明输出电压Vo=Vi/(1-D),占空比D越大,升压比越高。变换器工作时会产生电感电流纹波和输出电压纹波,需合理选择电感和电容参数。开关管和二极管需承受完整的输出电压,对元器件选型要求较高。理解这些原理是设计高效升压电源的基础。

2511_92918351的博客 3711

64位hook函数

/可以在hde32_disasm或hde64_disasm来断点查询长度。// 注意:更多功能请使用DetourHook,minhook。//备份源地址的地址数据,不是每个函数地址长度都是7或5,//为x64下创建一个在2GB范围内的上下标地址。

2301_80744428的博客 632

setoolkit克隆网站获取用户信息

一、环境 kali、DVWA 二、步骤 首先打开kali,输入setoolkit 依次选择选项1-选项2-选项3-选项2 输入钓鱼网站的网址(默认为本地网址) 输入要克隆的网址URL 这里我的网址如图,将网址复制 然后模拟攻击场景,攻击者向受害者发送了一条钓鱼链接,此链接与DVWA的登陆页面完全一样,受害者点击之后并进行登陆信息 点击login之后,用户信息就被setool...

BeatRex的博客 2998

SAP LSMW数据批导操作手册及跨客户端传输方法(涉及默认值配置,及多余字段如何删除)

SAP LSMW数据批导操作手册及跨客户端传输方法

我好像病了的博客 6089

OpenSpeedy游戏变速工具实战指南:从原理到配置的完整解析

OpenSpeedy是一款开源免费的游戏变速工具,专为Windows平台设计,能够突破游戏帧率限制,提供流畅丝滑的游戏加速体验。作为一款基于Ring3层Hook技术的轻量级工具,它通过拦截系统时间函数来调整游戏运行速度,无需修改游戏文件或侵入系统内核,确保安全性和稳定性。对于追求极致游戏体验的玩家和希望优化老旧游戏性能的技术爱好者而言,OpenSpeedy提供了简单易用且功能强大的解决方案。 [

gitblog_00063的博客 176

「深度学习之优化算法」笔记(二)优化算法的分类

但是由于生物的局限性,人们所创造出的算法也会有局限性:我们所熟知的生物都生存在三维空间,在这些环境中,影响生物生存的条件比较有限,反应到算法中就是这些算法在解决较低维度的问题时效果很好,当遇到超高维(维度>500)问题时,结果可能不容乐观,没做过实验,我也不敢乱说。当然,他们的目的不是在最佳狩猎位置集合,他们的目的是在过去的途中看是否能发现更加好的狩猎位置,去往已经到过的狩猎地点再次狩猎是没有意义的,因为每个位置获取食物的难易程度是固定的。如果他们的策略是“不跟随最优解”,那么他们的策略是什么呢?

quanzhan_King的博客 1371

运用 Windows 的 Hook 淦极域 && MinHook 入门教程

因为 NTD 的某 UDP 重放攻击被机房的同学们大肆滥用(诸如乱关机),加上我们的 Tad 的一些坑人行为,于是就阅读并参考 JiyuTrainer 的源码,然后在 NoTopDomain 加上了拦截远程命令、杀进程和置顶功能。C/C++ 的语言基础能够简单使用 Windows API如果您缺少一部分,建议先学习之后再过来。对于Windows系统,它是建立在事件驱动机制上的,说白了就是整个系统都是通过消息传递实现的。

ZhangMuZhi_Anhao的博客 2051

【软件系统架构】系列六: SysML(系统建模语言)

SysML(系统建模语言)是OMG组织基于UML扩展的专用建模语言,用于支持复杂系统全生命周期建模。它包含9类标准图,核心建模元素包括块(Block)、端口接口、需求和约束等。与UML相比,SysML更适用于软硬件结合的复杂系统建模。作为MBSE的核心工具,SysML通过结构图、行为图、需求图和参数图实现系统设计、需求追踪和性能验证。虽然面临学习门槛高、工具成本高等挑战,但随着AI融合和国产化替代趋势,SysML在航空航天、汽车电子等领域的应用日益广泛。SysML v2将简化语法并提升互操作性,推动系统工程

moton2017的博客 2387

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

MinHook Windows API Hook 库:从入门到精通的5个实战技巧

MinHook是一个专为Windows平台设计的轻量级x86/x64 API Hook库,它为开发者提供了简单易用的函数拦截能力。无论你是想要监控系统调用、修改程序行为,还是进行安全分析,MinHook都能成为你的得力助手。 ## 🔍 MinHook 能为你做什么? MinHook 的核心功能是拦截和重定向函数调用。想象一下,当程序调用某个Windows API时,你可以在中间插入自己的代码

gitblog_01101的博客 711

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

MinHook API Hook库完整使用指南

MinHook是一个专为Windows平台设计的轻量级x86/x64 API钩子库,它提供了简洁高效的函数拦截能力。该项目采用纯C语言编写,具有极小的内存占用和出色的性能表现。 ## 项目核心功能详解 MinHook库的核心价值在于为开发者提供了一套完整的API拦截解决方案。其主要功能包括: **智能钩子管理** - 自动处理多线程环境下的钩子操作 - 支持批量启用和禁用钩子功能 - 提供完

gitblog_00230的博客 729

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

MinHook 源码全解析:Windows x86/x64 API Hook 库的架构、API 与实战应用

MinHook(The Minimalistic API Hooking Library for Windows)是一款以"极简"为设计目标的开源 Windows x86/x64 API 挂钩(API Hooking)库,自 2009 年发布至今,其 API 设计与底层实现已成为同类库的经典范式。本文以本仓库 `Master/ThirdParty/x360ce/trunk/MinHook/` 下随

gitblog_00841的博客 1073

MinHook终极指南:Windows API钩子库的完整使用教程

MinHook是一个专为Windows系统设计的轻量级x86/x64 API钩子库,它为开发者提供了一种简单而高效的方式来拦截和修改系统或应用程序的函数调用。无论你是想要进行调试分析、性能监控,还是实现功能扩展,这个开源库都能帮助你轻松完成任务。本文将为你详细介绍MinHook的功能特点、应用场景和完整使用教程。 ## 🔍 什么是API钩子技术? API钩子技术是一种强大的系统编程技术,它允

gitblog_01101的博客 1162

MinHook终极指南:Windows平台API Hook技术深度解析

MinHook作为Windows平台上最轻量级的x86/x64 API Hooking库,为开发者提供了强大而简洁的函数拦截解决方案。本文将带您深入了解MinHook的核心机制、实战应用场景以及高效配置方法。 ## 项目核心价值与技术定位 MinHook的独特之处在于其极简主义设计理念。与其他Hook库相比,MinHook在保证功能完整性的同时,显著减少了内存占用和代码复杂度。该库专为Wind

gitblog_00730的博客 669

终极MinHook与vcpkg集成指南:10步实现Windows API Hook现代化依赖管理方案 [特殊字符]

MinHook是一个极简的x86/x64 API Hook库,专门为Windows平台设计,提供了轻量级、高性能的函数钩子解决方案。对于开发者来说,MinHook的核心功能是实现Windows API的钩子技术,而通过vcpkg集成可以大大简化依赖管理流程,让开发工作更加高效。 ## 为什么选择MinHook+vcpkg集成方案?🤔 传统的Windows API Hook开发往往面临复杂的依

gitblog_00656的博客 935

【亲测免费】 MinHook 项目教程

MinHook 是一个用于 Windows 平台的 x86/x64 API Hooking 库。以下是项目的目录结构及其介绍: ``` minhook/ ├── build/ │ ├── cmake/ │ └── dll_resources/ ├── include/ │ └── MinHook.h ├── src/ │ ├── buffer.c │ ├── buffer.h...

gitblog_01198的博客 1114

Windows API钩子终极指南:MinHook完整使用教程

MinHook是一个专为Windows平台设计的轻量级x86/x64 API钩子库,为开发者提供了简单快速的函数拦截解决方案。无论您想要监控API调用、修改函数行为还是实现调试功能,这个免费的完整工具库都能满足您的需求。 ## 如何快速创建第一个函数钩子 想要开始使用MinHook进行Windows函数拦截实战,首先需要获取项目源码。您可以通过以下命令克隆仓库: ```bash git cl

gitblog_00500的博客 885

深入解读 MinHook:极简 x86/x64 API Hook 库及其在《黑神话:悟空》内置小地图插件中的实战应用

MinHook(The Minimalistic x86/x64 API Hooking Library)是一款以"极简"为设计目标的 Windows API Hook 库,由 Tsuda Kageyu 开发并采用 BSD 2-Clause 协议开源。本文以仓库中随附的 [MinHook README](https://link.gitcode.com/i/7e316531ae7701d7db8e

gitblog_00936的博客 163
上一篇: VS2022 Preview 尝鲜版 下载教程
下一篇: 热补丁:为什么Windows API都以无意义的 mov edi,edi 开头?
CodeBowl
博客等级 码龄5年 7664粉丝 67原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值