MinHook庫的使用 x64
一丶簡介
minHook庫是一個支持x64跟x86HOOK的庫.Detours也支持x64.不過是收費的所以在x64下使用minHook也是一個不錯的選擇.
1.minHook庫的下載以及安裝.
MinHook 我已經打包了一份.可以在我的百度網盤中下載
鏈接:https://pan.baidu.com/s/1QJcf5_Q9naL2Y48IN2Y5MQ
提取碼:ndmq
當然也可以在Github下載.
庫源文件:
https://github.com/m417z/minhook
解壓之后:
有4個文件目錄
build
dll_resources
include
src
我們打開build目錄
可以看到從 VC9 - VC15 這個代表VS編譯器的版本號.
比如我用的是VS2013.其版本號就是VC12.我們進入文件目錄
打開后綴名為.sln或者.vcxproj都可以.
打開之后如上所示.
一個libMinHook
一個MinHOOK
libMinHook是生成 lib供我們使用的.
MinHook工程是生成DLL供我們使用的.
x86編譯跟x64編譯
比如我們要HOOK的程序是x64程序的話.我這里選擇的是生成lib庫.
你需要將你的VS配置管理器改成x64.來生成libMinHook的庫.
這樣你的程序引用x64的lib庫.就可以Hookx64程序了.
二丶使用MinHook庫,過濾LoadLibraryExW
2.1編寫X64測試程序.
既然我們要使用Hook.那么就編寫一個X64程序.這個程序就是加載DLL
代碼如下:
#include <Windows.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
HMODULE hDll;
hDll = LoadLibraryExW(TEXT("x64Hook.dll"), NULL, 0); //加載HOOK的DLL
hDll = LoadLibraryExW(TEXT("kernel32.dll"),NULL,NULL);//判斷是否被HOOK
system("pause");
return 0;
}
2.2使用MinHook庫
在使用之前.我們有必要介紹一下 Minhook.h頭文件中提供給我的函數聲明
MH_STATUS WINAPI MH_Initialize(VOID); //初始化HOOK引擎
MH_STATUS WINAPI MH_Uninitialize(VOID); //反初始化
MH_STATUS WINAPI MH_CreateHook(LPVOID pTarget, LPVOID pDetour, LPVOID *ppOriginal);//創建HOOK跳板
MH_STATUS WINAPI MH_CreateHookApi( //創建APIhook跳板
LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID *ppOriginal);
MH_STATUS WINAPI MH_CreateHookApiEx( //擴展
LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID *ppOriginal, LPVOID *ppTarget);
MH_STATUS WINAPI MH_RemoveHook(LPVOID pTarget); //刪除HOOK
MH_STATUS WINAPI MH_EnableHook(LPVOID pTarget); //啟動HOOK
MH_STATUS WINAPI MH_DisableHook(LPVOID pTarget); //結束HOOK
MH_STATUS WINAPI MH_QueueEnableHook(LPVOID pTarget);
MH_STATUS WINAPI MH_QueueDisableHook(LPVOID pTarget);
MH_STATUS WINAPI MH_ApplyQueued(VOID);
const char * WINAPI MH_StatusToString(MH_STATUS status);
如果我們要寫成HOOK總共步驟如下;
1.初始化HOOK引擎
2.創建HOOK跳板函數
3.啟用HOOK
4.結束HOOK
5.刪除HOOK
6.反初始化HOOK引擎
特別注意創建HOOK跳板函數.我們可以用的接口有 MB_CreateHook MB_CreateHookApi MB_CreateHookApiEx
以第一個為例: 參數1: 你要HOOK的函數的函數指針(&LoadLibraryExW) 參數2:你自定義的函數 (&MyLoadLibraryExW) 參數3:跳板函數指針
參數3的意思就是 我們的函數內部調用參數3.相當於調用原函數.
2.3完整HOOK代碼
// dllmain.cpp : 定義 DLL 應用程序的入口點。
#include "stdafx.h"
#include "MinHook.h"
#include <tchar.h>
#include <windows.h>
#if defined _M_X64
#pragma comment(lib, "libMinHook.x64.lib")
#elif defined _M_IX86
#pragma comment(lib, "libMinHook.x86.lib")
#endif
typedef HMODULE (WINAPI *PFNloadLibraryExw)(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwFlags); //函數的定義
PFNloadLibraryExw pfnLoadLibraryExW = NULL;
BOOL HOOK();
BOOL UnHOOK();
void __cdecl MyOutputDebugStrig(const _TCHAR* pszFormat, ...)
{
_TCHAR buf[1024] = { 0 };
// ZeroMemory( buf, 1024*sizeof(TCHAR ) );
swprintf_s(buf, 1024, _T("線程ID = [%lu]"), GetCurrentThreadId());
va_list arglist;
va_start(arglist, pszFormat);
int nBuffSize = _tcslen(buf);
vswprintf_s(&buf[nBuffSize], 1024 - nBuffSize, pszFormat, arglist);
va_end(arglist);
nBuffSize = _tcslen(buf);
_tcscat_s(buf, 1024 - nBuffSize, _T("\n"));
OutputDebugString(buf);
}
HMODULE WINAPI MyLoadLibraryExW(
LPCSTR lpLibFileName,
HANDLE hFile,
DWORD dwFlags
)
{
MyOutputDebugStrig(TEXT("已經HOOK過了 LoadLibraryExW函數"));
return pfnLoadLibraryExW(lpLibFileName,hFile,dwFlags);
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
HOOK();
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
UnHOOK();
break;
}
return TRUE;
}
BOOL HOOK()
{
//初始化MinHOOK HOOK他的函數
if (MH_Initialize() != MH_OK)
{
MyOutputDebugStrig(TEXT("MH_Initialize Error"));
return FALSE;
}
// Create a hook for MessageBoxW, in disabled state.
if (MH_CreateHook(&LoadLibraryExW, &MyLoadLibraryExW, //創建HOOK
reinterpret_cast<void**>(&pfnLoadLibraryExW)) != MH_OK)
{
MyOutputDebugStrig(TEXT("MH_CreateHook Error"));
return FALSE;
}
// Enable the hook for MessageBoxW.
if (MH_EnableHook(&LoadLibraryExW) != MH_OK) //啟動HOOK
{
MyOutputDebugStrig(TEXT("MH_EnableHook Error"));
return FALSE;
}
return TRUE;
}
BOOL UnHOOK()
{
// Disable the hook for MessageBoxW.
if (MH_DisableHook(&MessageBoxW) != MH_OK)
{
MyOutputDebugStrig(TEXT("MH_DisableHook Error"));
return FALSE;
}
// Expected to tell "Not hooked...".
// Uninitialize MinHook.
if (MH_Uninitialize() != MH_OK)
{
MyOutputDebugStrig(TEXT("MH_Uninitialize Error"));
return FALSE;
}
}
注意這個dll 是64的.我們要HOOK的是測試程序中的LoadLibraryExW函數.
結果:
這樣說明我們的DLL已經起作用了.我們的測試程序加載我們的x64HookDLL.而我們的X64HookDLL則會進行HOOK.
代碼鏈接:
鏈接:https://pan.baidu.com/s/1A-eyJ_CxvptYeerqKKHHyg
提取碼:iayb