最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

微軟Detours Hook庫編譯與使用教程

 更新時(shí)間:2024年08月16日 10:12:18   作者:微軟技術(shù)分享  
Detours 是一個(gè)兼容多個(gè)Windows系列操作系統(tǒng)版本(包括 Windows XP 到 Windows 11)的工具庫,Detours 是微軟開發(fā)的一個(gè)強(qiáng)大的Windows API鉤子庫,用于監(jiān)視和攔截函數(shù)調(diào)用,這篇文章給大家介紹微軟Detours Hook庫編譯與使用,感興趣的朋友一起看看吧

Detours 是微軟開發(fā)的一個(gè)強(qiáng)大的Windows API鉤子庫,用于監(jiān)視和攔截函數(shù)調(diào)用。它廣泛應(yīng)用于微軟產(chǎn)品團(tuán)隊(duì)和眾多獨(dú)立軟件開發(fā)中,旨在無需修改原始代碼的情況下實(shí)現(xiàn)函數(shù)攔截和修改。Detours 在調(diào)試、監(jiān)控、日志記錄和性能分析等方面表現(xiàn)出色,已成為開發(fā)者的重要工具。本章將指導(dǎo)讀者編譯并使用Detours庫,通過實(shí)現(xiàn)一個(gè)簡(jiǎn)單的彈窗替換功能,幫助讀者熟悉該庫的使用技巧。

Detours 是一個(gè)兼容多個(gè)Windows系列操作系統(tǒng)版本(包括 Windows XPWindows 11)的工具庫。它現(xiàn)在在 MIT 開源許可證下發(fā)布,簡(jiǎn)化了開發(fā)者的使用許可流程,并允許社區(qū)利用開源工具和流程來支持其發(fā)展,目前該庫的穩(wěn)定版本為4.0.1讀者可通過如下官方鏈接自行下載到本地。

Detours 4.0.1:https://github.com/microsoft/Detours/releases

下載文件后打開目錄,其中src目錄下存儲(chǔ)的是Detours庫的源代碼,而samples則是一些使用案例,當(dāng)準(zhǔn)備就緒后讀者需要打開Visual Studio開發(fā)者命令提示符,你可以從開始菜單中找到Visual Studio Tools工具菜單,并在其中找到VS20XX x86 本機(jī)工具命令提示Developer Command Prompt for VS 20XX字樣,此處以x86為例,在命令提示符中跳轉(zhuǎn)到Detours源代碼目錄,運(yùn)行 nmake 命令執(zhí)行編譯。

如果一切順利,這將會(huì)編譯Detours庫并生成所需的二進(jìn)制文件,其中include保存有頭文件信息,而lib.X86則包含有detours.lib庫文件,如下圖中所示。

接著我們打開Visual Studio工具,新建一個(gè)可執(zhí)行控制臺(tái)項(xiàng)目并配置包含引用目錄及庫目錄,如下圖所示;

接著我們來實(shí)現(xiàn)攔截并替換彈窗功能,在Windows中彈窗接口為MessageBoxW函數(shù),首先需要定義OriginalMessageBoxW的函數(shù)指針,該指針用于指向原始的MessageBoxW函數(shù)地址。接著定義CustomMessageBoxW函數(shù),在函數(shù)內(nèi)首先將彈窗提示替換為自定義內(nèi)容,并攜帶該參數(shù)調(diào)用OriginalMessageBoxW原函數(shù)地址,以此來實(shí)現(xiàn)替代彈窗功能。

#include <iostream>
#include <Windows.h>
#include "detours.h"
#pragma comment(lib, "detours.lib")
// 定義指向原始 MessageBoxW 函數(shù)的指針
static int (WINAPI *OriginalMessageBoxW)(
	_In_opt_ HWND hWnd,
	_In_opt_ LPCWSTR lpText,
	_In_opt_ LPCWSTR lpCaption,
	_In_ UINT uType) = MessageBoxW;
// 自定義的 MessageBoxW 函數(shù),用于替換原始函數(shù)
static int WINAPI CustomMessageBoxW(
	_In_opt_ HWND hWnd,
	_In_opt_ LPCWSTR lpText,
	_In_opt_ LPCWSTR lpCaption,
	_In_ UINT uType)
{
	// 調(diào)用原始的 MessageBoxW 函數(shù),但修改了顯示的文本
	return OriginalMessageBoxW(hWnd, L"hello lyshark", L"MsgBox", MB_OK);
}

接著就是對(duì)掛鉤與摘鉤的函數(shù)封裝,分別定義這兩個(gè)函數(shù),其中InstallHook 函數(shù)通過Detours事務(wù)的方式,將原始的 MessageBoxW 函數(shù)指針替換為自定義的 CustomMessageBoxW 函數(shù)指針,從而攔截并修改該函數(shù)的行為。相反,RemoveHook 函數(shù)則通過類似的事務(wù)機(jī)制,將自定義的 CustomMessageBoxW 函數(shù)指針替換回原始的 MessageBoxW 函數(shù)指針,以恢復(fù)函數(shù)的原始行為。

// 安裝鉤子
void InstallHook()
{
	// 開始一個(gè) Detours 事務(wù)
	if (DetourTransactionBegin() == NO_ERROR)
	{
		// 更新當(dāng)前線程以準(zhǔn)備進(jìn)行鉤子操作
		if (DetourUpdateThread(GetCurrentThread()) == NO_ERROR)
		{
			// 將原始函數(shù)指針替換為自定義的函數(shù)指針
			if (DetourAttach(&(PVOID&)OriginalMessageBoxW, CustomMessageBoxW) == NO_ERROR)
			{
				// 提交事務(wù),完成鉤子安裝
				if (DetourTransactionCommit() == NO_ERROR)
				{
					printf("鉤子已成功安裝。\n");
					return;
				}
			}
		}
		// 如果任何步驟失敗,則中止事務(wù)
		DetourTransactionAbort();
	}
	printf("安裝鉤子失敗。\n");
}
// 移除鉤子
void RemoveHook()
{
	// 開始一個(gè) Detours 事務(wù)
	if (DetourTransactionBegin() == NO_ERROR)
	{
		// 更新當(dāng)前線程以準(zhǔn)備進(jìn)行鉤子操作
		if (DetourUpdateThread(GetCurrentThread()) == NO_ERROR)
		{
			// 將自定義的函數(shù)指針替換回原始函數(shù)指針
			if (DetourDetach(&(PVOID&)OriginalMessageBoxW, CustomMessageBoxW) == NO_ERROR)
			{
				// 提交事務(wù),完成鉤子移除
				if (DetourTransactionCommit() == NO_ERROR)
				{
					printf("鉤子已成功移除。\n");
					return;
				}
			}
		}
		// 如果任何步驟失敗,則中止事務(wù)
		DetourTransactionAbort();
	}
	printf("移除鉤子失敗。\n");
}

在程序入口處,我們分三次調(diào)用MessageBoxW函數(shù),其中第一次調(diào)用及最后依次調(diào)用均在未掛鉤狀態(tài)下進(jìn)行,第二次調(diào)用之前通過InstallHook()安裝鉤子,之后再調(diào)用MessageBoxW函數(shù),并在調(diào)用結(jié)束后通過RemoveHook()移除鉤子,編譯這段代碼。

int main(int argc, char *argv[])
{
	// 顯示原始的消息框
	MessageBoxW(NULL, L"hello world", L"MsgBox", MB_OK);
	// 安裝鉤子并顯示修改后的消息框
	InstallHook();
	MessageBoxW(NULL, L"hello world", L"MsgBox", MB_OK);
	// 移除鉤子并恢復(fù)為原始的消息框
	RemoveHook();
	MessageBoxW(NULL, L"hello world", L"MsgBox", MB_OK);
	system("pause");
	return 0;
}

使用x64dbg調(diào)試器加載運(yùn)行代碼,并尋找到程序的入口處,由于此處的入口處僅僅是一個(gè)main(int argc, char *argv[])所以,在匯編中我們可以直接尋找三個(gè)參數(shù)的關(guān)鍵變量位置,找到后即可定位到入口處,此時(shí)直接跟進(jìn)去就可以看到主函數(shù)代碼;

如下圖中所示,當(dāng)0x00321314處被執(zhí)行后則鉤子生效,當(dāng)鉤子生效后則底部0x00321347處的地址將被替換為自定義鉤子地址,此時(shí)在其之上的入棧操作數(shù)將會(huì)失效;

繼續(xù)跟進(jìn)0x00321347這個(gè)地址,如下圖所示該地址中的入口處已被替換為我們自定義的彈窗位置,此處是一個(gè)jmp無條件跳轉(zhuǎn),預(yù)示著將要轉(zhuǎn)向。

我們繼續(xù)跟進(jìn)這個(gè)轉(zhuǎn)向地址,則可看到如下圖所示的反匯編指令集,這里的代碼重新入棧了新的字符串變量,并在入棧后調(diào)用了原始MessageBoxW函數(shù),并依次來實(shí)現(xiàn)替換函數(shù)彈窗中的內(nèi)容。

此時(shí),當(dāng)繼續(xù)調(diào)用原始函數(shù)時(shí),雖函數(shù)中的提示信息為hello world但由于掛鉤生效了則提示信息會(huì)被變更為hello lyshark,以此來實(shí)現(xiàn)對(duì)函數(shù)功能的替換與更正。

在實(shí)際應(yīng)用中,我們通常通過 DLL 注入的方式使用 Detours 庫,以便更好地實(shí)現(xiàn)對(duì)第三方程序的功能替換或修改,例如改變彈窗提示。這種方法能夠更高效地應(yīng)用 Hook 技術(shù),實(shí)現(xiàn)對(duì)目標(biāo)程序行為的控制和定制。

例如如下所示的這段代碼,當(dāng)使用注入器將其注入到第三方進(jìn)程中時(shí),首先DLL_PROCESS_ATTACH將被執(zhí)行也就是開始掛鉤,在掛鉤函數(shù)中通過DetourFindFunction尋找到MessageBoxW函數(shù)的入口地址,并將其存儲(chǔ)到OriginalMessageBoxW指針中,并通過DetourAttach對(duì)其進(jìn)行掛鉤。

#include <windows.h>
#include "detours.h"
#include "detver.h"
#pragma comment(lib, "detours.lib")
// 定義 MessageBoxW 函數(shù)指針類型
static int (WINAPI *OriginalMessageBoxW)(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType) = NULL;
// 自定義的 MessageBoxW 函數(shù)
int WINAPI MyMessageBoxW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType)
{
	// 可以在這里添加自定義邏輯
	return OriginalMessageBoxW(hWnd, L"hello lyshark", lpCaption, uType);
}
// 安裝鉤子
void InstallHooks()
{
	DetourRestoreAfterWith();
	// 開始事務(wù)
	DetourTransactionBegin();
	// 更新當(dāng)前線程
	DetourUpdateThread(GetCurrentThread());
	// 查找并攔截 MessageBoxW 函數(shù)
	OriginalMessageBoxW = (int (WINAPI *)(HWND, LPCWSTR, LPCWSTR, UINT))DetourFindFunction("User32.dll", "MessageBoxW");
	if (OriginalMessageBoxW != NULL)
	{
		// 開始掛鉤
		DetourAttach(&(PVOID&)OriginalMessageBoxW, MyMessageBoxW);
	}
	// 提交事務(wù)
	DetourTransactionCommit();
}
// 卸載鉤子
void UninstallHooks()
{
	// 開始事務(wù)
	DetourTransactionBegin();
	// 更新當(dāng)前線程
	DetourUpdateThread(GetCurrentThread());
	// 撤銷攔截 MessageBoxW 函數(shù)
	if (OriginalMessageBoxW != NULL)
	{
		// 摘除鉤子
		DetourDetach(&(PVOID&)OriginalMessageBoxW, MyMessageBoxW);
	}
	// 提交事務(wù)
	DetourTransactionCommit();
}
// DLL 入口點(diǎn)
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		// 禁用線程庫調(diào)用
		DisableThreadLibraryCalls(hModule);
		// 安裝鉤子
		InstallHooks();
		break;
	case DLL_THREAD_ATTACH:
		break;
	case DLL_THREAD_DETACH:
		break;
	case DLL_PROCESS_DETACH:
		// 卸載鉤子
		UninstallHooks();
		break;
	}
	return TRUE;
}

當(dāng)掛鉤成功后則進(jìn)程中任何調(diào)用彈窗的提示信息都將被替換成hello lyshark提示,而標(biāo)題欄因未被替換則依然會(huì)保持原始狀態(tài),如下圖是注入之前與注入之后的提示變化;

至此本章內(nèi)容結(jié)束,其實(shí)Hook在安全領(lǐng)域的應(yīng)用相當(dāng)廣泛,例如可以監(jiān)控和攔截指定的API調(diào)用,檢測(cè)分析程序的行為,攔截網(wǎng)絡(luò)通信函數(shù),監(jiān)控?cái)?shù)據(jù)傳輸,攔截文件操作和注冊(cè)表訪問等等,本文也只是拋磚引玉讓讀者能認(rèn)識(shí)Detours庫。更多有用的案例可自行參考samples目錄下的內(nèi)容學(xué)習(xí)。

到此這篇關(guān)于微軟Detours Hook庫編譯與使用的文章就介紹到這了,更多相關(guān)微軟Detours Hook庫內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++中的數(shù)字轉(zhuǎn)字符串to_string

    C++中的數(shù)字轉(zhuǎn)字符串to_string

    這篇文章主要介紹了C++中的數(shù)字轉(zhuǎn)字符串to_string,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 深入const int *p與int * const p的區(qū)別詳解(常量指針與指向常量的指針)

    深入const int *p與int * const p的區(qū)別詳解(常量指針與指向常量的指針)

    本篇文章是對(duì)const int *p與int * const p的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • C語言中scanf函數(shù)與空格回車的用法說明

    C語言中scanf函數(shù)與空格回車的用法說明

    這篇文章主要介紹了C語言中scanf函數(shù)與空格回車的用法說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • C語言深入講解語句與選擇結(jié)構(gòu)的使用

    C語言深入講解語句與選擇結(jié)構(gòu)的使用

    這篇文章主要為大家介紹了C語言的語句與選擇結(jié)構(gòu),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • C語言從strcpy到自定義字符串處理函數(shù)的原理解析

    C語言從strcpy到自定義字符串處理函數(shù)的原理解析

    這篇文章主要介紹了C語言從strcpy到自定義字符串處理函數(shù)的相關(guān)資料,本文將從常見的字符串函數(shù)(如strcpy、strcat)入手,逐步深入探討字符串操作的核心原理,并引導(dǎo)你實(shí)現(xiàn)自定義字符串處理函數(shù),感興趣的朋友一起看看吧
    2025-05-05
  • C++?超詳細(xì)示例講解list的使用

    C++?超詳細(xì)示例講解list的使用

    list是一種序列式容器。list容器完成的功能實(shí)際上和數(shù)據(jù)結(jié)構(gòu)中的雙向鏈表是極其相似的,list中的數(shù)據(jù)元素是通過鏈表指針串連成邏輯意義上的線性表,也就是list也具有鏈表的主要優(yōu)點(diǎn),即:在鏈表的任一位置進(jìn)行元素的插入、刪除操作都是快速的
    2022-07-07
  • C++中vector<vector<int>?>的基本使用方法

    C++中vector<vector<int>?>的基本使用方法

    vector<vector<int>?>其實(shí)就是容器嵌套容器,外層容器的元素類型是vector<int>,下面這篇文章主要給大家介紹了關(guān)于C++中vector<vector<int>?>的基本使用方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • 一文詳解C++模板和泛型編程

    一文詳解C++模板和泛型編程

    這篇文章主要為為大家為大家詳細(xì)的介紹了C++模板和泛型編程使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • 關(guān)于C語言位運(yùn)算的簡(jiǎn)單示例

    關(guān)于C語言位運(yùn)算的簡(jiǎn)單示例

    這篇文章主要介紹了關(guān)于C語言位運(yùn)算的簡(jiǎn)單示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • QT利用QProcess獲取計(jì)算機(jī)硬件信息

    QT利用QProcess獲取計(jì)算機(jī)硬件信息

    本文介紹利用QProcess獲取計(jì)算機(jī)的CPU、主板、硬盤等電腦相關(guān)硬件信息。文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)QT有一定的幫助,感興趣的可以了解一下
    2022-06-06

最新評(píng)論

中阳县| 青阳县| 鸡东县| 榆社县| 麻栗坡县| 新密市| 嵊泗县| 章丘市| 新安县| 岳阳县| 华容县| 南华县| 紫金县| 峨眉山市| 玛曲县| 司法| 古浪县| 安国市| 墨竹工卡县| 平阴县| 丹东市| 西宁市| 惠安县| 大港区| 若尔盖县| 邹平县| 牡丹江市| 柘城县| 嫩江县| 福海县| 广饶县| 山阳县| 新乡市| 谢通门县| 扶余县| 营山县| 黔西| 全椒县| 花垣县| 剑河县| 建水县|