MinHook庫的使用 64位下,過濾LoadLibraryExW
-
MinHook庫的使用 x64
一丶簡介
minHook庫是一個支援x64跟x86HOOK的庫.Detours也支援x64.不過是收費的所以在x64下使用minHook也是一個不錯的選擇.
1.minHook庫的下載以及安裝.
MinHook 我已經打包了一份.可以在我的百度網盤中下載
連結: https://pan.baidu.com/s/1QJcf5_Q9naL2Y48IN2Y5MQ
提取碼:ndmq
解壓之後:

有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, DWORDdwFlags);//函式的定義 PFNloadLibraryExw pfnLoadLibraryExW = NULL; BOOLHOOK(); 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, DWORDdwFlags ) { MyOutputDebugStrig(TEXT("已經HOOK過了 LoadLibraryExW函式")); return pfnLoadLibraryExW(lpLibFileName,hFile,dwFlags); } BOOL APIENTRY DllMain( HMODULE hModule, DWORDul_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; } BOOLHOOK() { //初始化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