版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 大新租房合同范例
- 2024年度4S店租賃期內(nèi)綠色建筑與節(jié)能減排合同
- 商用小區(qū)租房合同范例
- 外墻玻璃清洗合同范例
- 口腔證出租合同范例
- 2024年企業(yè)財(cái)務(wù)管理咨詢(xún)合同
- 合同范例拍照要求
- 人防固定車(chē)位出租合同范例
- 倉(cāng)庫(kù)貨架合同范例
- 場(chǎng)地外包運(yùn)營(yíng)合同模板
- 基于創(chuàng)新能力培養(yǎng)的初中物理跨學(xué)科實(shí)踐教學(xué)策略
- Unit 2 This is my pencil. Lesson 10(教學(xué)設(shè)計(jì))-2024-2025學(xué)年人教精通版英語(yǔ)三年級(jí)上冊(cè)
- 2024至2030年中國(guó)巖土工程市場(chǎng)深度分析及發(fā)展趨勢(shì)研究報(bào)告
- 新版高血壓病人的護(hù)理培訓(xùn)課件
- 醫(yī)院等級(jí)創(chuàng)建工作匯報(bào)
- 2024年江西省公務(wù)員錄用考試《行測(cè)》題(網(wǎng)友回憶版)(題目及答案解析)
- VDA6.3基礎(chǔ)培訓(xùn)考核測(cè)試卷附答案
- 第01講 正數(shù)和負(fù)數(shù)、有理數(shù)-人教版新七年級(jí)《數(shù)學(xué)》暑假自學(xué)提升講義(解析版)
- 信息系統(tǒng)部署與運(yùn)維-題庫(kù)帶答案
- 婚姻心理學(xué)解讀包含內(nèi)容
- DZ/T 0462.3-2023 礦產(chǎn)資源“三率”指標(biāo)要求 第3部分:鐵、錳、鉻、釩、鈦(正式版)
評(píng)論
0/150
提交評(píng)論