第5講 Windows消息機制及HOOK應(yīng)用.ppt_第1頁
第5講 Windows消息機制及HOOK應(yīng)用.ppt_第2頁
第5講 Windows消息機制及HOOK應(yīng)用.ppt_第3頁
第5講 Windows消息機制及HOOK應(yīng)用.ppt_第4頁
第5講 Windows消息機制及HOOK應(yīng)用.ppt_第5頁
已閱讀5頁,還剩54頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、第05講 Windows消息機制及HOOK應(yīng)用,先進軟件開發(fā)技術(shù)與工具,蘇曙光.軟件學院.華中科技大學,2,內(nèi)容 事件/消息驅(qū)動 HOOK機制,蘇曙光.軟件學院.華中科技大學,3,1. Windows事件驅(qū)動機制,DOS程序的特點 順序驅(qū)動和過程驅(qū)動 Windows程序的特點 操作無序 事件驅(qū)動 以消息為中心,蘇曙光.軟件學院.華中科技大學,4,WINDOWS消息處理過程,蘇曙光.軟件學院.華中科技大學,5,隊列消息 基本上是用戶輸入的結(jié)果 擊鍵(如WM_KEYDOWN和WM_KEYUP消息) 擊鍵產(chǎn)生的字(WM_CHAR) 鼠標移動(WM_MOUSEMOVE)和鼠標按鈕(WM_LBUTTON

2、DOWN) 時鐘消息(WM_TIMER) 更新消息(WM_PAINT) 退出消息(WM_QUIT),蘇曙光.軟件學院.華中科技大學,6,非隊列消息 在許多情況下,來自調(diào)用特定的Windows函數(shù)。 CreateWindow(WM_CREATE消息) ShowWindow(WM_SIZE和WM_SHOWWINDOW消息) UpdateWindow(WM_PAINT消息) ,蘇曙光.軟件學院.華中科技大學,7,應(yīng)用 在自己編寫的程序中,通過向其它程序發(fā)送Windows消息,從而達到控制該程序的目的,蘇曙光.軟件學院.華中科技大學,8,獲取窗口句柄的的API函數(shù),FindWindow 函數(shù) 通過指定

3、應(yīng)用程序頂層主窗口的類名和標題名,返回它的句柄。 HWND FindWindow( LPCTSTR lpClassName,/窗口所屬的類的名稱 LPCTSTR lpWindowName ); /窗口的標題 函數(shù)返回值: 如果查到該窗口返回其句柄。,蘇曙光.軟件學院.華中科技大學,9,FindWindowEx 函數(shù),查找指定應(yīng)用程序頂層主窗口中的子窗口的句柄。 參數(shù)說明 HWND FindWindowEx( HWND hwndParent, /要找的子窗口所在父窗口的句柄 HWND hwndChildAfter, /子窗口的句柄 LPCTSTR lpszClass,/子窗口的類名 LPCTST

4、R lpszWindow ); /子窗口的標題名 函數(shù)返回值 如果查到該子窗口,則返回它的句柄。,蘇曙光.軟件學院.華中科技大學,10,向窗口發(fā)送消息,發(fā)送 sendmessage sendmessagecallback sendnotifymessage sendmessagetimeout 寄送 postmessage postthreadmessage postquitmessage 廣播 broadcastsystemmessage,蘇曙光.軟件學院.華中科技大學,11,蘇曙光.軟件學院.華中科技大學,12,例子2,蘇曙光.軟件學院.華中科技大學,13,打開附件中的“記事本”程序,使用

5、Spy+小工具查找“記事本”程序主窗口的標題名和窗口類名。,蘇曙光.軟件學院.華中科技大學,14,/函數(shù)參數(shù)意義(參數(shù)1: 窗口所屬的類名; 參數(shù)2: 窗口的標題名;) h:=FindWindow(Notepad,無標題 - 記事本); /查找記事本父窗口的句柄,蘇曙光.軟件學院.華中科技大學,15,使用Spy+工具查找“記事本”程序子窗口的標題名和窗口類名。,蘇曙光.軟件學院.華中科技大學,16,/函數(shù)參數(shù)意義(參數(shù)1: 子窗口所在父窗口的句柄; 參數(shù)2: 子窗口的句柄; /參數(shù)3:子窗口的標題名) h1:=FindWindowEx(h,0,Edit,nil); /查找記事本子窗口(文本框)

6、的句柄 注意:其中h為父窗口的句柄, 子窗口句柄為0表示搜索所有的子窗口,子窗口標題不知道就使用nil。,蘇曙光.軟件學院.華中科技大學,17,雙擊“發(fā)送文本到記事本中”按鈕,在生成的單擊響應(yīng)事件過程中,編寫代碼:,蘇曙光.軟件學院.華中科技大學,18,蘇曙光.軟件學院.華中科技大學,19,蘇曙光.軟件學院.華中科技大學,20,蘇曙光.軟件學院.華中科技大學,21,窗口類,typedef struct UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; HICON hIcon

7、; HCURSOR hCursor; HBRUSH hbrBackground; LPCTSTR lpszMenuName; LPCTSTR lpszClassName; WNDCLASS, *pWNDCLASS;,lpfnWndProc 指向窗口過程的指針。,hCursor 鼠標指針的句柄。改成員必須為一個指針資源的句柄。如果hCursor為NULL,應(yīng)用程序必須在指針移入應(yīng)用程序窗口時顯式設(shè)置指針類型。 hbrBackground 背景畫刷的句柄。,lpszMenuName 該字符串描述菜單的資源名,蘇曙光.軟件學院.華中科技大學,22,窗口過程,用窗口過程來分發(fā)和處理消息 窗口類登記的窗

8、口過程 LRESULT CALLBACK MainWndProc ( HWND hwnd, / 窗口句柄 UINT msg, / 消息標識 WPARAM wParam, /消息參數(shù)1 LPARAM lParam /消息參數(shù)2 ),/窗口過程/參數(shù):窗口句柄,消息,消息參數(shù),消息參數(shù)LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)/處理感興趣的消息switch (message)case WM_DESTROY:PostQuitMessage (0) ; return 0 ; case W

9、M_ONCOMMAND/用戶選擇了菜單消息 /分析菜單項,作出不同處理 /其他消息交給由系統(tǒng)提供的缺省處理函數(shù)return :DefWindowProc (hwnd, message, wParam, lParam) ;,蘇曙光.軟件學院.華中科技大學,24,消息循環(huán)處理 while(getmessage( 得到消息WM_QUIT或GetMessage出錯時退出循環(huán) 從消息隊列得到消息進行轉(zhuǎn)換和派發(fā),蘇曙光.軟件學院.華中科技大學,25,/應(yīng)用程序主函數(shù)int WINAPI WinMain (HINSTANCE hInstance)/1.注冊窗口類static TCHAR szAppName

10、= TEXT (HelloWin) ; /窗口類名稱/定制窗口類結(jié)構(gòu)WNDCLASS wndclass ;wndclass.style = CS_HREDRAW | CS_VREDRAW ;wndclass.lpfnWndProc = WndProc ; /關(guān)聯(lián)消息處理函數(shù) wndclass.hInstance = hInstance ; /實例句柄wndclass.lpszMenuName = NULL ;wndclass.lpszClassName = szAppName; /類名稱/注冊if (!RegisterClass (,蘇曙光.軟件學院.華中科技大學,26,/2. 建立窗口HWN

11、D hwnd ;hwnd = CreateWindow (szAppName, /窗口類名稱TEXT (“The Hello Program”), /窗口標題 WS_OVERLAPPEDWINDOW, /窗口風格hInstance, /實例句柄);ShowWindow (hwnd, iCmdShow) ;UpdateWindow (hwnd) ;/消息循環(huán)MSG msg ;while (GetMessage ( /Winmain( )函數(shù)結(jié)束,蘇曙光.軟件學院.華中科技大學,27,自定義消息 如何定義用戶消息 如何實現(xiàn)用戶消息的處理?,蘇曙光.軟件學院.華中科技大學,28,自定義消息 第1步:

12、定義消息,蘇曙光.軟件學院.華中科技大學,29,自定義消息 第2步:實現(xiàn)消息處理,蘇曙光.軟件學院.華中科技大學,30,自定義消息 第3步:消息和處理函數(shù)的對應(yīng),蘇曙光.軟件學院.華中科技大學,31,MFC中實現(xiàn)自定義的窗口函數(shù),重載WindowProc函數(shù),蘇曙光.軟件學院.華中科技大學,32,HOOK技術(shù),HOOK概念 兩個例子,蘇曙光.軟件學院.華中科技大學,33,HOOK概念,蘇曙光.軟件學院.華中科技大學,34,HOOK概念,C就是HOOK程序。即鉤子程序,C B A: 消息處理函數(shù)鏈,蘇曙光.軟件學院.華中科技大學,35,HOOK本質(zhì) 一段用于處理系統(tǒng)消息的程序,這段程序由用戶編寫

13、,掛入該消息的處理函數(shù)鏈中,被OS自動調(diào)用 。 HOOK技術(shù)典型應(yīng)用 木馬程序【特征:平時潛伏,消息觸發(fā)】 屏幕抓詞、進程監(jiān)控、垃圾郵件過濾、軟件界面定制、,蘇曙光.軟件學院.華中科技大學,36,HOOK的類型,根據(jù)處理的消息分類 WH_CALLWNDPROC 消息發(fā)送到指定窗口 WH_CALLWNDPROCRET 消息在窗口中處理完成 WH_DEBUG 調(diào)試 WH_GETMESSAGE 接收消息投遞 WH_KEYBOARD 鍵盤消息 WH_MOUSE 鼠標消息 WH_MSGFILTER 對話框、消息框、菜單或滾動條消息 WH_SHELL 外殼 WH_SYSMSGFILTER 系統(tǒng)消息 ,蘇曙

14、光.軟件學院.華中科技大學,37,HOOK的類型,根據(jù)消息的來源分 進程內(nèi)部傳遞的消息 進程外部傳遞的消息 HOOK類型 系統(tǒng)HOOK(RemoteHook) 監(jiān)視進程外的消息 本地HOOK(LocalHook) 監(jiān)視進程內(nèi)的消息,蘇曙光.軟件學院.華中科技大學,38,編寫HOOK程序的過程,過程 1.編寫消息處理模塊HookProc LRESULT CALLBACK HookProc 2.編寫HOOK管理程序,負責管理HookProc 把HookProc掛接到消息處理隊列中(頂端) 從消息處理隊列中刪除HookProc 。 HOOK管理的關(guān)鍵函數(shù) SetWindowsHookEx Unhoo

15、kWindowsHookEx CallNextHookEx,蘇曙光.軟件學院.華中科技大學,39,關(guān)鍵HOOK函數(shù),HHOOK SetWindowsHookEx( int idHook; /HOOK消息類型 HOOKPROC lpfn; HINSTANCE hMod; DWORD dwThreadId ); 功能:把HookProc掛接到消息處理隊列中。,LRESULT CALLBACK HookProc ( int nCode, WPARAM wParam, LPARAM lParam );,蘇曙光.軟件學院.華中科技大學,40,關(guān)鍵HOOK函數(shù),BOOL UnhookWindowsHook

16、Ex( HHOOK hhk ); 功能:從消息處理隊列中刪除HookProc 。 LRESULT CallNextHookEx( HHOOK hhk; int nCode; WPARAM wParam; LPARAM lParam ); 功能:把消息沿處理隊列向后繼續(xù)傳遞,蘇曙光.軟件學院.華中科技大學,41,構(gòu)建HOOK程序的步驟鼠標HOOK,STEP 1:編寫消息處理程序(處理鼠標消息) LRESULT WINAPI MouseProc(int nCode,WPARAM wParam,LPARAM lParam) /獲取目標程序的主窗口的標題 pMouseHook=(MOUSEHOOKST

17、RUCT FAR *) lParam; HWND glhTargetWnd =pMouseHook-hwnd; /取目標窗口句柄 HWND ParentWnd = glhTargetWnd; while(ParentWnd !=NULL) glhTargetWnd=ParentWnd; ParentWnd=GetParent(glhTargetWnd); GetWindowText(glhTargetWnd,szCaption,100); /取目標窗口標題 .return CallNextHookEx(HHOOK)glhHook,nCode,wParam,lParam); ,蘇曙光.軟件學院.

18、華中科技大學,42,STEP 2:安裝消息處理程序 void StartHook(HWND hWnd) glhHook = (HWND) SetWindowsHookEx( WH_MOUSE, MouseProc,NULL); WH_MOUSE:HOOK消息的類型,蘇曙光.軟件學院.華中科技大學,43,STEP 3:卸載消息處理程序 void StopHook() /從系統(tǒng)取消HOOK程序 UnhookWindowsHookEx(HHOOK)glhHook);,蘇曙光.軟件學院.華中科技大學,44,鍵盤HOOK例子,功能 能夠捕獲通過鍵盤輸入的任何字符 存入到指定文件中。,蘇曙光.軟件學院.華

19、中科技大學,45,KeyHook.dll,SaveKey.exe,蘇曙光.軟件學院.華中科技大學,46,運行和測試,蘇曙光.軟件學院.華中科技大學,47,蘇曙光.軟件學院.華中科技大學,48,蘇曙光.軟件學院.華中科技大學,49,蘇曙光.軟件學院.華中科技大學,50,屏幕抓詞程序,1安裝鼠標鉤子,通過鉤子函數(shù)獲得鼠標消息。 Set windows hookex 2向鼠標下的窗口發(fā)重畫消息,讓它重畫窗口。 windowfrompoint,screentoclient,invalidaterect 3截獲對系統(tǒng)函數(shù)的調(diào)用,取得參數(shù)(要取的詞) 截獲gdi32.dll中的textouta函數(shù) 4.仿

20、照textouta函數(shù)寫一個自己的mytextouta函數(shù) bool winapi mytextouta(hdc hdc, int nxstart, int nystart, lpcstr lpszstring,int cbstring) / 這里進行輸出lpszstring的處理 / 然后調(diào)用正版的textouta函數(shù) 5.調(diào)用hookimportfunction函數(shù)截獲進程對textouta函數(shù)調(diào)用,蘇曙光.軟件學院.華中科技大學,51,蘇曙光.軟件學院.華中科技大學,52,HOOK API技術(shù),在應(yīng)用程序中調(diào)用TerminateProcess()函數(shù)可以結(jié)束指定的進程。 如果不允許以這種“暴力”手段結(jié)束進程,就可以監(jiān)控TerminateProcess( )函數(shù)的調(diào)用,禁用TerminateProcess()函數(shù)。 進程保護器的實例,蘇曙光.軟件學院.華中科

溫馨提示

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

最新文檔

評論

0/150

提交評論