九九热最新网址,777奇米四色米奇影院在线播放,国产精品18久久久久久久久久,中文有码视频,亚洲一区在线免费观看,国产91精品在线,婷婷丁香六月天

鉤子程序應(yīng)用

上傳人:dfg****19 文檔編號(hào):247446238 上傳時(shí)間:2024-10-18 格式:PPT 頁(yè)數(shù):76 大?。?10.50KB
收藏 版權(quán)申訴 舉報(bào) 下載
鉤子程序應(yīng)用_第1頁(yè)
第1頁(yè) / 共76頁(yè)
鉤子程序應(yīng)用_第2頁(yè)
第2頁(yè) / 共76頁(yè)
鉤子程序應(yīng)用_第3頁(yè)
第3頁(yè) / 共76頁(yè)

下載文檔到電腦,查找使用更方便

15 積分

下載資源

還剩頁(yè)未讀,繼續(xù)閱讀

資源描述:

《鉤子程序應(yīng)用》由會(huì)員分享,可在線閱讀,更多相關(guān)《鉤子程序應(yīng)用(76頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。

1、Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,Click to edit Master title style,For: ,分類(lèi)信息,From: ,新聞,Windows,系統(tǒng)編程實(shí)用教程,授課教師:,職務(wù):,第,11,章,Windows,鉤子編程,課程描述,Windows,應(yīng)用程序是基于消息機(jī)制的。用戶在執(zhí)行各種操作時(shí)都會(huì)觸發(fā)相應(yīng)的消息,這些消息就像戰(zhàn)爭(zhēng)時(shí)期各方發(fā)送的電報(bào),如果能截獲敵方的電報(bào),則無(wú)疑會(huì)在戰(zhàn)場(chǎng)上取得先機(jī)。鉤子就是這樣一種機(jī)制,它可以在系統(tǒng)消息到達(dá)目標(biāo)窗口之前將

2、其截獲,并可以為指定類(lèi)型的消息指定一個(gè)消息處理函數(shù)。有了這種機(jī)制,就不難理解殺毒軟件是如何在用戶打開(kāi)一個(gè)文件之前就提前知道,并對(duì)其進(jìn)行掃描的;有些翻譯軟件又是如何知道用戶鼠標(biāo)停留位置的文字的。,本章知識(shí)點(diǎn),11.1,鉤子的概念和工作原理,11.2,安裝和卸載鉤子,11.3,鍵盤(pán)鉤子的例子,11.4 HOOK API,技術(shù),11.5,進(jìn)程保護(hù)器實(shí)例,11.6,改進(jìn)進(jìn)程保護(hù)器實(shí)例,11.1,鉤子的概念和工作原理,11.1.1,什么是鉤子,11.1.2,鉤子的類(lèi)型,11.1.1,什么是鉤子,鉤子是,Windows,中可以攔截事件的一種機(jī)制??梢灾付ㄒ粋€(gè)函數(shù)作為特定類(lèi)型的被攔截事件的鉤子過(guò)程。鉤子過(guò)程

3、可以對(duì)攔截的每個(gè)事件進(jìn)行處理。,1鉤子鏈,2鉤子,過(guò)程,1,鉤子鏈,Windows,支持許多不同類(lèi)型的鉤子,不同類(lèi)型的鉤子可以為消息處理機(jī)制的不同方面提供訪問(wèn)。例如,使用,WH_MOUSE,鉤子可以監(jiān)視與鼠標(biāo)操作相關(guān)的消息。系統(tǒng)為每個(gè)類(lèi)型的鉤子維護(hù)一個(gè)獨(dú)立的鉤子鏈,其中包含指向一組作為鉤子過(guò)程的回調(diào)函數(shù)的指針。當(dāng)與指定類(lèi)型的鉤子相關(guān)聯(lián)的消息發(fā)生時(shí),系統(tǒng)會(huì)把消息傳送給鉤子鏈中的相關(guān)鉤子過(guò)程。,2,鉤子,過(guò)程,正如前面介紹的鉤子過(guò)程是一個(gè)用戶自定義函數(shù),用于處理攔截的消息。鉤子過(guò)程必須按以下的語(yǔ)法格式設(shè)計(jì):,LRESULT CALLBACK HookProc(,int nCode,WPARAM w

4、Param,LPARAM lParam,),/,下面處理事件,.,return CallNextHookEx(NULL, nCode, wParam, lParam);,HookProc,是鉤子過(guò)程的名稱(chēng)。,子過(guò)程的參數(shù)說(shuō)明,nCode,,是鉤子過(guò)程用于決定采取什么動(dòng)作的鉤子編碼,它取決于鉤子的類(lèi)型。不同類(lèi)型的鉤子都有相對(duì)應(yīng)的一組鉤子編碼。,wParam,和,lParam,,通常包含鉤子所攔截的消息的信息,具體內(nèi)容取決于鉤子編碼。,CallNextHookEx(),函數(shù),CallNextHookEx(),函數(shù)用于將鉤子信息傳送給下一個(gè)鉤子過(guò)程,一般在鉤子過(guò)程里調(diào)用,CallNextHookEx

5、(),函數(shù)。,CallNextHookEx(),函數(shù)的原型如下:,LRESULTCallNextHookEx(,HHOOKhhk,/,當(dāng)前鉤子的句柄,intnCode,/,鉤子編碼,下一個(gè)鉤子過(guò)程通過(guò)該編碼決定如何處理鉤子信息,WPARAMwParam,/,但錢(qián)鉤子過(guò)程接收到的,wParam,參數(shù)值,具體內(nèi)容取決于鉤子編碼。,LPARAMlParam/,但錢(qián)鉤子過(guò)程接收到的,wParam,參數(shù)值,具體內(nèi)容取決于鉤子編碼。,);,全局鉤子和特定線程鉤子,鉤子可以分為全局鉤子和特定線程鉤子兩種,全局鉤子可以監(jiān)視與調(diào)用線程位于同一桌面的所有線程的消息;而特定線程鉤子則只能監(jiān)視一個(gè)單獨(dú)線程的消息。,特

6、定線程鉤子的鉤子過(guò)程可以在應(yīng)用程序的任何位置,而全局鉤子的鉤子過(guò)程則只能在,DLL,中定義。因?yàn)槿帚^子可以攔截其他應(yīng)用程序的消息,然后調(diào)用鉤子過(guò)程對(duì)攔截的消息進(jìn)行處理。因?yàn)槊總€(gè)進(jìn)程都有自己的私有內(nèi)存空間,所以一個(gè)進(jìn)程不能調(diào)用其他進(jìn)程的代碼,也不能訪問(wèn)其他進(jìn)程的內(nèi)存數(shù)據(jù)。這樣如果在安裝鉤子的進(jìn)程中定義鉤子過(guò)程,則其他正在運(yùn)行的進(jìn)程被攔截消息后,就不能成功調(diào)用鉤子過(guò)程了。,因?yàn)?DLL,中定義的代碼可以被不同的進(jìn)程調(diào)用,安裝鉤子的進(jìn)程可以將,DLL,的函數(shù)指定為鉤子過(guò)程, 其他進(jìn)程也可以在其消息被攔截后,調(diào)用,DLL,中定義的鉤子過(guò)程。,鉤子的工作原理,11.1.2,鉤子的類(lèi)型,1,WH_CAL

7、LWNDPROC 和 WH_CALLWNDPROCRET,2,WH_CBT,3WH_DEBUG,4GWH_FOREGROUNDIDLE,5WH_GETMESSAGE,6,WH_JOURNALRECORD,7WH_JOURNALPLAYBACK,8WH_KEYBOARD_LL,9WH_KEYBOARD,10WH_MOUSE_LL和WH_MOUSE,11WH_MSGFILTER 和,WH_SYSMSGFILTER,12WH_SHELL,11.2,安裝和卸載鉤子,11.2.1,安裝鉤子,11.2.2,卸載鉤子,11.2.1,安裝鉤子,調(diào)用,SetWindowsHookEx(),函數(shù)可以安裝鉤子,函數(shù)

8、原型如下:,HHOOKSetWindowsHookEx(,intidHook,/,鉤子的類(lèi)型,可以是,11.3.2,中介紹的確鉤子類(lèi)型之一,HOOKPROClpfn,/,指定鉤子過(guò)程的地址,HINSTANCEhMod,/,指定包含鉤子過(guò)程的,DLL,句柄。,DWORDdwThreadId/,指定與鉤子過(guò)程相關(guān)的線程標(biāo)識(shí)符,如果是全局鉤子,則設(shè)置為,0,);,如果函數(shù)執(zhí)行成功,則返回鉤子的句柄;否則返回,NULL,。,VirtualQuery(),函數(shù),在,SetWindowsHookEx(),函數(shù)中需要指定包含鉤子過(guò)程的,DLL,句柄,在,DLL,項(xiàng)目中可以調(diào)用,VirtualQuery(),

9、函數(shù)來(lái)獲取,DLL,句柄,函數(shù)原型如下:,SIZE_T WINAPI VirtualQuery(,_in LPCVOID,lpAddress,_out PMEMORY_BASIC_INFORMATION,lpBuffer,_in SIZE_T,dwLength,);,PMEMORY_BASIC_INFORMATION,結(jié)構(gòu)體,typedef struct _MEMORY_BASIC_INFORMATION ,PVOID BaseAddress;/,頁(yè)區(qū)域的基地址,PVOID AllocationBase;/,由,VirtualAlloc(),函數(shù)分配的頁(yè)區(qū)域的基地址,DWORD Allocat

10、ionProtect;/,頁(yè)區(qū)域在初始分配時(shí)指定的保護(hù)選項(xiàng),SIZE_T RegionSize;/,頁(yè)區(qū)域的大小,單位為字節(jié),DWORD State;/,區(qū)域中頁(yè)的狀態(tài),DWORD Protect; /,區(qū)域中頁(yè)的訪問(wèn)保護(hù)模式,DWORD Type; /,區(qū)域中頁(yè)的類(lèi)型, MEMORY_BASIC_INFORMATION,*PMEMORY_BASIC_INFORMATION;,自定義函數(shù),ModuleFromAddress(),HMODULE ModuleFromAddress(PVOID pv),MEMORY_BASIC_INFORMATION mbi;,return :VirtualQue

11、ry(pv, ,11.2.2,卸載鉤子,如果不需要再使用鉤子,應(yīng)及時(shí)將其卸載,以免影響系統(tǒng)的效率。調(diào)用,UnhookWindowsHookEx(),函數(shù)可以卸載鉤子,函數(shù)原型如下:,BOOL WINAPI UnhookWindowsHookEx(,_inHHOOK hhk/,要卸載的鉤子句柄,由,之,前調(diào)用,SetWindowsHookEx(),函數(shù)得到,);,11.3,鍵盤(pán)鉤子的例子,11.3.1,設(shè)計(jì),DLL,項(xiàng)目,11.3.2,設(shè)計(jì),EXE,項(xiàng)目,11.3.1,設(shè)計(jì),DLL,項(xiàng)目,參照第,10,章中介紹的方法創(chuàng)建,DLL,項(xiàng)目,KeyHook,, 在該,DLL,中,需要導(dǎo)出如下函數(shù):,D

12、llExport LRESULT CALLBACK KeyBoardProc(int nCode,WPARAM wParam, LPARAM lParam );,DllExport void InstallHook(int nCode);,DllExport void EndHook(void);,1鉤子過(guò)程KeyBoardProc,DllExport LRESULT CALLBACK KeyBoardProc(int nCode,WPARAM wParam, LPARAM lParam ),char szKeyName80;,FILE *fp;,if(lParam&0x80000000),/

13、j = wParam;,fp=fopen(c:key.txt,a);,:GetKeyNameText(lParam, szKeyName, 80);,if(strlen(szKeyName) 1),fprintf(fp,【,%s,】,szKeyName);,else,fprintf(fp,%s,szKeyName);,fclose(fp);,return CallNextHookEx(oldkeyhook,nCode,wParam,lParam);,GetKeyNameText(),函數(shù),intGetKeyNameText(,LONGlParam,/,指定鍵盤(pán)消息的第,2,個(gè)參數(shù),LPTSTR

14、lpString,/,得到的按鍵名字字符串緩沖區(qū),intnSize/ lpString,所指定的字符串緩沖區(qū)的長(zhǎng)度,);,2安裝鉤子的函數(shù)InstallHook,void InstallHook(int nCode),hInst = ModuleFromAddress(KeyBoardProc);,oldkeyhook = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyBoardProc,hInst,0);,3卸載鉤子的函數(shù)EndHook,在其他應(yīng)用程序中調(diào)用,EndHook(),函數(shù)可以卸載本例用于監(jiān)視鍵盤(pán)操作的鉤子,,EndHook(),函數(shù)的代碼如下

15、:,void EndHook(void),UnhookWindowsHookEx(oldkeyhook);,11.3.2,設(shè)計(jì),EXE,項(xiàng)目,創(chuàng)建一個(gè)基于對(duì)話框的,MFC,項(xiàng)目,InstallHook,。為了引用,KeyHook.lib,中定義的導(dǎo)出函數(shù),在項(xiàng)目中添加一個(gè)頭文件,KeyHook.h,,代碼如下:,#define DllImport externC_declspec(dllimport),DllImport void InstallHook(int nCode);,DllImport LRESULT CALLBACK KeyBoardProc (int nCode,WPARAM

16、wParam, LPARAM lParam );,DllImport void EndHook(void);,在項(xiàng)目中引用,KeyHook.lib,CInstallhookDlg:OnInitDialog(),啟動(dòng)對(duì)話框時(shí),應(yīng)安裝和加載鍵盤(pán)鉤子,代碼如下:,BOOL CInstallhookDlg:OnInitDialog(),CDialog:OnInitDialog();,/,以下省略缺省生成的代碼,/ TODO:,在此添加額外的初始化代碼,InstallHook(TRUE);/,安裝鍵盤(pán)鉤子,return TRUE; /,除非將焦點(diǎn)設(shè)置到控件,否則返回,TRUE,CInstallhookD

17、lg:OnClose(),關(guān)閉對(duì)話框時(shí),應(yīng)卸載鍵盤(pán)鉤子,代碼如下:,void CInstallhookDlg:OnClose(),EndHook();,CDialog:OnClose();,提示,在生成,InstallHook,項(xiàng)目之前,應(yīng)把,KeyHook.lib,復(fù)制到項(xiàng)目目錄下。在運(yùn)行,InstallHook,項(xiàng)目之前應(yīng)把,KeyHook.dll,復(fù)制到,InstallHook.exe,所在的目錄。,查看,C: key.txt,中記錄的按鍵信息,運(yùn)行,InstallHook.exe,,然后打開(kāi)一個(gè),word,文檔,隨便輸入一些字符,然后打開(kāi),C: key.txt,,查看記錄的按鍵信息,如

18、圖,11.3,所示。,安裝鉤子的程序會(huì)被安全軟件發(fā)現(xiàn)并警告,很多木馬程序利用鉤子竊取用戶的信息,因此,如果計(jì)算機(jī)上安裝了安全軟件,則為可能彈出如圖,11.3,所示的提示窗口。如果想測(cè)試實(shí)例的運(yùn)行效果,請(qǐng)選擇“允許”。不要利用本實(shí)例竊取其他用戶的信息。,11.4 HOOK API,技術(shù),11.4.1,實(shí)現(xiàn)原理,11.4.2,封裝,CAPIHook,類(lèi),11.4.1,實(shí)現(xiàn)原理,要想攔截,Windows API,,就要首先了解,Windows,調(diào)用,API,的基本過(guò)程。,WindowsAPI,都是在,Kernel32.dll,、,User32.dll,和,advapi32.dll,等系統(tǒng)模塊中實(shí)現(xiàn)的

19、,應(yīng)用程序在調(diào)用,Windows API,之前,首先要導(dǎo)入它們。,Windows,可執(zhí)行文件采用的最常見(jiàn)格式是,PE,格式,。,_IMAGE_NT_HEADERS,結(jié)構(gòu)體,PE,文件由,MS-DOS,頭、,NT,頭、節(jié)(,section,)頭和節(jié)(,section,)映像,4,個(gè)部分組成。可以使用,_IMAGE_NT_HEADERS,結(jié)構(gòu)體來(lái)描述,NT,頭,其定義代碼如下:,typedef struct _IMAGE_NT_HEADERS ,DWORD Signature;/,IMAGE_FILE_HEADER FileHeader;,IMAGE_OPTIONAL_HEADER Optiona

20、lHeader;, IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS;,IMAGE_FILE_HEADER,結(jié)構(gòu)體,typedef struct _IMAGE_FILE_HEADER ,WORD Machine;/,計(jì)算機(jī)的體系結(jié)構(gòu),WORD NumberOfSections;/,節(jié)(,section,)的數(shù)量,DWORD TimeDateStamp;/,映像的時(shí)間戳的低,32,位,DWORD PointerToSymbolTable;/,符號(hào)表的偏移量,DWORD NumberOfSymbols;/,符號(hào)表中的符號(hào)數(shù)量,WORD SizeOfOptionalHeade

21、r; /,選項(xiàng)頭的大小,單位為字節(jié),WORD Characteristics;/,映像的特性, IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;,IMAGE_OPTIONAL_HEADER,結(jié)構(gòu)體,typedef struct _IMAGE_OPTIONAL_HEADER ,WORD Magic;/,映像文件的狀態(tài),BYTE MajorLinkerVersion;/,鏈接器的主版本,BYTE MinorLinkerVersion;/,鏈接器的小版本,DWORD SizeOfCode;/,代碼節(jié)的大小,單位為字節(jié),DWORD SizeOfInitializedDat

22、a;/,初始數(shù)據(jù)節(jié)的大小,單位為字節(jié),DWORD SizeOfUninitializedData; /,未初始數(shù)據(jù)節(jié)的大小,單位為字節(jié),DWORD AddressOfEntryPoint;/,入口點(diǎn)函數(shù)的地址。對(duì)于,DLL,文件入口點(diǎn)函數(shù)是可選的,DWORD BaseOfCode;/,只想代碼節(jié)開(kāi)始的指針,DWORD BaseOfData; /,只想數(shù)據(jù)節(jié)開(kāi)始的指針,DWORD ImageBase;/,當(dāng)映像被加載到內(nèi)存中的時(shí)候,第,1,個(gè)字節(jié)的地址,DWORD SectionAlignment;/,加載到內(nèi)存中的節(jié)的對(duì)齊方式,DWORD FileAlignment;/,映像文件中的節(jié)的裸數(shù)據(jù)

23、的對(duì)齊方式,接上,WORD MajorOperatingSystemVersion;/,需要的操作系統(tǒng)的主版本號(hào),WORD MinorOperatingSystemVersion;/,需要的操作系統(tǒng)的小版本號(hào),WORD MajorImageVersion;/,映像的主版本,WORD MinorImageVersion;/,映像的小版本,WORD MajorSubsystemVersion; /,子系統(tǒng)的主版本,WORD MinorSubsystemVersion; /,子系統(tǒng)的小版本,DWORD Win32VersionValue;/,保留,必須為,0,DWORD SizeOfImage;/,

24、映像的大小包含所有的頭,單位為字節(jié),DWORD SizeOfHeaders;/,文件頭的大小,單位為字節(jié),DWORD CheckSum;/,映像文件的校驗(yàn)和,WORD Subsystem;/,運(yùn)行映像文件的子系統(tǒng),WORD DllCharacteristics;/,映像文件的,DLL,特性,DWORD SizeOfStackReserve;/,保留的棧的大小,DWORD SizeOfStackCommit;/,提交到棧的數(shù)據(jù)大小,接上,DWORD SizeOfHeapReserve;/,保留的堆的大小,DWORD SizeOfHeapCommit;/,提交到堆的數(shù)據(jù)大小,DWORD Loade

25、rFlags;/,此成員已經(jīng)廢棄,DWORD NumberOfRvaAndSizes;/,選項(xiàng)頭中的目錄條目的數(shù)量,IMAGE_DATA_DIRECTORY DataDirectoryIMAGE_NUMBEROF_DIRECTORY_ENTRIES;/,選項(xiàng)頭中的數(shù)據(jù)目錄, IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;,結(jié)構(gòu)體,IMAGE_DATA_DIRECTORY,typedef struct _IMAGE_DATA_DIRECTORY ,DWORD VirtualAddress;/,表的虛擬地址,DWORD Size;/,表的大小, IM

26、AGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;,winnt.h,中定義了個(gè)各種信息表在數(shù)據(jù)目錄數(shù)組中的索引,/ Directory Entries,#define IMAGE_DIRECTORY_ENTRY_EXPORT 0 / Export Directory,#define IMAGE_DIRECTORY_ENTRY_IMPORT 1 / Import Directory,#define IMAGE_DIRECTORY_ENTRY_RESOURCE 2 / Resource Directory,#define IMAGE_DIRECTORY_ENTR

27、Y_BASERELOC 5 / Base Relocation Table,#define IMAGE_DIRECTORY_ENTRY_DEBUG 6 / Debug Directory,#define IMAGE_DIRECTORY_ENTRY_TLS 9 / TLS Directory,導(dǎo)入表結(jié)構(gòu)的示意圖,11.4.2,封裝,CAPIHook,類(lèi),1CAPIHook類(lèi)的成員變量,2CAPIHook類(lèi)的構(gòu)造函數(shù),3替換一個(gè)模塊的導(dǎo)入地址表,4掛鉤所有模塊,5防止動(dòng)態(tài)加載模塊,1CAPIHook類(lèi)的成員變量,private:,LPSTR m_pszModName; /,導(dǎo)出要,HOOK,函數(shù)的

28、模塊的名字,LPSTR m_pszFuncName; /,要,HOOK,的函數(shù)的名字,PROC m_pfnOrig; /,原,API,函數(shù)地址,PROC m_pfnHook; / HOOK,后函數(shù)的地址,BOOL m_bExcludeAPIHookMod; /,是否將,HOOK API,的模塊排除在外,一個(gè),CAPIHook,對(duì)象只能掛鉤一個(gè),Windows API,。為了能同時(shí)對(duì)多個(gè),Windows API,進(jìn)行掛鉤,,CAPIHook,類(lèi)中使用靜態(tài)變量定義了一個(gè),CAPIHook,對(duì)象的鏈表,代碼如下:,/,這兩個(gè)指針用來(lái)將所有的,CAPIHook,對(duì)象連在一起,static CAPIHo

29、ok *sm_pHeader; /,指向鏈表頭元素,CAPIHook *m_pNext; /,指向鏈表中下一個(gè)元素,2CAPIHook類(lèi)的構(gòu)造函數(shù),CAPIHook:CAPIHook(LPSTR pszModName, LPSTR pszFuncName, PROC pfnHook, BOOL bExcludeAPIHookMod),/,保存這個(gè),Hook,函數(shù)的信息,m_bExcludeAPIHookMod = bExcludeAPIHookMod;,m_pszModName = pszModName;,m_pszFuncName = pszFuncName;,m_pfnHook = pfn

30、Hook;,m_pfnOrig = :GetProcAddress(:GetModuleHandle(pszModName), pszFuncName);,/,將此對(duì)象添加到鏈表中,m_pNext = sm_pHeader;,sm_pHeader = this;,/,在所有當(dāng)前已加載的模塊中,HOOK,這個(gè)函數(shù),ReplaceIATEntryInAllMods(m_pszModName, m_pfnOrig, m_pfnHook, bExcludeAPIHookMod);,3替換一個(gè)模塊的導(dǎo)入地址表,CAPIHook:ReplaceIATEntryInOneMod(),函數(shù)可以實(shí)現(xiàn)此功能,代碼

31、如下:,void CAPIHook:ReplaceIATEntryInOneMod(LPSTR pszExportMod,PROC pfnCurrent, PROC pfnNew, HMODULE hModCaller),/,取得模塊的導(dǎo)入表(,import descriptor,)首地址。,/ ImageDirectoryEntryToData,函數(shù)可以直接返回導(dǎo)入表地址,ULONG ulSize;,PIMAGE_IMPORT_DESCRIPTOR pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR),:ImageDirectoryEntryToData(hMod

32、Caller, TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT, ,if(pImportDesc = NULL) /,這個(gè)模塊沒(méi)有導(dǎo)入節(jié)表,return;,接上,/,查找包含,pszExportMod,模塊中函數(shù)導(dǎo)入信息的導(dǎo)入表項(xiàng),while(pImportDesc-Name != 0),LPSTR pszMod = (LPSTR)(DWORD)hModCaller + pImportDesc-Name);,if(lstrcmpiA(pszMod, pszExportMod) = 0) /,找到,break;,pImportDesc+;,if(pImportDesc-Nam

33、e = 0) / hModCaller,模塊沒(méi)有從,pszExportMod,模塊導(dǎo)入任何函數(shù),return;,接上,/,取得調(diào)用者的導(dǎo)入地址表(,import address table, IAT,),PIMAGE_THUNK_DATA pThunk = (PIMAGE_THUNK_DATA)(pImportDesc-FirstThunk + (DWORD)hModCaller);,/,查找我們要,HOOK,的函數(shù),將它的地址用新函數(shù)的地址替換掉,while(pThunk-u1.Function),/ lpAddr,指向的內(nèi)存保存了函數(shù)的地址,PDWORD lpAddr = (PDWORD)

34、,if(*lpAddr = (DWORD)pfnCurrent),接上,/,修改頁(yè)的保護(hù)屬性,DWORD dwOldProtect;,MEMORY_BASIC_INFORMATION mbi;,/:VirtualQuery(lpAddr, ,/:VirtualProtect(lpAddr, sizeof(DWORD), PAGE_READWRITE, ,/,修改內(nèi)存地址 相當(dāng)于,“*lpAddr = (DWORD)pfnNew;”,:WriteProcessMemory(:GetCurrentProcess(),lpAddr, ,/:VirtualProtect(lpAddr, sizeof(

35、DWORD), dwOldProtect, 0);,break;,pThunk+;,ImageDirectoryEntryToData(),函數(shù),調(diào)用,ImageDirectoryEntryToData(),函數(shù)可以獲取對(duì)映像指定的數(shù)據(jù)的訪問(wèn),這里使用它來(lái)獲取導(dǎo)入表的地址。函數(shù)原型如下:,PVOID WINAPI ImageDirectoryEntryToData(,_in PVOID Base,_in BOOLEAN MappedAsImage,_in USHORT DirectoryEntry,_out PULONG Size,);,4掛鉤所有模塊,要掛鉤一個(gè)進(jìn)程對(duì)一個(gè)Windows AP

36、I的調(diào)用,不但要修改其主模塊的導(dǎo)入地址表,而且要遍歷進(jìn)程的所有模塊。,CAPIHook: ReplaceIATEntryInAllMods()函數(shù)可以實(shí)現(xiàn)此功能,代碼如下:,void CAPIHook:ReplaceIATEntryInAllMods(LPSTR pszExportMod,PROC pfnCurrent, PROC pfnNew, BOOL bExcludeAPIHookMod),/,取得當(dāng)前模塊的句柄,HMODULE hModThis = NULL;,if(bExcludeAPIHookMod),MEMORY_BASIC_INFORMATION mbi;,if(:Virtua

37、lQuery(ReplaceIATEntryInAllMods, &mbi, sizeof(mbi) != 0),hModThis = (HMODULE)mbi.AllocationBase;,接上,/,取得本進(jìn)程的模塊列表,HANDLE hSnap = :CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, :GetCurrentProcessId();,/,遍歷所有模塊,分別對(duì)它們調(diào)用,ReplaceIATEntryInOneMod,函數(shù),修改導(dǎo)入地址表,MODULEENTRY32 me = sizeof(MODULEENTRY32) ;,BOOL bOK

38、 = :Module32First(hSnap, ,while(bOK),/,注意:我們不,HOOK,當(dāng)前模塊的函數(shù),if(me.hModule != hModThis),ReplaceIATEntryInOneMod(pszExportMod, pfnCurrent, pfnNew, me.hModule);,bOK = :Module32Next(hSnap, ,:CloseHandle(hSnap);,5防止動(dòng)態(tài)加載模塊,在進(jìn)程中還可能會(huì)調(diào)用,LoadLIbrary(),函數(shù)動(dòng)態(tài)加載模塊,如果動(dòng)態(tài)加載的模塊中包含要掛鉤的,Windows API,那么就也要替換其地址。,CAPIHook:

39、 HookNewlyLoadedModule (),函數(shù)可以實(shí)現(xiàn)此功能,代碼如下:,void WINAPI CAPIHook:HookNewlyLoadedModule(HMODULE hModule, DWORD dwFlags),/,如果一個(gè)新的模塊被加載,掛鉤各,CAPIHook,對(duì)象要求的,API,函數(shù),if(hModule != NULL) & (dwFlags&LOAD_LIBRARY_AS_DATAFILE) = 0),CAPIHook *p = sm_pHeader;,while(p != NULL),ReplaceIATEntryInOneMod(p-m_pszModName

40、, p-m_pfnOrig, p-m_pfnHook, hModule);,p = p-m_pNext;,5防止動(dòng)態(tài)加載模塊,應(yīng)用程序都是調(diào)用LoadLibraryA()函數(shù)、LoadLibraryW()函數(shù)、LoadLibraryExA()函數(shù)或LoadLibraryExW()函數(shù)來(lái)動(dòng)態(tài)加載模塊的,然后調(diào)用,GetProcAddress(),函數(shù)返回,API,函數(shù)的地址。如果掛鉤了這,4,個(gè),API,,就可以在應(yīng)用程序動(dòng)態(tài)加載模塊時(shí)替換其中包含的要掛鉤的,Windows API,的地址。為了掛鉤上面提到的,4,個(gè),API,,在,CAPIHook,類(lèi)中定義了下面,4,個(gè)靜態(tài)變量:,static

41、 CAPIHook sm_LoadLibraryA;,static CAPIHook sm_LoadLibraryW;,static CAPIHook sm_LoadLibraryExA;,static CAPIHook sm_LoadLibraryExW;,static CAPIHook sm_GetProcAddress;,構(gòu)造,前面,4,個(gè)靜態(tài)變量的代碼,CAPIHook CAPIHook:sm_LoadLibraryA(Kernel32.dll, LoadLibraryA,(PROC)CAPIHook:LoadLibraryA, TRUE);,CAPIHook CAPIHook:sm_

42、LoadLibraryW(Kernel32.dll, LoadLibraryW,(PROC)CAPIHook:LoadLibraryW, TRUE);,CAPIHook CAPIHook:sm_LoadLibraryExA(Kernel32.dll, LoadLibraryExA,(PROC)CAPIHook:LoadLibraryExA, TRUE);,CAPIHook CAPIHook:sm_LoadLibraryExW(Kernel32.dll, LoadLibraryExW,(PROC)CAPIHook:LoadLibraryExW, TRUE);,CAPIHook CAPIHook:

43、sm_GetProcAddress(Kernel32.dll, GetProcAddress,(PROC)CAPIHook:GetProcAddress, TRUE);,CAPIHook:LoadLibraryA(),函數(shù),HMODULE WINAPI CAPIHook:LoadLibraryA(PCSTR pszModulePath),HMODULE hModule = :LoadLibraryA(pszModulePath);,HookNewlyLoadedModule(hModule, 0);,return(hModule);,CAPIHook: GetProcAddress (),函數(shù)

44、,FARPROC WINAPI CAPIHook:GetProcAddress(HMODULE hModule, PCSTR pszProcName),/,得到這個(gè)函數(shù)的真實(shí)地址,FARPROC pfn = :GetProcAddress(hModule, pszProcName);,/,看它是不是我們要,hook,的函數(shù),CAPIHook *p = sm_pHeader;,while(p != NULL),if(p-m_pfnOrig = pfn),pfn = p-m_pfnHook;,break;,p = p-m_pNext;,return pfn;,11.5,進(jìn)程保護(hù)器實(shí)例,在應(yīng)用程序中

45、調(diào)用,TerminateProcess(),函數(shù)可以結(jié)束指定的進(jìn)程。如果不允許以這種“暴力”手段結(jié)束進(jìn)程,就可以掛鉤,TerminateProcess(),函數(shù),達(dá)到禁用,TerminateProcess(),函數(shù)的目的。本屆介紹一個(gè)進(jìn)程保護(hù)器實(shí)例的設(shè)計(jì)和實(shí)現(xiàn)過(guò)程。,11.5.1,設(shè)計(jì),DLL,項(xiàng)目,參照第,10,章中介紹的方法創(chuàng)建,DLL,項(xiàng)目,HookTerminateProcess,, 在該項(xiàng)目中添加,11.4.2,小節(jié)中介紹的,CAPIHook,類(lèi),并聲明一個(gè)用于掛鉤,TerminateProcess(),函數(shù)的,CAPIHook,對(duì)象,g_TerminateProcess,,代碼如下

46、:,CAPIHook g_TerminateProcess(kernel32.dll, TerminateProcess, (PROC)Hook_TerminateProcess );,鉤子函數(shù),參照,11.4.2,小節(jié)中介紹的,CAPIHook,類(lèi)的構(gòu)造函數(shù),可以知道,g_TerminateProcess,對(duì)象是用來(lái)掛鉤,kernel32.dll,中的,TerminateProcess(),函數(shù)的。鉤子函數(shù)為,Hook_TerminateProcess,,其代碼如下:,bool WINAPI Hook_TerminateProcess(HANDLE hProcess, UINT nExitC

47、ode),/typedef bool (WINAPI *PFNTERMINATEPROCESS)(HANDLE, UINT);,char szPathName256;,:GetModuleFileName(NULL, szPathName, 256);,char sz2048;,wsprintf(sz, ,進(jìn)程號(hào),:%d %s,進(jìn)程句柄,: %X,退出代碼,: %dn, :GetCurrentProcess(), szPathName, hProcess, nExitCode);,MessageBox(NULL, ,不允許殺掉進(jìn)程, ,提示, 0);,FILE *fp;,fp=fopen(c:

48、terminateProcess.txt,a);,fprintf(fp,%s,sz);,/return (PFNTERMINATEPROCESS)(PROC)g_TerminateProcess)(hProcess, nExitCode);,return true;,TerminateProcess(),函數(shù)的原型,BOOL TerminateProcess(,HANDLE hProcess, /,要結(jié)束的進(jìn)程句柄,DWORD uExitCode/,進(jìn)程的結(jié)束代碼,);,Hook_TerminateProcess(),函數(shù)做了下面兩件事:,(,1,)將要被結(jié)束的進(jìn)程信息保存在,c:termin

49、ateProcess.txt,中;,(,2,)彈出一個(gè)提示“不允許殺掉進(jìn)程”的消息框。,SetSysHook(),函數(shù),SetSysHook(),函數(shù)用于安裝和卸載鉤子,代碼如下:,int SetSysHook(bool bInstall, DWORD dwThreadId),bool bOk;,if(bInstall),g_hHook = :SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, ModuleFromAddress(GetMsgProc), dwThreadId);,bOk = (g_hHook != NULL);,else,bOk = :Un

50、hookWindowsHookEx(g_hHook);,g_hHook = NULL;,return bOk;,11.5.2,設(shè)計(jì)進(jìn)程保護(hù)器的,EXE,項(xiàng)目,創(chuàng)建一個(gè)基于對(duì)話框的,MFC,項(xiàng)目,ProcessProtector,。啟動(dòng)對(duì)話框時(shí),應(yīng)安裝和加載鉤子,代碼如下:,BOOL CProcessProtectorDlg:OnInitDialog(),CDialog:OnInitDialog();,/,省略缺省生成的代碼,char szDll = .HookTerminateProcess.dll; /,引用的,DLL,說(shuō)文件名,hModule = :GetModuleHandle(szDl

51、l); /,獲取,DLL,文件的模塊地址,if(hModule = NULL),hModule = :LoadLibrary(szDll);/,加載,DLL,文件,nNeedFree = true;/,標(biāo)識(shí)退出時(shí)應(yīng)釋放,DLL,句柄,if(hModule = NULL),return TRUE;,/,獲取,SetSysHook(),函數(shù)的指針,mSetSysHook = (PFNSETSYSHOOK)GetProcAddress(hModule, SetSysHook);,接上,if(mSetSysHook = NULL),if(nNeedFree),:FreeLibrary(hModule)

52、;,return TRUE;,bool bRet = mSetSysHook(TRUE, 0); /,安裝鉤子,/SetSysHook(TRUE, 0);,return TRUE; /,除非將焦點(diǎn)設(shè)置到控件,否則返回,TRUE,運(yùn)行程序,在運(yùn)行,ProcessProtector,項(xiàng)目之前應(yīng)把,HookTerminateProcess.dll,復(fù)制到,ProcessProtector.exe,所在的目錄。,打開(kāi)“任務(wù)管理器”,結(jié)束一個(gè)無(wú)關(guān)緊要的進(jìn)程,會(huì)彈出如圖,11.7,所示提示消息框,確認(rèn)進(jìn)程沒(méi)有被結(jié)束。,提示,很多木馬程序利用鉤子危害計(jì)算機(jī)的安全,因此,如果計(jì)算機(jī)上安裝了安全軟件,則為可能彈

53、出如圖,11.8,所示的提示窗口。如果想測(cè)試的運(yùn)行效果,請(qǐng)選擇“允許”。,11.6,改進(jìn)進(jìn)程保護(hù)器實(shí)例,11.5,節(jié)中介紹了通過(guò)掛鉤,TerminateProcess(),函數(shù)保護(hù)進(jìn)程的方法。但是,這種方法不能對(duì)保護(hù)的進(jìn)程進(jìn)行區(qū)分,只能保護(hù)所有進(jìn)程。在實(shí)際應(yīng)用中,經(jīng)常需要保護(hù)指定的進(jìn)程,而允許用戶結(jié)束其他進(jìn)程。本節(jié)就介紹一個(gè)改進(jìn)的進(jìn)程保護(hù)器實(shí)例,可以保護(hù)用戶指定的進(jìn)程。,11.6.1,設(shè)計(jì),DLL,項(xiàng)目,TerminateProcess(),函數(shù)是根據(jù)進(jìn)程句柄來(lái)結(jié)束進(jìn)程的。但是根據(jù)進(jìn)程句柄無(wú)法獲取進(jìn)程的詳細(xì)信息,例如,PID,和進(jìn)程名。也就是說(shuō)在鉤子函數(shù)中不能根據(jù)攔截到的,TerminateP

54、rocess(),函數(shù)的,hProcess,參數(shù)獲取進(jìn)程的詳細(xì)信息,無(wú)從知道要結(jié)束的是哪個(gè)進(jìn)程,因此無(wú)法對(duì)特定進(jìn)程做特殊處理。,那是不是就沒(méi)有辦法了呢?反過(guò)來(lái)想一想,在調(diào)用,TerminateProcess(),函數(shù)是使用的進(jìn)程句柄是怎么來(lái)的。是通過(guò)調(diào)用,OpenProcess(),函數(shù)獲得的,。,OpenProcess(),函數(shù),HANDLE OpenProcess(,DWORD fdwAccess,/,不支持,使用,0,BOOL fInherit, /,不支持,使用,FALSE,DWORD IDProcess /,要打開(kāi)的進(jìn)程,ID,);,創(chuàng)建,DLL,項(xiàng)目,參照第,10,章中介紹的方法創(chuàng)

55、建,DLL,項(xiàng)目,HookOpenProcess,, 在該項(xiàng)目中添加,11.4.2,小節(jié)中介紹的,CAPIHook,類(lèi),并聲明一個(gè)用于掛鉤,OpenProcess(),函數(shù)的,CAPIHook,對(duì)象,g_OpenProcess,,代碼如下:,CAPIHook g_OpenProcess(kernel32.dll, OpenProcess, (PROC)Hook_OpenProcess );,鉤子函數(shù),參照,11.4.2,小節(jié)中介紹的,CAPIHook,類(lèi)的構(gòu)造函數(shù),可以知道,g_OpenProcess,對(duì)象是用來(lái)掛鉤,kernel32.dll,中的,OpenProcess(),函數(shù)的。鉤子函數(shù)

56、為,Hook_OpenProcess,,其代碼如下:,HANDLE WINAPI Hook_OpenProcess(DWORD fdwAccess, BOOL fInherit, DWORD IDProcess),typedef HANDLE (WINAPI *POPENPROCESS)(DWORD, BOOL, DWORD);,if(isProtected(IDProcess) ,return NULL;,return (POPENPROCESS)(PROC)g_OpenProcess)(fdwAccess, fInherit, IDProcess);,自定義函數(shù),isProtected()

57、,自定義函數(shù),isProtected(),用于根據(jù)進(jìn)程,ID,判斷其是否為受保護(hù)進(jìn)程:,bool isProtected(DWORD IDProcess),PROCESSENTRY32 pe;,/,獲取系統(tǒng)內(nèi)進(jìn)程的快照,pe.dwSize = sizeof(pe);,HANDLE hProcessSnap = :CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);,if (hProcessSnap = INVALID_HANDLE_VALUE),return false;,/,遍歷進(jìn)程快照,顯示每個(gè)進(jìn)程的信息,BOOL bMore = :Process

58、32First(hProcessSnap,接上,while (bMore) ,if(pe.th32ProcessID = IDProcess)/,判斷,pe.szExeFile,是否在保護(hù)進(jìn)程數(shù)組,pp_arr,中,if(!strcmp(notepad.exe, pe.szExeFile),return true;,bMore = :Process32Next(hProcessSnap,/,釋放,snapshot,對(duì)象,:CloseHandle(hProcessSnap);,return false;,SetSysHook(),函數(shù),int SetSysHook(bool bInstall,

59、DWORD dwThreadId),BOOL bOk;,if(bInstall),g_hHook = :SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, ModuleFromAddress(GetMsgProc), dwThreadId);,bOk = (g_hHook != NULL);,else,bOk = :UnhookWindowsHookEx(g_hHook);,g_hHook = NULL;,return bOk;,他,11.6.2,設(shè)計(jì)改進(jìn)進(jìn)程保護(hù)器的,EXE,項(xiàng)目,創(chuàng)建一個(gè)基于對(duì)話框的,MFC,項(xiàng)目,ProcessProtector2,。啟動(dòng)對(duì)話框時(shí),應(yīng)安裝和加載鉤子,代碼如下:,BOOL CProcessProtectorDlg:OnInitDialog(),CDialog:OnInitDialog();,/,省略缺省生成的代碼,char szDll = .HookOpenProcess.dll;,hModule = :GetModuleHandle(szDll);,if(hModule = NULL) ,hModule = :LoadLibrary(szDll);,nNeedFree = true;,if(hModule = NULL) ,

展開(kāi)閱讀全文
溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔

相關(guān)搜索

關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!