Windows消息机制及HOOK应用_第1页
Windows消息机制及HOOK应用_第2页
Windows消息机制及HOOK应用_第3页
Windows消息机制及HOOK应用_第4页
Windows消息机制及HOOK应用_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

会计学1Windows消息机制及HOOK应用苏曙光.软件学院.华中科技大学2内容事件/消息驱动HOOK机制第1页/共59页苏曙光.软件学院.华中科技大学31.

Windows事件驱动机制DOS程序的特点顺序驱动和过程驱动Windows程序的特点操作无序事件驱动以消息为中心第2页/共59页苏曙光.软件学院.华中科技大学4WINDOWS消息处理过程第3页/共59页苏曙光.软件学院.华中科技大学5队列消息基本上是用户输入的结果击键(如WM_KEYDOWN和WM_KEYUP消息)击键产生的字(WM_CHAR)鼠标移动(WM_MOUSEMOVE)和鼠标按钮(WM_LBUTTONDOWN)时钟消息(WM_TIMER)更新消息(WM_PAINT)退出消息(WM_QUIT)第4页/共59页苏曙光.软件学院.华中科技大学6非队列消息在许多情况下,来自调用特定的Windows函数。CreateWindow(WM_CREATE消息)ShowWindow(WM_SIZE和WM_SHOWWINDOW消息)UpdateWindow(WM_PAINT消息)……第5页/共59页苏曙光.软件学院.华中科技大学7应用在自己编写的程序中,通过向其它程序发送Windows消息,从而达到控制该程序的目的第6页/共59页苏曙光.软件学院.华中科技大学8获取窗口句柄的的API函数FindWindow函数通过指定应用程序顶层主窗口的类名和标题名,返回它的句柄。HWNDFindWindow(LPCTSTRlpClassName, //窗口所属的类的名称LPCTSTRlpWindowName);//窗口的标题函数返回值:如果查到该窗口返回其句柄。第7页/共59页苏曙光.软件学院.华中科技大学9FindWindowEx函数查找指定应用程序顶层主窗口中的子窗口的句柄。参数说明HWNDFindWindowEx(HWNDhwndParent,//要找的子窗口所在父窗口的句柄HWNDhwndChildAfter,//子窗口的句柄LPCTSTRlpszClass, //子窗口的类名LPCTSTRlpszWindow);//子窗口的标题名

函数返回值如果查到该子窗口,则返回它的句柄。第8页/共59页苏曙光.软件学院.华中科技大学10向窗口发送消息发送sendmessagesendmessagecallbacksendnotifymessagesendmessagetimeout寄送postmessagepostthreadmessagepostquitmessage广播broadcastsystemmessage第9页/共59页苏曙光.软件学院.华中科技大学11第10页/共59页苏曙光.软件学院.华中科技大学12例子2第11页/共59页苏曙光.软件学院.华中科技大学13打开附件中的“记事本”程序,使用Spy++小工具查找“记事本”程序主窗口的标题名和窗口类名。第12页/共59页苏曙光.软件学院.华中科技大学14//函数参数意义(参数1:窗口所属的类名;参数2:窗口的标题名;)h:=FindWindow('Notepad','无标题-记事本');//查找"记事本"父窗口的句柄第13页/共59页苏曙光.软件学院.华中科技大学15使用Spy++工具查找“记事本”程序子窗口的标题名和窗口类名。第14页/共59页苏曙光.软件学院.华中科技大学16

//函数参数意义(参数1:子窗口所在父窗口的句柄;参数2:子窗口的句柄;//参数3:子窗口的标题名)h1:=FindWindowEx(h,0,'Edit',nil);//查找"记事本"子窗口(文本框)的句柄注意:其中h为父窗口的句柄,子窗口句柄为0表示搜索所有的子窗口,子窗口标题不知道就使用nil。第15页/共59页苏曙光.软件学院.华中科技大学17双击“发送文本到记事本中”按钮,在生成的单击响应事件过程中,编写代码:第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窗口过程用窗口过程来分发和处理消息

窗口类登记的窗口过程LRESULTCALLBACKMainWndProc(HWNDhwnd,//窗口句柄UINTmsg,//消息标识WPARAMwParam,//消息参数1LPARAMlParam//消息参数2)第21页/共59页//窗口过程

//参数:窗口句柄,消息,消息参数,消息参数

LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam)

{

//处理感兴趣的消息

switch(message)

{

caseWM_DESTROY:

PostQuitMessage(0);

return0;caseWM_ONCOMMAND//用户选择了菜单消息

{//分析菜单项,作出不同处理}

}

//其他消息交给由系统提供的缺省处理函数

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

}

第22页/共59页苏曙光.软件学院.华中科技大学24消息循环处理while(getmessage(&msg,null,0,0)){if(!translateaccelerator(msg.hwnd,hacceltable,&msg)){translatemessage(&msg);dispatchmessage(&msg);}}得到消息WM_QUIT或GetMessage出错时退出循环从消息队列得到消息进行转换和派发第23页/共59页苏曙光.软件学院.华中科技大学25//应用程序主函数

intWINAPIWinMain(HINSTANCEhInstance)

{

//1.注册窗口类

staticTCHARszAppName[]=TEXT("HelloWin");//窗口类名称

//定制"窗口类"结构

WNDCLASSwndclass;

wndclass.style=CS_HREDRAW|CS_VREDRAW;

wndclass.lpfnWndProc=WndProc;//关联消息处理函数

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);

//消息循环

MSGmsg;

while(GetMessage(&msg))//从消息队列中取消息

{

TranslateMessage(&msg);//转换消息

DispatchMessage(&msg);//派发消息

}

returnmsg.wParam;

}//Winmain()函数结束第25页/共59页苏曙光.软件学院.华中科技大学27自定义消息如何定义用户消息如何实现用户消息的处理?第26页/共59页苏曙光.软件学院.华中科技大学28自定义消息第1步:定义消息第27页/共59页苏曙光.软件学院.华中科技大学29自定义消息第2步:实现消息处理第28页/共59页苏曙光.软件学院.华中科技大学30自定义消息第3步:消息和处理函数的对应第29页/共59页苏曙光.软件学院.华中科技大学31MFC中实现自定义的窗口函数重载WindowProc函数第30页/共59页苏曙光.软件学院.华中科技大学32HOOK技术HOOK概念两个例子第31页/共59页苏曙光.软件学院.华中科技大学33HOOK概念消息处理程序A消息处理程序B消息处理程序C第32页/共59页苏曙光.软件学院.华中科技大学34HOOK概念消息处理程序C消息处理程序A消息处理程序BC就是HOOK程序。即钩子程序C→B→A:消息处理函数链第33页/共59页苏曙光.软件学院.华中科技大学35HOOK本质一段用于处理系统消息的程序,这段程序由用户编写,挂入该消息的处理函数链中,被OS自动调用。HOOK技术典型应用木马程序【特征:平时潜伏,消息触发】屏幕抓词、进程监控、垃圾邮件过滤、软件界面定制、……第34页/共59页苏曙光.软件学院.华中科技大学36HOOK的类型根据处理的消息分类WH_CALLWNDPROC消息发送到指定窗口WH_CALLWNDPROCRET消息在窗口中处理完成WH_DEBUG调试WH_GETMESSAGE接收消息投递WH_KEYBOARD键盘消息WH_MOUSE鼠标消息

WH_MSGFILTER对话框、消息框、菜单或滚动条消息WH_SHELL外壳WH_SYSMSGFILTER系统消息……第35页/共59页苏曙光.软件学院.华中科技大学37HOOK的类型根据消息的来源分进程内部传递的消息进程外部传递的消息HOOK类型系统HOOK(RemoteHook)监视进程外的消息本地HOOK(LocalHook)监视进程内的消息

第36页/共59页苏曙光.软件学院.华中科技大学38编写HOOK程序的过程过程1.编写消息处理模块HookProcLRESULTCALLBACKHookProc2.编写HOOK管理程序,负责管理HookProc把HookProc挂接到消息处理队列中(顶端)从消息处理队列中删除HookProc。HOOK管理的关键函数SetWindowsHookExUnhookWindowsHookExCallNextHookEx第37页/共59页苏曙光.软件学院.华中科技大学39关键HOOK函数HHOOKSetWindowsHookEx(intidHook;//HOOK消息类型HOOKPROClpfn;HINSTANCEhMod;DWORDdwThreadId);功能:把HookProc挂接到消息处理队列中。LRESULTCALLBACKHookProc(intnCode,WPARAMwParam,LPARAMlParam);第38页/共59页苏曙光.软件学院.华中科技大学40关键HOOK函数BOOLUnhookWindowsHookEx(HHOOKhhk);功能:从消息处理队列中删除HookProc。LRESULTCallNextHookEx(HHOOKhhk;intnCode;WPARAMwParam;LPARAMlParam);功能:把消息沿处理队列向后继续传递第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()

{//从系统取消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.安装鼠标钩子,通过钩子函数获得鼠标消息。Setwindowshookex2.向鼠标下的窗口发重画消息,让它重画窗口。windowfrompoint,screentoclient,invalidaterect3.截获对系统函数的调用,取得参数(要取的词)截获gdi32.dll中的textouta函数4.仿照textouta函数写一个自己的mytextouta函数

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

//这里进行输出lpszstring的处理//然后调用正版的textouta函数}

5.调用hookimportfunction函数截获进程对textouta函数调用苏曙光.软件学院.华中科技大学51第50页/共59页苏曙光.软件学院.华中科技大学52HOOKAPI技术在应用程序中调用TerminateProcess()函数可以结束指定的进程。如果不允许以这种“暴力”手段结束进程,就可以监控Terminate

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论