没有合适的资源?快使用搜索试试~ 我知道了~
首页简述hook,并且解释在Win32系统下,如何使用hook编程
简述hook,并且解释在Win32系统下,如何使用hook编程
4星 · 超过85%的资源 需积分: 11 13 下载量 178 浏览量
更新于2023-03-03
评论
收藏 56KB DOC 举报
hook指出了系统消息处理机制。利用hook,可以在应用程序中安装子程序监视系统和进程之间的消息传递,这个监视过程是在消息到达目的窗口过程之前
资源详情
资源评论
资源推荐
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 CALLBACK HookProc(
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_JOURNALPLAYBACK hook 已经安装,正常的鼠标和键盘事件就是无效
的。WH_JOURNALPLAYBACK hook 是全局 hook,它不能象线程特定 hook 一样使用。WH_JOURNALPLAYBACK hook 返回超时值,这个值
告诉系统在处理来自回放 hook 当前消息之前需要等待多长时间(毫秒)。这就使 hook 可以控制实时事件的回放。
WH_JOURNALRECORD Hook
WH_JOURNALRECORD Hook 用来监视和记录输入事件。典型的,可以使用这个 hook 记录连续的鼠标和键盘事件,然后通过使用
WH_JOURNALPLAYBACK Hook 来回放。WH_JOURNALRECORD hook 是全局 hook,它不能象线程特定 hook 一样使用。
WH_KEYBOARD Hook
在应用程序中,WH_KEYBOARD Hook 用来监视 WM_KEYDOWN and WM_KEYUP 消息,这些消息通过 GetMessage or PeekMessage
function 返回。可以使用这个 hook 来监视输入到消息队列中的键盘消息。
WH_KEYBOARD_LL Hook
WH_KEYBOARD_LL Hook 监视输入到线程消息队列中的键盘消息。
WH_MOUSE Hook
WH_MOUSE Hook 监视从 GetMessage or PeekMessage function 返回的鼠标消息。使用这个 hook 监视输入到消息队列中的鼠标消息。
WH_MOUSE_LL Hook
WH_MOUSE_LL Hook 监视输入到线程消息队列中的鼠标消息。
WH_MSGFILTER and WH_SYSMSGFILTER Hooks
WH_MSGFILTER and WH_SYSMSGFILTER Hooks 使我们可以监视菜单,滚动条,消息框,对话框消息并且发现用户使用 ALT+TAB or
ALT+ESC 组合键切换窗口。WH_MSGFILTER hook 只能监视传递到菜单,滚动条,消息框的消息,以及传递到通过安装了 hook 过程的应用
程序建立的对话框的消息。WH_SYSMSGFILTER Hook 监视所有应用程序消息。
WH_MSGFILTER and WH_SYSMSGFILTER Hooks 使我们可以在模式循环期间过滤消息,这等价于在主消息循环中过滤消息。
通过调用 CallMsgFilter function 可以直接的调用 WH_MSGFILTER hook。通过使用这个函数,应用程序能够在模式循环期间使用相同的代码
去过滤消息,如同在主消息循环里一样。
WH_SHELL Hook
外壳应用程序可以使用 WH_SHELL Hook 去接收重要的通知。当外壳应用程序是激活的并且当顶层窗口建立或者销毁时,系统调用
WH_SHELL Hook 过程。
按照惯例,外壳应用程序都不接收 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;
剩余13页未读,继续阅读
电子精灵
- 粉丝: 1
- 资源: 11
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论1