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

下載本文檔

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

文檔簡(jiǎn)介

會(huì)計(jì)學(xué)1Windows消息機(jī)制及HOOK應(yīng)用蘇曙光.軟件學(xué)院.華中科技大學(xué)2內(nèi)容事件/消息驅(qū)動(dòng)HOOK機(jī)制第1頁(yè)/共59頁(yè)蘇曙光.軟件學(xué)院.華中科技大學(xué)31.

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

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

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

UINTstyle;

WNDPROClpfnWndProc;

intcbClsExtra;

intcbWndExtra;

HINSTANCEhInstance;

HICONhIcon;

HCURSORhCursor;

HBRUSHhbrBackground;

LPCTSTRlpszMenuName;

LPCTSTRlpszClassName;

}WNDCLASS,*pWNDCLASS;

lpfnWndProc

指向窗口過(guò)程的指針。hCursor

鼠標(biāo)指針的句柄。改成員必須為一個(gè)指針資源的句柄。如果hCursor為NULL,應(yīng)用程序必須在指針移入應(yīng)用程序窗口時(shí)顯式設(shè)置指針類(lèi)型。

hbrBackground

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

窗口類(lèi)登記的窗口過(guò)程LRESULTCALLBACKMainWndProc(HWNDhwnd,//窗口句柄UINTmsg,//消息標(biāo)識(shí)WPARAMwParam,//消息參數(shù)1LPARAMlParam//消息參數(shù)2)第21頁(yè)/共59頁(yè)//窗口過(guò)程

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

LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam)

{

//處理感興趣的消息

switch(message)

{

caseWM_DESTROY:

PostQuitMessage(0);

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

{//分析菜單項(xiàng),作出不同處理}

}

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

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

}

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

intWINAPIWinMain(HINSTANCEhInstance)

{

//1.注冊(cè)窗口類(lèi)

staticTCHARszAppName[]=TEXT("HelloWin");//窗口類(lèi)名稱(chēng)

//定制"窗口類(lèi)"結(jié)構(gòu)

WNDCLASSwndclass;

wndclass.style=CS_HREDRAW|CS_VREDRAW;

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

wndclass.hInstance=hInstance;//實(shí)例句柄

wndclass.lpszMenuName=NULL;

wndclass.lpszClassName=szAppName;//類(lèi)名稱(chēng)

//注冊(cè)

if(!RegisterClass(&wndclass))

{

MessageBox(NULL,TEXT("RegisterClassFail);

return0;

}第24頁(yè)/共59頁(yè)蘇曙光.軟件學(xué)院.華中科技大學(xué)26

//2.建立窗口

HWNDhwnd;

hwnd=CreateWindow(szAppName,//窗口類(lèi)名稱(chēng)

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

WS_OVERLAPPEDWINDOW,//窗口風(fēng)格

hInstance,//實(shí)例句柄

);

ShowWindow(hwnd,iCmdShow);

UpdateWindow(hwnd);

//消息循環(huán)

MSGmsg;

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

{

TranslateMessage(&msg);//轉(zhuǎn)換消息

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

}

returnmsg.wParam;

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

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

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

pMouseHook=(MOUSEHOOKSTRUCTFAR*)lParam;

HWNDglhTargetWnd=pMouseHook->hwnd;//取目標(biāo)窗口句柄

HWNDParentWnd=glhTargetWnd;while(ParentWnd!=NULL)

{

glhTargetWnd=ParentWnd;ParentWnd=GetParent(glhTargetWnd);

}

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

……..

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

glhHook=(HWND)SetWindowsHookEx(

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

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

……

UnhookWindowsHookEx((HHOOK)glhHook);

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

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

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

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

溫馨提示

  • 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. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論