版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第05讲 Windows消息机制及HOOK应用,先进软件开发技术与工具,苏曙光.软件学院.华中科技大学,2,内容 事件/消息驱动 HOOK机制,苏曙光.软件学院.华中科技大学,3,1. Windows事件驱动机制,DOS程序的特点 顺序驱动和过程驱动 Windows程序的特点 操作无序 事件驱动 以消息为中心,苏曙光.软件学院.华中科技大学,4,WINDOWS消息处理过程,苏曙光.软件学院.华中科技大学,5,队列消息 基本上是用户输入的结果 击键(如WM_KEYDOWN和WM_KEYUP消息) 击键产生的字(WM_CHAR) 鼠标移动(WM_MOUSEMOVE)和鼠标按钮(WM_LBUTTON
2、DOWN) 时钟消息(WM_TIMER) 更新消息(WM_PAINT) 退出消息(WM_QUIT),苏曙光.软件学院.华中科技大学,6,非队列消息 在许多情况下,来自调用特定的Windows函数。 CreateWindow(WM_CREATE消息) ShowWindow(WM_SIZE和WM_SHOWWINDOW消息) UpdateWindow(WM_PAINT消息) ,苏曙光.软件学院.华中科技大学,7,应用 在自己编写的程序中,通过向其它程序发送Windows消息,从而达到控制该程序的目的,苏曙光.软件学院.华中科技大学,8,获取窗口句柄的的API函数,FindWindow 函数 通过指定
3、应用程序顶层主窗口的类名和标题名,返回它的句柄。 HWND FindWindow( LPCTSTR lpClassName,/窗口所属的类的名称 LPCTSTR lpWindowName ); /窗口的标题 函数返回值: 如果查到该窗口返回其句柄。,苏曙光.软件学院.华中科技大学,9,FindWindowEx 函数,查找指定应用程序顶层主窗口中的子窗口的句柄。 参数说明 HWND FindWindowEx( HWND hwndParent, /要找的子窗口所在父窗口的句柄 HWND hwndChildAfter, /子窗口的句柄 LPCTSTR lpszClass,/子窗口的类名 LPCTST
4、R lpszWindow ); /子窗口的标题名 函数返回值 如果查到该子窗口,则返回它的句柄。,苏曙光.软件学院.华中科技大学,10,向窗口发送消息,发送 sendmessage sendmessagecallback sendnotifymessage sendmessagetimeout 寄送 postmessage postthreadmessage postquitmessage 广播 broadcastsystemmessage,苏曙光.软件学院.华中科技大学,11,苏曙光.软件学院.华中科技大学,12,例子2,苏曙光.软件学院.华中科技大学,13,打开附件中的“记事本”程序,使用
5、Spy+小工具查找“记事本”程序主窗口的标题名和窗口类名。,苏曙光.软件学院.华中科技大学,14,/函数参数意义(参数1: 窗口所属的类名; 参数2: 窗口的标题名;) h:=FindWindow(Notepad,无标题 - 记事本); /查找记事本父窗口的句柄,苏曙光.软件学院.华中科技大学,15,使用Spy+工具查找“记事本”程序子窗口的标题名和窗口类名。,苏曙光.软件学院.华中科技大学,16,/函数参数意义(参数1: 子窗口所在父窗口的句柄; 参数2: 子窗口的句柄; /参数3:子窗口的标题名) h1:=FindWindowEx(h,0,Edit,nil); /查找记事本子窗口(文本框)
6、的句柄 注意:其中h为父窗口的句柄, 子窗口句柄为0表示搜索所有的子窗口,子窗口标题不知道就使用nil。,苏曙光.软件学院.华中科技大学,17,双击“发送文本到记事本中”按钮,在生成的单击响应事件过程中,编写代码:,苏曙光.软件学院.华中科技大学,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,应用程序必须在指针移入应用程序窗口时显式设置指针类型。 hbrBackground 背景画刷的句柄。,lpszMenuName 该字符串描述菜单的资源名,苏曙光.软件学院.华中科技大学,22,窗口过程,用窗口过程来分发和处理消息 窗口类登记的窗
8、口过程 LRESULT CALLBACK MainWndProc ( HWND hwnd, / 窗口句柄 UINT msg, / 消息标识 WPARAM wParam, /消息参数1 LPARAM lParam /消息参数2 ),/窗口过程/参数:窗口句柄,消息,消息参数,消息参数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/用户选择了菜单消息 /分析菜单项,作出不同处理 /其他消息交给由系统提供的缺省处理函数return :DefWindowProc (hwnd, message, wParam, lParam) ;,苏曙光.软件学院.华中科技大学,24,消息循环处理 while(getmessage( 得到消息WM_QUIT或GetMessage出错时退出循环 从消息队列得到消息进行转换和派发,苏曙光.软件学院.华中科技大学,25,/应用程序主函数int WINAPI WinMain (HINSTANCE hInstance)/1.注册窗口类static TCHAR szAppName
10、= TEXT (HelloWin) ; /窗口类名称/定制窗口类结构WNDCLASS wndclass ;wndclass.style = CS_HREDRAW | CS_VREDRAW ;wndclass.lpfnWndProc = WndProc ; /关联消息处理函数 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) ;/消息循环MSG msg ;while (GetMessage ( /Winmain( )函数结束,苏曙光.软件学院.华中科技大学,27,自定义消息 如何定义用户消息 如何实现用户消息的处理?,苏曙光.软件学院.华中科技大学,28,自定义消息 第1步:
12、定义消息,苏曙光.软件学院.华中科技大学,29,自定义消息 第2步:实现消息处理,苏曙光.软件学院.华中科技大学,30,自定义消息 第3步:消息和处理函数的对应,苏曙光.软件学院.华中科技大学,31,MFC中实现自定义的窗口函数,重载WindowProc函数,苏曙光.软件学院.华中科技大学,32,HOOK技术,HOOK概念 两个例子,苏曙光.软件学院.华中科技大学,33,HOOK概念,苏曙光.软件学院.华中科技大学,34,HOOK概念,C就是HOOK程序。即钩子程序,C B A: 消息处理函数链,苏曙光.软件学院.华中科技大学,35,HOOK本质 一段用于处理系统消息的程序,这段程序由用户编写
13、,挂入该消息的处理函数链中,被OS自动调用 。 HOOK技术典型应用 木马程序【特征:平时潜伏,消息触发】 屏幕抓词、进程监控、垃圾邮件过滤、软件界面定制、,苏曙光.软件学院.华中科技大学,36,HOOK的类型,根据处理的消息分类 WH_CALLWNDPROC 消息发送到指定窗口 WH_CALLWNDPROCRET 消息在窗口中处理完成 WH_DEBUG 调试 WH_GETMESSAGE 接收消息投递 WH_KEYBOARD 键盘消息 WH_MOUSE 鼠标消息 WH_MSGFILTER 对话框、消息框、菜单或滚动条消息 WH_SHELL 外壳 WH_SYSMSGFILTER 系统消息 ,苏曙
14、光.软件学院.华中科技大学,37,HOOK的类型,根据消息的来源分 进程内部传递的消息 进程外部传递的消息 HOOK类型 系统HOOK(RemoteHook) 监视进程外的消息 本地HOOK(LocalHook) 监视进程内的消息,苏曙光.软件学院.华中科技大学,38,编写HOOK程序的过程,过程 1.编写消息处理模块HookProc LRESULT CALLBACK HookProc 2.编写HOOK管理程序,负责管理HookProc 把HookProc挂接到消息处理队列中(顶端) 从消息处理队列中删除HookProc 。 HOOK管理的关键函数 SetWindowsHookEx Unhoo
15、kWindowsHookEx CallNextHookEx,苏曙光.软件学院.华中科技大学,39,关键HOOK函数,HHOOK SetWindowsHookEx( int idHook; /HOOK消息类型 HOOKPROC lpfn; HINSTANCE hMod; DWORD dwThreadId ); 功能:把HookProc挂接到消息处理队列中。,LRESULT CALLBACK HookProc ( int nCode, WPARAM wParam, LPARAM lParam );,苏曙光.软件学院.华中科技大学,40,关键HOOK函数,BOOL UnhookWindowsHook
16、Ex( HHOOK hhk ); 功能:从消息处理队列中删除HookProc 。 LRESULT CallNextHookEx( HHOOK hhk; int nCode; WPARAM wParam; LPARAM lParam ); 功能:把消息沿处理队列向后继续传递,苏曙光.软件学院.华中科技大学,41,构建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() /从系统取消HOOK程序 UnhookWindowsHookEx(HHOOK)glhHook);,苏曙光.软件学院.华中科技大学,44,键盘HOOK例子,功能 能够捕获通过键盘输入的任何字符 存入到指定文件中。,苏曙光.软件学院.华
19、中科技大学,45,KeyHook.dll,SaveKey.exe,苏曙光.软件学院.华中科技大学,46,运行和测试,苏曙光.软件学院.华中科技大学,47,苏曙光.软件学院.华中科技大学,48,苏曙光.软件学院.华中科技大学,49,苏曙光.软件学院.华中科技大学,50,屏幕抓词程序,1安装鼠标钩子,通过钩子函数获得鼠标消息。 Set windows hookex 2向鼠标下的窗口发重画消息,让它重画窗口。 windowfrompoint,screentoclient,invalidaterect 3截获对系统函数的调用,取得参数(要取的词) 截获gdi32.dll中的textouta函数 4.仿
20、照textouta函数写一个自己的mytextouta函数 bool winapi mytextouta(hdc hdc, int nxstart, int nystart, lpcstr lpszstring,int cbstring) / 这里进行输出lpszstring的处理 / 然后调用正版的textouta函数 5.调用hookimportfunction函数截获进程对textouta函数调用,苏曙光.软件学院.华中科技大学,51,苏曙光.软件学院.华中科技大学,52,HOOK API技术,在应用程序中调用TerminateProcess()函数可以结束指定的进程。 如果不允许以这种“暴力”手段结束进程,就可以监控TerminateProcess( )函数的调用,禁用TerminateProcess()函数。 进程保护器的实例,苏曙光.软件学院.华中科
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年公需科目医疗废物规范化管理模拟试卷及答案
- 合作框架协议签订状况及规划函告(3篇)范文
- 如何制定有效的供应商合同签署确认函6篇范本
- 互联网企业网站运营推广策略指南
- 2026年食品加工合作协议续签沟通函3篇范文
- 行动提高传染病预防意识筑牢健康堡垒小学主题班会课件
- 客户逾期合同款催收通知单3篇范本
- 美好梦想勇往直前小学主题班会课件
- 珍惜粮食资源树立环保意识小学主题班会课件
- 小小故事大道理:引领成长小学主题班会课件中的启迪篇
- 酒店内部构成及管理制度
- 2026江苏南京助中资环新源城市更新(江苏)有限公司招聘安全管理部部门负责人1人考试参考题库及答案解析
- 四川省引大济岷水资源开发有限公司公开遴选工作人员笔试备考题库及答案解析
- 节前安全应急预案演练
- NBT 10975-2022 封闭式贮煤设施安全防护设计规程
- 2025年山东省枣庄滕州市属国有企业招聘(公共基础知识)复习题库及答案
- 酒店季度经营汇报
- 医学瞳孔的观察与护理
- 电力施工强制性条文
- 1完整版本.手拉手模型-课件
- 盆底康复产后康复进修汇报
评论
0/150
提交评论