
HOOK API(一)-HOOK基础知识和鼠标钩示例
原始来源:
代码:
0x00的原因
我目前正在从事毕业项目,并且有一个功能需要实现剪贴板的监视和过程的防终止保护。我本来想从内核级别实现它,但我一无所知。最终决定从调用层开始,即使用HOOK API技术来挂钩相应的API,从而实现预期的功能。在这种需求下,我开始学习HOOK API。
0x01什么是HOOK API
HOOK(钩,钩)是一种类似于Windows平台下的中断的机制。 HOOK机制允许应用程序拦截和处理Windows消息或指定的事件。发送指定的消息后,HOOK程序可以在到达目标窗口之前捕获该消息,从而获得对该消息的控制权,然后处理该消息或进行修改,添加我们需要的功能。根据其使用范围,挂钩可分为螺纹挂钩和系统挂钩。其中,系统挂钩具有相当大的功能,可以拦截,处理和监视几乎所有Windows消息。该技术涉及两个重要的API,一个是SetWindowsHookEx,即安装挂钩;另一个是SetWindowsHookEx。另一个是UnHookWindowsHookEx,即卸载钩。
本文中使用的HOOK API技术是指拦截系统或进程对API函数的调用,以便将API的执行流重定向到我们指定的代码段,从而实现我们所要实现的功能需要。 Windows下的每个进程都有其自己的地址空间,并且该进程只能在其地址空间中调用函数。因此,HOOK API的关键步骤是尝试将其自己的代码段注入到目标进程中,以进一步实现目标进程所拦截的API。但是,Microsoft不提供HOOK API调用接口,该接口要求开发人员实施自己的编程。众所周知的防病毒软件和防火墙软件都是使用HOOK API实现的。
一般来说,HOOK API由两个组件组成,即实现HOOK API的DLL文件和启动注入的主调用程序。本文利用HOOK API技术拦截剪贴板相关的API函数,从而实现对剪贴板内容的监视功能,并利用该技术来实现过程防终止功能。 DLL文件支持HOOK API的实现,并且主客户端程序将在初始化过程中连同HOOK API函数一起将DLL注入到目标进程中。这里的鼠标钩属于系统钩。
0x02挂钩的类型1、按事件分类
有以下几种常见类型
([1)键盘挂钩和低级键盘挂钩可以监视各种键盘消息。
([2)鼠标钩和低级鼠标钩可以监视各种鼠标消息。
([3)Shell挂钩可以监视各种Shell事件消息。例如启动和关闭应用程序。
(4)日志挂钩可以记录从系统消息队列中提取的各种事件消息。
(5)窗口过程挂钩监视从系统消息队列发送到目标窗口的所有消息。
此的本地挂钩,它们不会被注入任何旅行地址空间。 (估计按钮向导是使用此钩子完成的)
7、WH_JOURNALRECORD挂钩
WH_JOURNALRECORD挂钩用于监视和记录输入事件。通常,您可以使用此挂钩来记录连续的鼠标和键盘事件,然后使用WH_JOURNALPLAYBACK挂钩来播放它们。 WH_JOURNALRECORD Hook是全局Hook,不能像特定于线程的Hook一样使用。 WH_JOURNALRECORD是系统范围的本地挂钩,它们不会被注入任何旅行地址空间。
8、WH_KEYBOARD挂钩
在应用程序中,WH_KEYBOARD挂钩用于监视由GetMessage或PeekMessage函数返回的WM_KEYDOWN和WM_KEYUP消息。您可以使用此挂钩来监视输入到消息队列中的键盘消息。
9、WH_KEYBOARD_LL挂钩
WH_KEYBOARD_LL挂钩监视输入到线程消息队列中的键盘消息。
10、WH_MOUSE挂钩
WH_MOUSE Hook监视从GetMessage或PeekMessage函数返回的鼠标消息。使用此挂钩可以监视输入到消息队列中的鼠标消息。

1 1、 WH_MOUSE_LL挂钩
WH_MOUSE_LL Hook监视输入到线程消息队列中的鼠标消息。
1 2、WH_MSGFILTER和WH_SYSMSGFILTER挂钩
WH_MSGFILTER和WH_SYSMSGFILTER钩子使我们可以监视菜单,滚动条,消息框,对话框消息,并发现用户使用ALT + TAB或ALT + ESC组合键来切换窗口。 WH_MSGFILTER Hook只能监视由安装了hook子例程的应用程序创建的传递到菜单,滚动条,消息框的消息以及传递给对话框的消息。 WH_SYSMSGFILTER挂钩监视所有应用程序消息。 WH_MSGFILTER和WH_SYSMSGFILTER挂钩允许我们在模式循环期间过滤消息,这等效于在主消息循环中过滤消息。 WH_MSGFILTER挂钩可以通过调用CallMsgFilter函数直接调用。通过使用此功能,应用程序可以在模式循环期间使用与主消息循环中相同的代码来过滤消息。
1 3、WH_SHELL挂钩
Shell应用程序可以使用WH_SHELL Hook接收重要的通知。激活Shell应用程序以及创建或破坏顶层窗口时,系统将调用WH_SHELL Hook子例程。
WH_SHELL有5种情况:
按照惯例,shell应用程序不接收WH_SHELL消息。因此,在应用程序可以收到WH_SHELL消息之前,应用程序必须调用SystemParametersInfo函数进行注册。
以上是13种常用的钩子类型!
2、按使用范围分类
主要有线程钩子和系统钩子
(1)线程挂钩监视指定线程的事件消息。
(2)系统挂钩监视系统中所有线程的事件消息。由于系统挂钩影响系统中的所有应用程序,因此必须将挂钩函数放置在单独的动态链接库(DLL)中
输入。这是系统挂钩和线程挂钩之间的最大区别。
一些要点需要解释:
(1)如果针对同一事件(例如,鼠标消息)同时安装了线程挂钩和系统挂钩,则系统将首先自动调用线程挂钩,然后再自动调用系统挂钩。
(2)可以为同一事件消息安装多个钩子处理过程。这些钩子处理过程形成一个钩子链。完成当前钩子处理后,应将钩子信息传递给下一个钩子函数。并且最近安装的钩子放置在链的开头,最早安装的钩子放置在末尾,也就是说,后来添加的钩子首先获得控制权。
(3)挂钩,尤其是系统挂钩,会消耗消息处理时间并降低系统性能。仅在必要时安装挂钩,并在使用后及时卸载它们。
0x03写钩子程序
编写钩子程序的步骤分为三个步骤:定义钩子函数,安装钩子和卸载钩子。
1。定义挂钩函数
hook函数是一个特殊的回调函数。在由挂钩监视的特定事件发生之后,系统将调用挂钩函数进行处理。不同事件的钩子函数形式不同。以鼠标钩子函数为例,说明钩子函数的原型:

LALL回调HookProc(int nCode,WPARAM wParam,LPARAM lParam)
参数wParam和lParam包含已挂起的消息的信息,例如鼠标位置,状态,键盘键等。nCode包含有关消息本身的信息,例如是否从消息队列中将其删除。
我们首先在hook函数中实现自定义函数,然后调用函数CallNextHookEx。挂钩信息将传递到挂钩链中的下一个挂钩函数。 CallNextHookEx的原型。如下:
LRESULT CallNextHookEx(提示hhk,int nCode,WPARAM wParam,LPARAM lParam)
参数hhk是钩子句柄。 nCode,wParam和lParam是挂钩函数。
当然,您也可以通过直接返回TRUE来丢弃消息,这将阻止消息的传递。
2。安装钩
程序初始化后,调用函数SetWindowsHookEx安装挂钩。函数原型为:
HHOOK SetWindowsHookEx(int idHook,HOOKPROC lpfn,INSTANCE hMod,DWORD dwThreadId)
参数idHook表示钩子类型,它与钩子函数类型一一对应。例如,WH_KEYBOARD表示已安装键盘挂钩,WH_MOUSE表示鼠标挂钩等。
Lpfn是挂钩函数的地址。
HMod是挂钩函数所在实例的句柄。对于线程挂钩,此参数为NULL;对于线程挂钩,此参数为NULL。对于系统挂钩,此参数是挂钩函数所在的DLL句柄。
dwThreadId指定由挂钩监视的线程的线程号。对于全局挂钩,此参数为NULL。
SetWindowsHookEx返回已安装挂钩的句柄。
3。卸载钩子
当不再使用挂钩时,必须及时将其卸载。只需调用函数:
BOOL UnhookWindowsHookEx(HHOOK hhk)很好。
值得注意的是,线程钩子和系统钩子的钩子函数的位置是完全不同的。线程挂钩通常位于当前线程或从当前线程派生的线程中,并且系统挂钩必须放置在独立的动态链接库中,这在实现时比较麻烦。
0x04示例低级鼠标挂钩程序
从0x02节开始,有两种类型的鼠标挂钩,一种是WH_MOUSE,另一种是WH_MOUSE_LL。其中,WH_MOUSE_LL Hook和WH_MOUSE_LL Hook监视输入到线程消息队列的鼠标消息。此示例测试WH_MOUSE_LL。
参考前面的摘要,我们可以看到编写钩子程序的三个步骤是:
([1)定义挂钩函数:

LALL回调HookProc(int nCode,WPARAM wParam,LPARAM lParam)
([2)安装挂钩:
HHOOK SetWindowsHookEx(int idHook,HOOKPROC lpfn,INSTANCE hMod,DWORD dwThreadId)
([3)卸载钩子:
BOOL UnhookWindowsHookEx(HHOOK hhk)
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/bofangqi/article-321890-1.html
就应该这样
中国小心了
就算原料里有虫卵但后续的磨粉再到高温烤熟密封包装都会让虫卵坏死