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

下載本文檔

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

文檔簡介

會計學1Windows消息機制及HOOK應用蘇曙光.軟件學院.華中科技大學2內(nèi)容事件/消息驅動HOOK機制第1頁/共59頁蘇曙光.軟件學院.華中科技大學31.

Windows事件驅動機制DOS程序的特點順序驅動和過程驅動Windows程序的特點操作無序事件驅動以消息為中心第2頁/共59頁蘇曙光.軟件學院.華中科技大學4WINDOWS消息處理過程第3頁/共59頁蘇曙光.軟件學院.華中科技大學5隊列消息基本上是用戶輸入的結果擊鍵(如WM_KEYDOWN和WM_KEYUP消息)擊鍵產(chǎn)生的字(WM_CHAR)鼠標移動(WM_MOUSEMOVE)和鼠標按鈕(WM_LBUTTONDOWN)時鐘消息(WM_TIMER)更新消息(WM_PAINT)退出消息(WM_QUIT)第4頁/共59頁蘇曙光.軟件學院.華中科技大學6非隊列消息在許多情況下,來自調用特定的Windows函數(shù)。CreateWindow(WM_CREATE消息)ShowWindow(WM_SIZE和WM_SHOWWINDOW消息)UpdateWindow(WM_PAINT消息)……第5頁/共59頁蘇曙光.軟件學院.華中科技大學7應用在自己編寫的程序中,通過向其它程序發(fā)送Windows消息,從而達到控制該程序的目的第6頁/共59頁蘇曙光.軟件學院.華中科技大學8獲取窗口句柄的的API函數(shù)FindWindow函數(shù)通過指定應用程序頂層主窗口的類名和標題名,返回它的句柄。HWNDFindWindow(LPCTSTRlpClassName, //窗口所屬的類的名稱LPCTSTRlpWindowName);//窗口的標題函數(shù)返回值:如果查到該窗口返回其句柄。第7頁/共59頁蘇曙光.軟件學院.華中科技大學9FindWindowEx函數(shù)查找指定應用程序頂層主窗口中的子窗口的句柄。參數(shù)說明HWNDFindWindowEx(HWNDhwndParent,//要找的子窗口所在父窗口的句柄HWNDhwndChildAfter,//子窗口的句柄LPCTSTRlpszClass, //子窗口的類名LPCTSTRlpszWindow);//子窗口的標題名

函數(shù)返回值如果查到該子窗口,則返回它的句柄。第8頁/共59頁蘇曙光.軟件學院.華中科技大學10向窗口發(fā)送消息發(fā)送sendmessagesendmessagecallbacksendnotifymessagesendmessagetimeout寄送postmessagepostthreadmessagepostquitmessage廣播broadcastsystemmessage第9頁/共59頁蘇曙光.軟件學院.華中科技大學11第10頁/共59頁蘇曙光.軟件學院.華中科技大學12例子2第11頁/共59頁蘇曙光.軟件學院.華中科技大學13打開附件中的“記事本”程序,使用Spy++小工具查找“記事本”程序主窗口的標題名和窗口類名。第12頁/共59頁蘇曙光.軟件學院.華中科技大學14//函數(shù)參數(shù)意義(參數(shù)1:窗口所屬的類名;參數(shù)2:窗口的標題名;)h:=FindWindow('Notepad','無標題-記事本');//查找"記事本"父窗口的句柄第13頁/共59頁蘇曙光.軟件學院.華中科技大學15使用Spy++工具查找“記事本”程序子窗口的標題名和窗口類名。第14頁/共59頁蘇曙光.軟件學院.華中科技大學16

//函數(shù)參數(shù)意義(參數(shù)1:子窗口所在父窗口的句柄;參數(shù)2:子窗口的句柄;//參數(shù)3:子窗口的標題名)h1:=FindWindowEx(h,0,'Edit',nil);//查找"記事本"子窗口(文本框)的句柄注意:其中h為父窗口的句柄,子窗口句柄為0表示搜索所有的子窗口,子窗口標題不知道就使用nil。第15頁/共59頁蘇曙光.軟件學院.華中科技大學17雙擊“發(fā)送文本到記事本中”按鈕,在生成的單擊響應事件過程中,編寫代碼:第16頁/共59頁蘇曙光.軟件學院.華中科技大學18第17頁/共59頁蘇曙光.軟件學院.華中科技大學19第18頁/共59頁蘇曙光.軟件學院.華中科技大學20第19頁/共59頁蘇曙光.軟件學院.華中科技大學21窗口類typedefstruct{

UINTstyle;

WNDPROClpfnWndProc;

intcbClsExtra;

intcbWndExtra;

HINSTANCEhInstance;

HICONhIcon;

HCURSORhCursor;

HBRUSHhbrBackground;

LPCTSTRlpszMenuName;

LPCTSTRlpszClassName;

}WNDCLASS,*pWNDCLASS;

lpfnWndProc

指向窗口過程的指針。hCursor

鼠標指針的句柄。改成員必須為一個指針資源的句柄。如果hCursor為NULL,應用程序必須在指針移入應用程序窗口時顯式設置指針類型。

hbrBackground

背景畫刷的句柄。lpszMenuName該字符串描述菜單的資源名第20頁/共59頁蘇曙光.軟件學院.華中科技大學22窗口過程用窗口過程來分發(fā)和處理消息

窗口類登記的窗口過程LRESULTCALLBACKMainWndProc(HWNDhwnd,//窗口句柄UINTmsg,//消息標識WPARAMwParam,//消息參數(shù)1LPARAMlParam//消息參數(shù)2)第21頁/共59頁//窗口過程

//參數(shù):窗口句柄,消息,消息參數(shù),消息參數(shù)

LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam)

{

//處理感興趣的消息

switch(message)

{

caseWM_DESTROY:

PostQuitMessage(0);

return0;caseWM_ONCOMMAND//用戶選擇了菜單消息

{//分析菜單項,作出不同處理}

}

//其他消息交給由系統(tǒng)提供的缺省處理函數(shù)

return::DefWindowProc(hwnd,message,wParam,lParam);

}

第22頁/共59頁蘇曙光.軟件學院.華中科技大學24消息循環(huán)處理while(getmessage(&msg,null,0,0)){if(!translateaccelerator(msg.hwnd,hacceltable,&msg)){translatemessage(&msg);dispatchmessage(&msg);}}得到消息WM_QUIT或GetMessage出錯時退出循環(huán)從消息隊列得到消息進行轉換和派發(fā)第23頁/共59頁蘇曙光.軟件學院.華中科技大學25//應用程序主函數(shù)

intWINAPIWinMain(HINSTANCEhInstance)

{

//1.注冊窗口類

staticTCHARszAppName[]=TEXT("HelloWin");//窗口類名稱

//定制"窗口類"結構

WNDCLASSwndclass;

wndclass.style=CS_HREDRAW|CS_VREDRAW;

wndclass.lpfnWndProc=WndProc;//關聯(lián)消息處理函數(shù)

wndclass.hInstance=hInstance;//實例句柄

wndclass.lpszMenuName=NULL;

wndclass.lpszClassName=szAppName;//類名稱

//注冊

if(!RegisterClass(&wndclass))

{

MessageBox(NULL,TEXT("RegisterClassFail);

return0;

}第24頁/共59頁蘇曙光.軟件學院.華中科技大學26

//2.建立窗口

HWNDhwnd;

hwnd=CreateWindow(szAppName,//窗口類名稱

TEXT(“TheHelloProgram”),//窗口標題

WS_OVERLAPPEDWINDOW,//窗口風格

hInstance,//實例句柄

);

ShowWindow(hwnd,iCmdShow);

UpdateWindow(hwnd);

//消息循環(huán)

MSGmsg;

while(GetMessage(&msg))//從消息隊列中取消息

{

TranslateMessage(&msg);//轉換消息

DispatchMessage(&msg);//派發(fā)消息

}

returnmsg.wParam;

}//Winmain()函數(shù)結束第25頁/共59頁蘇曙光.軟件學院.華中科技大學27自定義消息如何定義用戶消息如何實現(xiàn)用戶消息的處理?第26頁/共59頁蘇曙光.軟件學院.華中科技大學28自定義消息第1步:定義消息第27頁/共59頁蘇曙光.軟件學院.華中科技大學29自定義消息第2步:實現(xiàn)消息處理第28頁/共59頁蘇曙光.軟件學院.華中科技大學30自定義消息第3步:消息和處理函數(shù)的對應第29頁/共59頁蘇曙光.軟件學院.華中科技大學31MFC中實現(xiàn)自定義的窗口函數(shù)重載WindowProc函數(shù)第30頁/共59頁蘇曙光.軟件學院.華中科技大學32HOOK技術HOOK概念兩個例子第31頁/共59頁蘇曙光.軟件學院.華中科技大學33HOOK概念消息處理程序A消息處理程序B消息處理程序C第32頁/共59頁蘇曙光.軟件學院.華中科技大學34HOOK概念消息處理程序C消息處理程序A消息處理程序BC就是HOOK程序。即鉤子程序C→B→A:消息處理函數(shù)鏈第33頁/共59頁蘇曙光.軟件學院.華中科技大學35HOOK本質一段用于處理系統(tǒng)消息的程序,這段程序由用戶編寫,掛入該消息的處理函數(shù)鏈中,被OS自動調用。HOOK技術典型應用木馬程序【特征:平時潛伏,消息觸發(fā)】屏幕抓詞、進程監(jiān)控、垃圾郵件過濾、軟件界面定制、……第34頁/共59頁蘇曙光.軟件學院.華中科技大學36HOOK的類型根據(jù)處理的消息分類WH_CALLWNDPROC消息發(fā)送到指定窗口WH_CALLWNDPROCRET消息在窗口中處理完成WH_DEBUG調試WH_GETMESSAGE接收消息投遞WH_KEYBOARD鍵盤消息WH_MOUSE鼠標消息

WH_MSGFILTER對話框、消息框、菜單或滾動條消息WH_SHELL外殼WH_SYSMSGFILTER系統(tǒng)消息……第35頁/共59頁蘇曙光.軟件學院.華中科技大學37HOOK的類型根據(jù)消息的來源分進程內(nèi)部傳遞的消息進程外部傳遞的消息HOOK類型系統(tǒng)HOOK(RemoteHook)監(jiān)視進程外的消息本地HOOK(LocalHook)監(jiān)視進程內(nèi)的消息

第36頁/共59頁蘇曙光.軟件學院.華中科技大學38編寫HOOK程序的過程過程1.編寫消息處理模塊HookProcLRESULTCALLBACKHookProc2.編寫HOOK管理程序,負責管理HookProc把HookProc掛接到消息處理隊列中(頂端)從消息處理隊列中刪除HookProc。HOOK管理的關鍵函數(shù)SetWindowsHookExUnhookWindowsHookExCallNextHookEx第37頁/共59頁蘇曙光.軟件學院.華中科技大學39關鍵HOOK函數(shù)HHOOKSetWindowsHookEx(intidHook;//HOOK消息類型HOOKPROClpfn;HINSTANCEhMod;DWORDdwThreadId);功能:把HookProc掛接到消息處理隊列中。LRESULTCALLBACKHookProc(intnCode,WPARAMwParam,LPARAMlParam);第38頁/共59頁蘇曙光.軟件學院.華中科技大學40關鍵HOOK函數(shù)BOOLUnhookWindowsHookEx(HHOOKhhk);功能:從消息處理隊列中刪除HookProc。LRESULTCallNextHookEx(HHOOKhhk;intnCode;WPARAMwParam;LPARAMlParam);功能:把消息沿處理隊列向后繼續(xù)傳遞第39頁/共59頁蘇曙光.軟件學院.華中科技大學41構建HOOK程序的步驟[鼠標HOOK]STEP1:編寫消息處理程序(處理鼠標消息)LRESULTWINAPIMouseProc(intnCode,WPARAMwParam,LPARAMlParam){//獲取目標程序的主窗口的標題

pMouseHook=(MOUSEHOOKSTRUCTFAR*)lParam;

HWNDglhTargetWnd=pMouseHook->hwnd;//取目標窗口句柄

HWNDParentWnd=glhTargetWnd;while(ParentWnd!=NULL)

{

glhTargetWnd=ParentWnd;ParentWnd=GetParent(glhTargetWnd);

}

GetWindowText(glhTargetWnd,szCaption,100);//取目標窗口標題

……..

returnCallNextHookEx((HHOOK)glhHook,nCode,wParam,lParam);}第40頁/共59頁蘇曙光.軟件學院.華中科技大學42STEP2:安裝消息處理程序voidStartHook(HWNDhWnd){……

glhHook=(HWND)SetWindowsHookEx(

WH_MOUSE,MouseProc,NULL);}WH_MOUSE:HOOK消息的類型第41頁/共59頁蘇曙光.軟件學院.華中科技大學43STEP3:卸載消息處理程序voidStopHook()

{//從系統(tǒng)取消HOOK程序

……

UnhookWindowsHookEx((HHOOK)glhHook);

}第42頁/共59頁蘇曙光.軟件學院.華中科技大學44鍵盤HOOK例子功能能夠捕獲通過鍵盤輸入的任何字符存入到指定文件中。第43頁/共59頁蘇曙光.軟件學院.華中科技大學45KeyHook.dllSaveKey.exe第44頁/共59頁蘇曙光.軟件學院.華中科技大學46運行和測試第45頁/共59頁蘇曙光.軟件學院.華中科技大學47第46頁/共59頁蘇曙光.軟件學院.華中科技大學48第47頁/共59頁蘇曙光.軟件學院.華中科技大學49第48頁/共59頁蘇曙光.軟件學院.華中科技大學50第49頁/共59頁屏幕抓詞程序1.安裝鼠標鉤子,通過鉤子函數(shù)獲得鼠標消息。Setwindowshookex2.向鼠標下的窗口發(fā)重畫消息,讓它重畫窗口。windowfrompoint,screentoclient,invalidaterect3.截獲對系統(tǒng)函數(shù)的調用,取得參數(shù)(要取的詞)截獲gdi32.dll中的textouta函數(shù)4.仿照textouta函數(shù)寫一個自己的mytextouta函數(shù)

boolwinapimytextouta(hdchdc,intnxstart,intnystart,lpcstrlpszstring,intcbstring){

//這里進行輸出lpszstring的處理//然后調用正版的textouta函數(shù)}

5.調用hookimportfunction函數(shù)截獲進程對textouta函數(shù)調用蘇曙光.軟件學院.華中科技大學51第50頁/共59頁蘇曙光.軟件學院.華中科技大學52HOOKAPI技術在應用程序中調用TerminateProcess()函數(shù)可以結束指定的進程。如果不允許以這種“暴力”手段結束進程,就可以監(jiān)控Terminate

溫馨提示

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

最新文檔

評論

0/150

提交評論