日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

Detours的作用和实例(hook、钩子)

發(fā)布時(shí)間:2025/3/15 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Detours的作用和实例(hook、钩子) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Detours 可以用來(lái)攔截Win32的API函數(shù),從而讓程序按照我們自定義的方式進(jìn)行處理,而不是Windows默認(rèn)的。

Detours 也是通過(guò)Dll的方式,攔截Api函數(shù)。

為什么是修改API的前5個(gè)字節(jié)?

? 現(xiàn)在NewCode[]里的指令相當(dāng)于Jmp MyMessageBoxW
? 既然已經(jīng)獲取到了Jmp MyMessageBoxW
? 現(xiàn)在該是將Jmp MyMessageBoxW寫入原API入口前5個(gè)字節(jié)的時(shí)候了
? //知道為什么是5個(gè)字節(jié)嗎?
? //Jmp指令相當(dāng)于0xe9,占一個(gè)字節(jié)的內(nèi)存空間
? //MyMessageBoxW是一個(gè)地址,其實(shí)是一個(gè)整數(shù),占4個(gè)字節(jié)的內(nèi)存空間
? //int n=0x123; ? n占4個(gè)字節(jié)和MyMessageBoxW占4個(gè)字節(jié)是一樣的
? //1+4=5,知道為什么是5個(gè)字節(jié)了吧

例:攔截Win32的MessageBoxA()函數(shù)

1.先新建一個(gè)Dll工程

#include "detours.h" #pragma comment(lib,"detours.lib") //導(dǎo)入detours.h和detours.lib文件//static BOOL (WINAPI* Real_Messagebox)(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType)=MessageBoxA; int (WINAPI *Real_Messagebox)(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType)= MessageBoxA; //注意是MessageBoxA函數(shù) extern "C" _declspec(dllexport) BOOL WINAPI MessageBox_Mine(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType) {CString temp= lpText;temp+="該MessageBox已被Detours截獲!";return Real_Messagebox(hWnd,temp,lpCaption,uType); }//dll入口函數(shù) BOOL WINAPI DllMain(HINSTANCE hInstDll, DWORD fdwReason, LPVOID lpvReserved) {if (DLL_PROCESS_ATTACH == fdwReason){DetourTransactionBegin();DetourUpdateThread(GetCurrentThread()); //當(dāng)前線程DetourAttach(&(PVOID&)Real_Messagebox,MessageBox_Mine); //設(shè)置detourDetourTransactionCommit();}else if (DLL_PROCESS_DETACH == fdwReason){DetourTransactionBegin();DetourUpdateThread(GetCurrentThread());DetourDetach(&(PVOID&)Real_Messagebox,MessageBox_Mine);//卸載detourDetourTransactionCommit();}return TRUE;}

特別要注意的就是MessageBox和MessageBoxA是不同的,我剛開始以為detours不會(huì)把它們區(qū)分,結(jié)果一直無(wú)法攔截成功。

2.新建一個(gè)MFC工程(在按扭響應(yīng)函數(shù)中添加 MessageBoxA())

在其OnInitDialog()函數(shù)中 添加::LoadLibrary(L"messageDll.dll"); //注意路徑問(wèn)題

然后在按鈕響應(yīng)函數(shù)中添加?::MessageBoxA(NULL,"4444443","23",0);

這樣當(dāng)成功后 點(diǎn)擊按鈕就可以攔截到MessageBox函數(shù)

效果如圖:

總結(jié)

以上是生活随笔為你收集整理的Detours的作用和实例(hook、钩子)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。