简介
Minhook库其实跟上一篇的那个库是差不多的,只不过它是使用C语言进行编写的hook库,我们可以使用它来进行Hook Windows API函数,MinHook库相比Detours库来说是比较简单的,它是一个轻量级的API。
下载地址如下:
https://github.com/TsudaKageyu/minhook
它跟Detours库是类似的,Minhook库也需要.lib文件和MinHook.h文件,将这两个文件拉入到项目中即可。
如下代码:
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函数只能分别在程序开始和结束时调用一次。
接下来我们写一个替换原始函数的自定义函数,当调用原始函数的时候触发挂钩然后跳转到我们自定义的函数。
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启动挂钩。
typedef 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();
}
取消挂钩
取消挂钩需要注意的是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;
}
}
原文始发于微信公众号(Relay学安全):API挂钩-Minhook库
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论