日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

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

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

C/C++:Windows编程—IAT Hook实例(程序启动拦截)

發(fā)布時(shí)間:2025/3/15 c/c++ 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C/C++:Windows编程—IAT Hook实例(程序启动拦截) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

C/C++:Windows編程—IAT Hook實(shí)例(程序啟動(dòng)攔截)

前言+思路

本文默認(rèn)讀者有IAT Hook的相關(guān)的基礎(chǔ)知識(shí)了哈,記錄筆者在IAT Hook實(shí)戰(zhàn)中遇到到問(wèn)題以及解決思路。

筆者想實(shí)現(xiàn)一個(gè)功能能夠攔截到程序的啟動(dòng)。經(jīng)過(guò)調(diào)研,大多程序如果是通過(guò)雙擊或者鼠標(biāo)啟動(dòng)的 一般都是有 Windows資源管理器explorer.exe進(jìn)程進(jìn)行創(chuàng)建的。最近剛好學(xué)習(xí)了IAT Hook就用IAT Hook 實(shí)戰(zhàn)一下。創(chuàng)建進(jìn)程Windows API CreateProcessW,所以我們用OD調(diào)試證明一下。使用OD 附加 explorer.exe進(jìn)程,ctrl + g 輸入CreateProcessW 然后在這個(gè)函數(shù)那里用F2打下斷點(diǎn), 然后d打開(kāi)IE瀏覽器或者其他程序。

從這里我們可以看到,在桌面通過(guò)鼠標(biāo)打開(kāi)的程序確實(shí)是使用的explorer.exe進(jìn)程的CreateProcessW方法。我們可以用vs帶的命令工具dumpbin 或 DEPENDS.EXE 查看exe或者dll程序的模塊依賴情況。從下圖,雖然我們看到kernel32.dll在explorer.exe的PE中也有,但是我們上圖OD調(diào)試中看到 kernel32.CreateProcessW調(diào)完了是會(huì)回到shell32.dll中的某個(gè)地方,所以這里可以看出是使用的shell32.dll中的kernel32.dll的CreateProcessW

到這里我們可能就會(huì)這樣去做了,以shell32.dll作為起始地址,在shell32.dll的導(dǎo)入表中找kernel32.dll然后在 kernel32.dll的IAT中找CreateProcessW 函數(shù)然后進(jìn)行IAT Hook。筆者當(dāng)然開(kāi)始的時(shí)候也是這樣想的,不過(guò)情況沒(méi)那么簡(jiǎn)單。下面是筆者在做IAT Hook時(shí)的一段分析思路以及遇到的坑。請(qǐng)結(jié)合下面的幾張圖 容易理解些。

// OD上看,在win7下的explorer.exe中 使用的是SHELL32.dll中的kernel.dll!!!所以這里起始地址應(yīng)該是SHELL32.dll//HMODULE hModuleExe = GetModuleHandle(_T("SHELL32.dll"));// 起始地址用SHELL32.dll模塊,在它的導(dǎo)入表能找到對(duì)應(yīng)的kernel32.dll動(dòng)態(tài)庫(kù),但是從在kernel32.dll的IAT找不到CreateProcessW :)// 媽蛋,筆者當(dāng)然沒(méi)有放棄,筆者繼續(xù)分析,網(wǎng)上找了個(gè) DEPENDS.EXE 來(lái)分析 kernel32.dll。確實(shí)找到了CreateProcessW是kernel32.dll中API-MS-WIN-CORE-PROCESSTHREADS-L1-1-0.DLL模塊的導(dǎo)出函數(shù),通過(guò)dumpin查看該動(dòng)態(tài)庫(kù)它函數(shù)全部給到kernel32.dll了// 所以這里的起始地址應(yīng)該為kernel32.dll,然后找它導(dǎo)入表中的API-MS-WIN-CORE-PROCESSTHREADS-L1-1-0.DLL模塊,// 然后從API-MS-WIN-CORE-PROCESSTHREADS-L1-1-0.DLL找它的IAT中的CreateProcessW,然后進(jìn)行hook。//HMODULE hModuleExe = GetModuleHandle(_T("kernel32.dll"));// 但是,從kernel32.dll的導(dǎo)入表中找到的API-MS-WIN-CORE-PROCESSTHREADS-L1-1-0.DLL的中IAT中找到的函數(shù)和內(nèi)存中的CreateProcessW函數(shù)地址仍然對(duì)不上號(hào)!// 所以筆者又去分析shell32.dll,通過(guò)DEPENDS.exe工具發(fā)現(xiàn)shell32.dll的PE結(jié)構(gòu)也是有API-MS-WIN-CORE-PROCESSTHREADS-L1-1-0.DLL,// 然后再看kernel32.dll中鏈接的API-MS-WIN-CORE-PROCESSTHREADS-L1-1-0.DLL好像是個(gè)快捷方式 應(yīng)該是鏈接的shell32.dll中API-MS-WIN-CORE-PROCESSTHREADS-L1-1-0.DLL// 所以這里的起始地址還是SHELL32.dll模塊,同樣是去找API-MS-WIN-CORE-PROCESSTHREADS-L1-1-0.DLL然后找其中的IAT中的CreateProcessW進(jìn)行hookHMODULE hModuleExe = GetModuleHandle(_T("shell32.dll"));

分析kernel32.dll

分析shell32.dll

dumpbin查看API-MS-WIN-CORE-PROCESSTHREADS-L1-1-0.DLL導(dǎo)出函數(shù)情況

實(shí)現(xiàn)效果

看不清可以看嗶哩嗶哩視頻演示地址 https://www.bilibili.com/video/av82627683/

Windows編程—IAT Hook實(shí)例(實(shí)現(xiàn)Windows程序啟動(dòng)攔截效果)

程序代碼

筆者開(kāi)發(fā)環(huán)境win10-64 + vs2010 32位程序,筆者測(cè)試程序運(yùn)行環(huán)境 win7 x86,這里使用DebugView查看dll中打印的日志,使用Process Explorer查看dll注入情況

這里主要使用IAT Hook的hook CreateProcessW,IAT Hook難點(diǎn)是找到需要hook的函數(shù)的動(dòng)態(tài)庫(kù) 以及這個(gè)動(dòng)態(tài)庫(kù)的"母體"!

PE結(jié)構(gòu)中的一個(gè)DLL對(duì)應(yīng)一個(gè)導(dǎo)入表項(xiàng),一個(gè)函數(shù)對(duì)應(yīng)IAT導(dǎo)入地址表中的一個(gè)IAT項(xiàng)。

找到母體才能進(jìn)行遍歷該母體的導(dǎo)入表進(jìn)而找到動(dòng)態(tài)庫(kù)對(duì)應(yīng)的導(dǎo)入表項(xiàng),通過(guò)找到的導(dǎo)入表項(xiàng)可以找到該動(dòng)態(tài)庫(kù)的IAT表,再遍歷IAT表 找到hook函數(shù)對(duì)應(yīng)的IAT表項(xiàng),有hook函數(shù)的導(dǎo)入地址表 就可以更改導(dǎo)入地址表的函數(shù)地址了,就可以進(jìn)行hook了!

下面是IATHookTest.dll的代碼

#include "stdafx.h" #include <Windows.h>DWORD g_funcAddrOrigninal = NULL; // CreateProcessW函數(shù)的地址 DWORD g_funcIATfuncAddr = NULL; // 導(dǎo)入地址表的地址,就是存放函數(shù)地址的地址,用于卸載IAT Hooktypedef BOOL (WINAPI *CreateProcessWFunc)(LPCWSTR lpApplicationName,LPWSTR lpCommandLine,LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes,BOOL bInheritHandles,DWORD dwCreationFlags,LPVOID lpEnvironment,LPCWSTR lpCurrentDirectory,LPSTARTUPINFOW lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation);BOOL WINAPI MyCreateProcessW(LPCWSTR lpApplicationName,LPWSTR lpCommandLine,LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes,BOOL bInheritHandles,DWORD dwCreationFlags,LPVOID lpEnvironment,LPCWSTR lpCurrentDirectory,LPSTARTUPINFOW lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation) {OutputDebugString(_T("MyCreateProcessW enter-----"));OutputDebugString(lpApplicationName);OutputDebugString(lpCommandLine);CreateProcessWFunc func = (CreateProcessWFunc)g_funcAddrOrigninal;BOOL ret = FALSE;CString appName = lpApplicationName;CString strMsg;strMsg.Format(_T("是否打開(kāi)程序:%s "),appName);if(IDYES == MessageBox(NULL,strMsg,_T("請(qǐng)選擇"),MB_YESNO)){ret = func(lpApplicationName,lpCommandLine,lpProcessAttributes,lpThreadAttributes,bInheritHandles,dwCreationFlags,lpEnvironment,lpCurrentDirectory,lpStartupInfo,lpProcessInformation);}else{ret = TRUE;}OutputDebugString(_T("MyCreateProcessW exit-----"));return ret; }void IATHOOKCreateProcessW() {OutputDebugString(_T("IATHOOKCreateProcessW, enter "));// 獲取CreateProcessW函數(shù)地址,該函數(shù)是Kernel32.dll導(dǎo)出的函數(shù)HMODULE hModuleKernel = GetModuleHandle(_T("kernel32.dll")); if(hModuleKernel == NULL){OutputDebugString(_T("IATHOOKCreateProcessW,LoadLibrary kernel32.dll failed !!!"));return;}CreateProcessWFunc CreateProcessWAddress = (CreateProcessWFunc)GetProcAddress(hModuleKernel,"CreateProcessW");if(CreateProcessWAddress == NULL){OutputDebugString(_T("IATHOOKCreateProcessW,GetProcAddress CreateProcessW failed !!!"));return;}g_funcAddrOrigninal = (DWORD)CreateProcessWAddress;//CString addr;//addr.Format(_T("kernel->CreateProcessWAddress = %x"),g_funcAddrOrigninal);//OutputDebugString(addr);//HMODULE hModuleExe = GetModuleHandle(_T("SHELL32.dll"));// OD上看,在win7下的explorer.exe中 使用的是SHELL32.dll中的kernel.dll!!!所以這里起始地址應(yīng)該是SHELL32.dll// 起始地址用SHELL32.dll模塊在它的導(dǎo)入表能找到對(duì)應(yīng)的kernel32.dll動(dòng)態(tài)庫(kù),但是從在kernel32.dll的IAT找不到CreateProcessW :)// 媽蛋,筆者當(dāng)然沒(méi)有放棄,筆者繼續(xù)分析,網(wǎng)上找了個(gè) DEPENDS.EXE 來(lái)分析 kernel32.dll。確實(shí)找到了CreateProcessW是kernel32.dll中API-MS-WIN-CORE-PROCESSTHREADS-L1-1-0.DLL模塊的導(dǎo)出函數(shù)!// 所以這里的起始地址應(yīng)該為kernel32.dll,然后找它導(dǎo)入表中的API-MS-WIN-CORE-PROCESSTHREADS-L1-1-0.DLL模塊,// 然后從API-MS-WIN-CORE-PROCESSTHREADS-L1-1-0.DLL找它的IAT中的CreateProcessW,然后進(jìn)行hook//HMODULE hModuleExe = GetModuleHandle(_T("kernel32.dll"));// 但是,從kernel32.dll的導(dǎo)入表中找到的API-MS-WIN-CORE-PROCESSTHREADS-L1-1-0.DLL中IAT中找到的函數(shù)和內(nèi)存中的函數(shù)地址仍然對(duì)不上號(hào)!// 所以筆者又去分析shell32.dll,通過(guò)DEPENDS.exe工具發(fā)現(xiàn)shell32.dll的PE結(jié)構(gòu)也是有API-MS-WIN-CORE-PROCESSTHREADS-L1-1-0.DLL,// 然后再看shell32.dll中鏈接的API-MS-WIN-CORE-PROCESSTHREADS-L1-1-0.DLL好些是個(gè)快捷方式 應(yīng)該是鏈接的shell32.dll中API-MS-WIN-CORE-PROCESSTHREADS-L1-1-0.DLL// 所以這里的起始地址還是SHELL32.dll模塊,同樣是去找API-MS-WIN-CORE-PROCESSTHREADS-L1-1-0.DLL然后找其中的IATHMODULE hModuleExe = GetModuleHandle(_T("shell32.dll"));// 獲取PE結(jié)構(gòu)PIMAGE_DOS_HEADER pDosHead = (PIMAGE_DOS_HEADER)hModuleExe;PIMAGE_NT_HEADERS pNtHead = (PIMAGE_NT_HEADERS)((DWORD)hModuleExe + pDosHead->e_lfanew);// 保存映像基址和導(dǎo)入表的RVAULONGLONG dwImageBase = pNtHead->OptionalHeader.ImageBase;ULONGLONG dwImpDicRva = pNtHead->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;// 導(dǎo)入表的VA,導(dǎo)入表的一項(xiàng)對(duì)應(yīng)一個(gè)DLL模塊PIMAGE_IMPORT_DESCRIPTOR pImageDes= (PIMAGE_IMPORT_DESCRIPTOR)(dwImageBase + dwImpDicRva);PIMAGE_IMPORT_DESCRIPTOR pImageTemp = pImageDes;// 在導(dǎo)入表中查找要hook的模塊是否存在bool bFind = false;while(pImageTemp->Name) // 最后一項(xiàng)結(jié)構(gòu)體為全0{char* pName = (char*)(dwImageBase + pImageTemp->Name); // name地址CString cstrName = pName;if(cstrName.CompareNoCase(_T("API-MS-WIN-CORE-PROCESSTHREADS-L1-1-0.DLL")) == 0){OutputDebugString(_T("IATHOOKCreateProcessW,find API-MS-WIN-CORE-PROCESSTHREADS-L1-1-0.DLL"));bFind = true;break;}pImageTemp++;}bool bFindFnc = false;// 已經(jīng)找到要HOOK的DLL模塊if(bFind){// 導(dǎo)入地址表,一項(xiàng)對(duì)應(yīng)一個(gè)函數(shù),進(jìn)行遍歷 查找到要hook的函數(shù)PIMAGE_THUNK_DATA pThunk = (PIMAGE_THUNK_DATA)(dwImageBase + pImageTemp->FirstThunk);while(pThunk->u1.Function) // 最后一項(xiàng)結(jié)構(gòu)體為全0{DWORD* pFuncAddr = (DWORD*)&(pThunk->u1.Function); // 這個(gè)地址上內(nèi)存存放的是【函數(shù)的地址】// 取出函數(shù)的地址 和 之前在程序中找到的函數(shù)地址做比較,如果一樣就找到了該函數(shù)的導(dǎo)入地址表了!//CString addr;//addr.Format(_T("IAT->funcAddr = %x"),*pFuncAddr);//OutputDebugString(addr);if(*pFuncAddr == g_funcAddrOrigninal){bFindFnc = true;DWORD dwMyHookAddr = (DWORD)MyCreateProcessW;g_funcIATfuncAddr = (DWORD)pFuncAddr; // 將存放函數(shù)地址的內(nèi)存地址保存,以便后面卸載hookOutputDebugString(_T("IATHOOKCreateProcessW, CreateProcessW was found"));BOOL bRet = WriteProcessMemory(GetCurrentProcess(),pFuncAddr,&dwMyHookAddr,sizeof(DWORD),NULL);if(bRet){OutputDebugString(_T("IATHOOKCreateProcessW,WriteProcessMemory suc"));}else{OutputDebugString(_T("IATHOOKCreateProcessW,WriteProcessMemory fail !!!"));}break;}pThunk++;}}if(bFindFnc == false){OutputDebugString(_T("IATHOOKCreateProcessW, not find CreateProcessW!!!"));}}void UNIATHOOKCreateProcessW() {OutputDebugString(_T("UNIATHOOKCreateProcessW, enter "));if(g_funcIATfuncAddr){if(g_funcAddrOrigninal){OutputDebugString(_T("UNIATHOOKCreateProcessW,CreateProcessW was found"));BOOL bRet = WriteProcessMemory(GetCurrentProcess(),(LPVOID)g_funcIATfuncAddr,&g_funcAddrOrigninal,sizeof(DWORD),NULL);if(bRet){OutputDebugString(_T("UNIATHOOKCreateProcessW,WriteProcessMemory suc"));}else{OutputDebugString(_T("UNIATHOOKCreateProcessW,WriteProcessMemory fail !!!"));}}} }BOOL WINAPI DllMain (HANDLE hInst,ULONG ul_reason_for_call,LPVOID lpReserved) {switch (ul_reason_for_call) {case DLL_PROCESS_ATTACH: {IATHOOKCreateProcessW();}break;case DLL_PROCESS_DETACH: {UNIATHOOKCreateProcessW();}break;case DLL_THREAD_ATTACH: {}break;case DLL_THREAD_DETACH: {}break;}return TRUE; }

完整項(xiàng)目

項(xiàng)目包含一個(gè)InjectDllTool工程代碼,使用MFC寫(xiě)的dll注入小程序,然后注入IATHookTest.dll 實(shí)現(xiàn)普通程序的啟動(dòng)攔截效果。完整代碼可以在這里下載,沒(méi)分可以在這里github下載最新代碼,如果可以的話給點(diǎn)個(gè)小星星喲。

總結(jié)

以上是生活随笔為你收集整理的C/C++:Windows编程—IAT Hook实例(程序启动拦截)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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

主站蜘蛛池模板: 日韩视频免费在线播放 | 国产一区二区三区高清 | 日韩精品一区二区三区中文在线 | 国产粉嫩白浆 | 中文字幕av影片 | 国产又黄又粗 | 无遮挡国产| 男女草逼| 久久久久亚洲av成人片 | 国产强被迫伦姧在线观看无码 | 午夜影院一区 | 中文字幕婷婷 | 国产睡熟迷奷系列精品视频 | 欧美日韩高清一区二区 国产亚洲免费看 | 国产精品久久中文字幕 | 亚洲综合第一页 | 激情久久久 | 欧美激情在线看 | 成人网战 | 亚洲a在线播放 | 视频一区欧美 | 欧美精品卡一卡二 | 国产成人精品av久久 | 91美女视频在线观看 | 午夜中文字幕 | 五月综合激情 | 国产蜜臀av一区二区 | 欧美日韩在线网站 | 91视频综合网 | a视频免费看 | 中文字幕va | 国产精品免费久久久久 | 天天亚洲 | 色老头在线观看 | www日本免费 | 日本加勒比一区二区 | 麻豆久久久久久 | 亚洲一区二区免费 | 无码国模国产在线观看 | 在线观看免费高清 | 亚洲人人干 | 久久成人高清 | 国产午夜视频在线播放 | av天天网| a级片黄色| 日韩精品一区二区亚洲av观看 | 国产亚洲久久 | 国产精品第一页在线观看 | 中文在线观看视频 | 精品毛片在线观看 | 影音先锋人妻啪啪av资源网站 | 国产无套精品一区二区三区 | wwww日本60| 午夜两性| 初音未来打屁股 | 天天曰天天| sm调教羞耻姿势图片 | 青青青青在线 | 日韩成人精品一区二区 | 日本a级片网站 | 伊人www22综合色 | 亚洲欧洲免费 | 男女黄色片 | 精品久久久久久久久久久久久久久久 | 国产a一级 | 日韩亚洲在线 | 97影院手机版 | 中文字幕一区二区三区四区欧美 | 臭脚猛1s民工调教奴粗口视频 | 自拍99页 | 97久久久 | av黄色天堂 | 爽爽av| 国内精品小视频 | 亚洲第一页色 | 天堂久久精品忘忧草 | 免费看av在线 | 中文字幕不卡 | 一区二区三区在线免费播放 | 人妻 丝袜美腿 中文字幕 | 1024日韩 | 国产精品久久久午夜夜伦鲁鲁 | 蜜臀久久99精品久久久无需会员 | www.男人的天堂 | 日本a在线播放 | 欧美一级淫片免费视频魅影视频 | 麻豆视频污 | 少妇媚药按摩中文字幕 | 成人亚洲黄色 | 五月婷婷久久久 | 成人美女在线观看 | 久久久久久久久久久99 | 亚洲综合日韩精品欧美综合区 | 欧美有码在线 | 亚洲色图丝袜美腿 | 精品人妻一区二区三区日产乱码卜 | 日韩精品一区二区av | 日本日皮视频 | 免费在线观看成年人视频 |