MinHook庫的使用 64位下,過濾LoadLibraryExW


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM