API挂钩-Minhook库

admin 2024年1月1日15:57:36评论24 views字数 2356阅读7分51秒阅读模式
简介

Minhook库其实跟上一篇的那个库是差不多的,只不过它是使用C语言进行编写的hook库,我们可以使用它来进行Hook Windows API函数,MinHook库相比Detours库来说是比较简单的,它是一个轻量级的API。

下载地址如下:

https://github.com/TsudaKageyu/minhook

它跟Detours库是类似的,Minhook库也需要.lib文件和MinHook.h文件,将这两个文件拉入到项目中即可。

如下代码:

#include <iostream>#include "MinHook.h"#pragma commint(lib,"C:\Users\Admin\Desktop\bin\libMinHook.x86.lib");int main(){   }
MinHook API

MinHook的工作原理是初始化一个结构,这个结构中保存着挂钩和取消挂钩的信息,这是通过初始化库中的HOOK_ENTRY结构的MH_Initalize API完成的,紧接着函数用户创建挂钩,然后启用他们,他们用于取消挂钩,最后清理初始化的结构。

如下结构:

MH_CreateHook MH_EnableHook MH_DisableHook MH_Uninitialize    MH_Initialize 初始化HOOK_ENTRY结构    MH_CreateHook 创建挂钩    MH_EnableHook 启动创建的挂钩    MH_DisableHook 删除挂钩    MH_uninitialize 清理初始化的结构

MinHook API返回一个MG_STATUS值,这个值是用户自定义的枚举,返回的MG_STATUS数据类型表示指定函数的错误码,如果函数成功,则返回MG_OK,如果发生错误就返回非零值。

需要注意的是 MH_Initialize和MH_Uninitialize函数只能分别在程序开始和结束时调用一次。

接下来我们写一个替换原始函数的自定义函数,当调用原始函数的时候触发挂钩然后跳转到我们自定义的函数。

#include <iostream>#include "MinHook.h"#pragma commint(lib,"C:\Users\Admin\Desktop\bin\libMinHook.x86.lib");typedef HMODULE(WINAPI* fnGetModuleHandleA)(    _In_opt_ LPCWSTR lpModuleName    );fnGetModuleHandleA pGetModuleHandleA = NULL;

HMODULE WINAPI MyGetModuleHandleA(LPCWSTR lpModuleName) {
return pGetModuleHandleA(L"NTDLL.DLL");}int main(){ }
挂钩

如果要使用MinHook挂钩特定的API的话,首先需要指定MH_Initialize函数,然后可以使用MG_CreateHook创建挂钩并使用MH_EnableHook启动挂钩。

#include <iostream>#include "MinHook.h"#ifdef _M_X64#pragma comment (lib, "C:\Users\Admin\Desktop\bin\libMinHook.x64.lib")#endif#ifdef _M_IX86#pragma comment (lib, "C:\Users\Admin\Desktop\bin\libMinHook.x86.lib")#endiftypedef HMODULE(WINAPI* fnGetModuleHandleA)(    _In_opt_ LPCWSTR lpModuleName    );fnGetModuleHandleA pGetModuleHandleA = NULL;

HMODULE WINAPI MyGetModuleHandleA(LPCWSTR lpModuleName) {
return GetModuleHandleW(L"USER32.DLL");}BOOL HookTest() { DWORD dwMinHookErr = NULL;
if ((dwMinHookErr = MH_Initialize()) != MH_OK) { return FALSE; }
if ((dwMinHookErr = MH_CreateHook(&GetModuleHandleA, &MyGetModuleHandleA, (LPVOID*) & pGetModuleHandleA)) != MH_OK) { return FALSE; }
if ((dwMinHookErr = MH_EnableHook(&GetModuleHandleA)) != MH_OK) { return -1; }
return TRUE;}


int main(){ HMODULE hmodule = GetModuleHandleA("KERNEL32.DLL"); HookTest();
HMODULE hmodule1 = GetModuleHandleA("KERNEL32.DLL");
getchar();}

API挂钩-Minhook库

取消挂钩

取消挂钩需要注意的是MinHook库是不不需要使用事务的,相反如果需要删除挂钩,唯一的要求是使用挂钩函数的地址运行MH_DisableHook API。

BOOL Unhook() {    DWORD  dwMinHookErr = NULL;
if ((dwMinHookErr = MH_DisableHook(&GetModuleHandleA)) != MH_OK) { return -1; }
if ((dwMinHookErr = MH_Uninitialize()) != MH_OK) { return -1; }}

API挂钩-Minhook库


原文始发于微信公众号(Relay学安全):API挂钩-Minhook库

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年1月1日15:57:36
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   API挂钩-Minhook库https://cn-sec.com/archives/2352176.html

发表评论

匿名网友 填写信息