




已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Hook 使用指南 1 Hooks hook 指出了系统消息处理机制 利用 hook 可以在应用程序中安装子程序监视系统和进 程之间的消息传递 这个监视过程是在消息到达目的窗口过程之前 下面简述 hook 并且解释在 Win32 系统下 如何使用 hook 编程 2 About Hooks hook 将使程序效率降低 因为它们增加了系统必须处理的消息总数 你应该在需要时才使 用 并及时删除它 我将以下面的主题描述 hook Hook Chains hook 链 系统支持很多不同类型的 hooks 不同的 hook 提供不同的消息处理机制 比如 应用 程序可以使用 WH MOUSE hook 来监视鼠标消息的传递 系统为不同类型的 hook 提供单独的 hook 链 hook 链是一个指针列表 这个列表的指 针指向指定的 应用程序定义的 被 hook 过程调用的回调函数 当与指定的 hook 类型关 联的消息发生时 系统就把这个消息传递到 hook 过程 一些 hook 过程可以只监视消息 或者修改消息 或者停止消息的前进 避免这些消息传递到下一个 hook 过程或者目的窗口 Hook Procedures hook 过程 为了利用特殊的 hook 类型 开发者提供了 hook 过程 使用 SetWindowsHookEx 函数 来把 hook 过程安装到关联的 hook 链 hook 过程必须按照以下的语法 LRESULT CALLBACKHookProc int nCode WPARAM wParam LPARAM lParam HookProc 是应用程序定义的名字 nCode 参数是 hook 代码 hook 过程使用这个参数来确定任务 这个参数的值依赖于 hook 类型 每一种 hook 都有自己的 hook 代码特征字符集 wParam 和 lParam 参数的值依 赖于 hook 代码 但是它们的典型值是包含了关于发送或者接收消息的信息 SetWindowsHookEx 函数总是在 hook 链的开头安装 hook 过程 当指定类型的 hook 监 视的事件发生时 系统就调用与这个 hook 关联的 hook 链的开头的 hook 过程 每一个 hook 链中的 hook 过程都决定是否把这个事件传递到下一个 hook 过程 hook 过程传递事件到下 一个 hook 过程需要调用 CallNextHookEx 函数 有些类型 hook 的 hook 过程只能监视消息 不管是否调用了 CallNextHookEx 函数 系 统都把消息传递到每一个 hook 过程 全局 hook 监视同一桌面的所有线程 而特定线程的 hook 只能监视单独的线程 全局 hook 过程可以被同一桌面的任何应用程序调用 就象调用线程一样 所以这个过程必须和 DLL 模块分开 特定线程 hook 过程只可以被相关线程调用 只有在有调试目的的时候才使 用全局 hook 应该避免使用 全局 hook 损害了系统性能 Hook Types 每一种类型的 hook 可以使应用程序能够监视不同类型的系统消息处理机制 下面描述 所有可以利用的 hook 类型 WH CALLWNDPROC and WH CALLWNDPROCRET Hooks WH CALLWNDPROC and WH CALLWNDPROCRET Hook 使你可以监视发送到窗口 过程的消息 系统在消息发送到接收窗口过程之前调用 WH CALLWNDPROC hook过程 并且在窗口过程处理完消息之后调用 WH CALLWNDPROCRET Hook 过程 WH CALLWNDPROCRET Hook 传递指针到 CWPRETSTRUCT 结构 再传递到 hook 过程 CWPRETSTRUCT 结构包含了来自处理消息的窗口过程的返回值 同样也包括了与 这个消息关联的消息参数 WH CBT Hook 在以下事件之前 系统都会调用 WH CBT Hook 过程 这些事件包括 激活 建立 销毁 最小化 最大化 移动 改变尺寸等窗口事件 完成系统指令 来自系统消息队列中 的移动鼠标 键盘事件 设置输入焦点事件 同步系统消息队列事件 hook 过程的返回值 确定系统是否允许或者防止这些操作中的一个 WH DEBUG Hook 在系统调用系统中与其他 hook 关联的 hook 过程之前 系统会调用 WH DEBUG Hook 过程 你可以使用这个 hook 来决定是否允许系统调用与其他 hook 关联的 hook 过程 WH FOREGROUNDIDLE Hook 当应用程序的前景线程处于空闲状态时 可以使用 WH FOREGROUNDIDLE Hook 执行低优先级的任务 当应用程序的前景线程大概要变成空闲状态时 系统就会调用 WH FOREGROUNDIDLE Hook 过程 WH GETMESSAGE Hook 应用程序使用WH GETMESSAGE Hook来监视从GetMessage or PeekMessage函数返回 的消息 你可以使用 WH GETMESSAGE Hook 去监视鼠标和键盘输入 以及其他发送到消 息队列中的消息 WH JOURNALPLAYBACK Hook WH JOURNALPLAYBACK Hook 使应用程序可以插入消息到系统消息队列 可以使用 这个 hook 回放通过使用 WH JOURNALRECORD hook 记录下来的连续的鼠标和键盘事件 只要 WH JOURNALPLAYBACKhook 已经安装 正常的鼠标和键盘事件就是无效的 WH JOURNALPLAYBACK hook 是全局 hook 它不能象线程特定 hook 一样使用 WH JOURNALPLAYBACK hook 返回超时值 这个值告诉系统在处理来自回放 hook 当前 消息之前需要等待多长时间 毫秒 这就使 hook 可以控制实时事件的回放 WH JOURNALRECORD Hook WH JOURNALRECORD Hook 用来监视和记录输入事件 典型的 可以使用这个 hook 记录连续的鼠标和键盘事件 然后通过使用 WH JOURNALPLAYBACKHook 来回放 WH JOURNALRECORD hook 是全局 hook 它不能象线程特定 hook 一样使用 WH KEYBOARD Hook 在应用程序中 WH KEYBOARD Hook 用来监视 WM KEYDOWN and WM KEYUP 消息 这些消息通过 GetMessage or PeekMessagefunction 返回 可以使用这个 hook 来监视 输入到消息队列中的键盘消息 WH KEYBOARD LL Hook WH KEYBOARD LL Hook 监视输入到线程消息队列中的键盘消息 WH MOUSE Hook WH MOUSE Hook 监视从 GetMessage or PeekMessagefunction 返回的鼠标消息 使用 这个 hook 监视输入到消息队列中的鼠标消息 WH MOUSE LL Hook WH MOUSE LL Hook 监视输入到线程消息队列中的鼠标消息 WH MSGFILTER and WH SYSMSGFILTER Hooks WH MSGFILTER and WH SYSMSGFILTER Hooks 使我们可以监视菜单 滚动条 消 息框 对话框消息并且发现用户使用 ALT TABor ALT ESC 组合键切换窗口 WH MSGFILTER hook 只能监视传递到菜单 滚动条 消息框的消息 以及传递到通过安 装了 hook 过程的应用程序建立的对话框的消息 WH SYSMSGFILTER Hook 监视所有应用 程序消息 WH MSGFILTER and WH SYSMSGFILTER Hooks 使我们可以在模式循环期间过滤消 息 这等价于在主消息循环中过滤消息 通过调用 CallMsgFilter function 可以直接的调用 WH MSGFILTER hook 通过使用这 个函数 应用程序能够在模式循环期间使用相同的代码去过滤消息 如同在主消息循环里一 样 WH SHELL Hook 外壳应用程序可以使用 WH SHELLHook 去接收重要的通知 当外壳应用程序是激活 的并且当顶层窗口建立或者销毁时 系统调用 WH SHELLHook 过程 按照惯例 外壳应用程序都不接收 WH SHELL消息 所以 在应用程序能够接收 WH SHELL 消息之前 应用程序必须调用 SystemParametersInfo function 注册它自己 3 Using Hooks Installing and Releasing Hook Procedures 可以使用 SetWindowsHookEx function 安装 hook 过程并且指定 hook 类型 指定是否需 要把 hook 过程与所有线程关联 或者关联指定的线程 并且指向 hook 过程入口点 必须把全局 hook 过程放进 DLL 以和应用程序安装的 hook 过程分开 在应用程序安装 hook 过程之前 它必须有一个指向 DLL 模块的句柄 为了得到这个句柄 可以在调用 LoadLibrary 函数时使用 DLL 名字参数 在得到这个句柄以后 可以调用 GetProcAddress 函数来得到 hook 过程的指针 最后 使用 SetWindowsHookEx 函数安装 hook 过程地址进 应用程序 hook 链 这个过程可以用下面的事例说明 HOOKPROC hkprcSysMsg static HINSTANCE hinstDLL static HHOOK hhookSysMsg hinstDLL LoadLibrary LPCTSTR c windows sysmsg dll file loading DLL hkprcSysMsg HOOKPROC GetProcAddress hinstDLL SysMessageProc file get address hhookSysMsg SetWindowsHookEx WH SYSMSGFILTER hkprcSysMsg hinstDLL 0 file install hook 当应用程序不再需要与特定线程相关 hook 时 需要调用 UnhookWindowsHookEx 函数删 除相关的 hook 过程 对于全局 hook 也需要调用 UnhookWindowsHookEx 函数 但是这 个函数不能释放 DLL 包含的 hook 过程 这是因为全局 hook 过程是被所有应用程序进程调 用的 这就导致了所有的进程都隐性的调用了 LoadLibrary 函数 所以必须调用 FreeLibrary 函数释放 DLL Monitoring System Events 下面的例子使用了不同的特定线程 hook 过程去监视系统事件 它示范了怎样使用下面的 hook 过程去处理事件 WH CALLWNDPROC WH CBT WH DEBUG WH GETMESSAGE WH KEYBOARD WH MOUSE WH MSGFILTER 用户可以通过使用菜单安装或者移走 hook 过程 当 hook 过程已经安装并且过程监视的 时间发生时 hook 过程将在应用程序主窗口客户区写出事件信息 原代码如下 define NUMHOOKS 7 Global variables typedef struct MYHOOKDATA int nType HOOKPROC hkprc HHOOKhhook MYHOOKDATA MYHOOKDATA myhookdata NUMHOOKS LRESULT WINAPI MainWndProc HWND hwndMain UINT uMsg WPARAM wParam LPARAM lParam static BOOL afHooks NUMHOOKS int index static HMENU hmenu switch uMsg caseWM CREATE Save the menu handle hmenu GetMenu hwndMain Initialize structures with hook data The menu item identifiers are defined as 0 through 6 in the header file They can be used to identify array elements both here and during the WM COMMAND message myhookdata IDM CALLWNDPROC nType WH CALLWNDPROC myhookdata IDM CALLWNDPROC hkprc CallWndProc myhookdata IDM CBT nType WH CBT myhookdata IDM CBT hkprc CBTProc myhookdata IDM DEBUG nType WH DEBUG myhookdata IDM DEBUG hkprc DebugProc myhookdata IDM GETMESSAGE nType WH GETMESSAGE myhookdata IDM GETMESSAGE hkprc GetMsgProc myhookdata IDM KEYBOARD nType WH KEYBOARD myhookdata IDM KEYBOARD hkprc KeyboardProc myhookdata IDM MOUSE nType WH MOUSE myhookdata IDM MOUSE hkprc MouseProc myhookdata IDM MSGFILTER nType WH MSGFILTER myhookdata IDM MSGFILTER hkprc MessageProc Initialize all flags in the array to FALSE memset afHooks FALSE sizeof afHooks return 0 caseWM COMMAND switch LOWORD wParam The userselected a hook command from the menu caseIDM CALLWNDPROC caseIDM CBT caseIDM DEBUG caseIDM GETMESSAGE caseIDM KEYBOARD caseIDM MOUSE caseIDM MSGFILTER Use the menu item identifier as an index into the array of structures with hook data index LOWORD wParam If the selected type of hook procedure isn t installed yet install it and check the associated menu item if afHooks index myhookdata index hhook SetWindowsHookEx myhookdata index nType myhookdata index hkprc HINSTANCE NULL GetCurrentThreadId CheckMenuItem hmenu index MF BYCOMMAND MF CHECKED afHooks index TRUE If the selected type of hook procedure is already installed remove it and remove the check mark from the associated menu item else UnhookWindowsHookEx myhookdata index hhook CheckMenuItem hmenu index MF BYCOMMAND MF UNCHECKED afHooks index FALSE default return DefWindowProc hwndMain uMsg wParam lParam break Process other messages default return DefWindowProc hwndMain uMsg wParam lParam return NULL WH CALLWNDPROC hook procedure LRESULT WINAPI CallWndProc int nCode WPARAM wParam LPARAM lParam CHAR szCWPBuf 256 CHAR szMsg 16 HDC hdc static int c 0 int cch if nCode 0 do not process message return CallNextHookEx myhookdata CALLWNDPROC hhook nCode wParam lParam Call an application defined function that converts a message constant to astring and copies it to a buffer LookUpTheMessage PMSG lParam szMsg hdc GetDC hwndMain switch nCode caseHC ACTION cch wsprintf szCWPBuf CALLWNDPROC tsk ld msg s dtimes wParam szMsg c TextOut hdc 2 15 szCWPBuf cch break default break ReleaseDC hwndMain hdc return CallNextHookEx myhookdata CALLWNDPROC hhook nCode wParam lParam WH GETMESSAGE hook procedure LRESULT CALLBACKGetMsgProc int nCode WPARAM wParam LPARAM lParam CHAR szMSGBuf 256 CHAR szRem 16 CHAR szMsg 16 HDC hdc static int c 0 int cch if nCode 0 do not process message return CallNextHookEx myhookdata GETMESSAGE hhook nCode wParam lParam switch nCode caseHC ACTION switch wParam casePM REMOVE lstrcpy szRem PM REMOVE break casePM NOREMOVE lstrcpy szRem PM NOREMOVE break default lstrcpy szRem Unknown break Call an application defined function that converts a message constant to a string and copies it to a buffer LookUpTheMessage PMSG lParam szMsg hdc GetDC hwndMain cch wsprintf szMSGBuf GETMESSAGE wParam s msg s d times szRem szMsg c TextOut hdc 2 35 szMSGBuf cch break default break ReleaseDC hwndMain hdc return CallNextHookEx myhookdata GETMESSAGE hhook nCode wParam lParam WH DEBUG hook procedure LRESULT CALLBACKDebugProc int nCode WPARAM wParam LPARAM lParam CHAR szBuf 128 HDC hdc static int c 0 int cch if nCode 0 do not process message return CallNextHookEx myhookdata DEBUG hhook nCode wParam lParam hdc GetDC hwndMain switch nCode caseHC ACTION cch wsprintf szBuf DEBUG nCode d tsk ld d times nCode wParam c TextOut hdc 2 55 szBuf cch break default break ReleaseDC hwndMain hdc return CallNextHookEx myhookdata DEBUG hhook nCode wParam lParam WH CBT hook procedure LRESULT CALLBACKCBTProc int nCode WPARAM wParam LPARAM lParam CHAR szBuf 128 CHAR szCode 128 HDC hdc static int c 0 int cch if nCode 0 do not process message return CallNextHookEx myhookdata CBT hhook nCode wParam lParam hdc GetDC hwndMain switch nCode caseHCBT ACTIVATE lstrcpy szCode HCBT ACTIVATE break caseHCBT CLICKSKIPPED lstrcpy szCode HCBT CLICKSKIPPED break caseHCBT CREATEWND lstrcpy szCode HCBT CREATEWND break caseHCBT DESTROYWND lstrcpy szCode HCBT DESTROYWND break caseHCBT KEYSKIPPED lstrcpy szCode HCBT KEYSKIPPED break caseHCBT MINMAX lstrcpy szCode HCBT MINMAX break caseHCBT MOVESIZE lstrcpy szCode HCBT MOVESIZE break caseHCBT QS lstrcpy szCode HCBT QS break caseHCBT SETFOCUS lstrcpy szCode HCBT SETFOCUS break caseHCBT SYSCOMMAND lstrcpy szCode HCBT SYSCOMMAND break default lstrcpy szCode Unknown break cch wsprintf szBuf CBT nCode s tsk ld dtimes szCode wParam c TextOut hdc 2 75 szBuf cch ReleaseDC hwndMain hdc return CallNextHookEx myhookdata CBT hhook nCode wParam lParam WH MOUSE hook procedure LRESULT CALLBACKMouseProc int nCode WPARAM wParam LPARAM lParam CHAR szBuf 128 CHAR szMsg 16 HDC hdc static int c 0 int cch if nCode 0 do not process the message return CallNextHookEx myhookdata MOUSE hhook nCode wParam lParam Call an application defined function that converts a message constant to astring and copies it to a buffer LookUpTheMessage PMSG lParam szMsg hdc GetDC hwndMain cch wsprintf szBuf MOUSE nCode d msg s x d y d d times nCode szMsg LOWORD lParam HIWORD lParam c TextOut hdc 2 95 szBuf cch ReleaseDC hwndMain hdc return CallNextHookEx myhookdata MOUSE hhook nCode wParam lParam WH KEYBOARD hook procedure LRESULT CALLBACKKeyboardProc int nCode WPARAM wParam LPARAM lPar
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年 贵州烟草专卖局试题附答案
- 中国抛光铝隔条项目投资可行性研究报告
- 2025年 防城港市市级机关遴选考试笔试试题附答案
- 2025年中国柔性显示行业市场发展监测及投资潜力预测报告
- 2022-2027年中国定制酒行业市场全景评估及发展战略规划报告
- 项目课程的概念原理与设计
- 中国厦门市汽车服务市场调查研究及行业投资潜力预测报告
- 中国马靴型反光鞋套行业市场发展前景及发展趋势与投资战略研究报告(2024-2030)
- 昆明数控刀柄项目投资分析报告模板范本
- 2020-2025年中国公共厕所行业市场前景预测及投资战略研究报告
- 2024年湖南融通资源循环产业有限公司技能岗位招聘真题
- 2025年安徽省农业职业技能大赛(水生物病害防治员)备赛试题库(含答案)
- 静电放电(ESD)及其防护措施培训课件
- 城市更新中历史文化街区非物质文化遗产保护与开发报告
- 家装修泥水工合同协议
- 2023承压设备产品焊接试件的力学性能检验
- ESG趋势下企业财务管理新挑战
- 2024年公安机关理论考试题库500道(基础题)
- 2024年11月-矿山隐蔽致灾因素普查
- DBJ51T 163-2021 成都轨道交通设计防火标准
- 加热炉安全操作规程培训课件
评论
0/150
提交评论