详解易语⾔的钩⼦(钩⼦HOOK与APIHOOK区别)
在本篇内容⾥我们给⼤家详细分析了易语⾔中间的钩⼦概念以及HOOK与APIHOOK区别
钩⼦原英⽂名称 Hook ,钩⼦的意思是指拦截或截获。作⽤就是拦截程序中交互的数据,先经过我们预定的钩⼦处理接⼝程序,处理过后,再交还给原处理程序,或者⼲脆阻⽌,吃掉这些数据,让原处理程序什么也得不到。
钩⼦原来是Windows操作系统常⽤来检查系统与程序间通信的⼀些数据是否到达⽬标时⽤的,为不传之密,后来随着⼀些⾼⼿们的研究,逐渐的发现了这些秘密的技术并且公布了出来。同时还有更多的⼈在掌握了这些技术后,⽤在⾃已的软件开发中,实现出奇招⽽超过其它同类软件的功能⽽赢得市场。。钩⼦技术的种类上很多.
HOOK API和HOOK技术完全不同。尽管它们都是钩⼦。HOOK钩的是消息,它在系统将消息传递给应⽤程序之前截获它,然后进⾏操作、或修改消息、或停⽌消息的传递;
⽽HOOK API截获的是应⽤程序对系统API的调⽤,它在应⽤程序对系统API的调⽤之前截获此调⽤动作,让其转⽽调⽤我们所定义的函数(内容可能是进⾏⼀些操作后再调⽤原系统API)。
关于HOOK技术,微软为我们提供了现成的API,有固定的使⽤步骤。
⽽对于HOOK API技术,微软并没有向我们提供类似的API,没有那么简洁的步骤可供我们参考,也许是因为微软并不希望我们⽤这样的⼿段编程,所以相对要⿇烦⼀些。
WINDOWS的钩⼦函数可以认为是WINDOWS的主要特性之⼀。利⽤它们,您可以捕捉您⾃⼰进程或其它进程发⽣的事件。通过“钩挂”,您可以给WINDOWS⼀个处理或过滤事件的回调函数,该函数也叫做“钩⼦函数”,当每次发⽣您感兴趣的事件时,WINDOWS都将调⽤该函数。⼀共有两种类型的钩⼦:局部的和远程的。
局部钩⼦仅钩挂您⾃⼰进程的事件。
远程的钩⼦还可以将钩挂其它进程发⽣的事件。远程的钩⼦⼜有两种:
基于线程的它将捕获其它进程中某⼀特定线程的事件。简⾔之,就是可以⽤来观察其它进程中的某⼀特定线程将发⽣的事件。
系统范围的将捕捉系统中所有进程将发⽣的事件消息。当您创建⼀个钩⼦时,WINDOWS会先在内存中创建⼀个数据结构,该数据结构包含了钩⼦的相关信息,然后把该结构体加到已经存在的钩⼦链表中去。新的钩⼦将加到⽼的前⾯。当⼀个事件发⽣时,如果您安装的是⼀个局部钩⼦,您进程中的钩⼦函数将被调⽤。如果是⼀个远程钩⼦,系统就必须把钩⼦函数插⼊到其它进程的地址空间,要做到
这⼀点要求钩⼦函数必须在⼀个动态链接库中,所以如果您想要使⽤远程钩⼦,就必须把该钩⼦函数放到动态链接库中去。当然有两个例外:⼯作⽇志钩⼦和⼯作⽇志回放钩⼦。这两个钩⼦的钩⼦函数必须在安装钩⼦的线程中。原因是:这两个钩⼦是⽤来监控⽐较底层的硬件事件的,既然是记录和回放,所有的事件就当然都是有先后次序的。所以如果把回调函数放在DLL中,输⼊的事件被放在⼏个线程中记录,所以我们⽆法保证得到正确的次序。故解决的办法是:把钩⼦函数放到单个的线程中,譬如安装钩⼦的线程。
钩⼦⼀共有14种,以下是它们被调⽤的时机:
WH_CALLWNDPROC 当调⽤SendMessage时
WH_CALLWNDPROCRET 当SendMessage的调⽤返回时
WH_GETMESSAGE 当调⽤GetMessage 或 PeekMessage时
WH_KEYBOARD 当调⽤GetMessage 或 PeekMessage 来从消息队列中查询WM_KEYUP 或 WM_KEYDOWN
消息时
WH_MOUSE 当调⽤GetMessage 或 PeekMessage 来从消息队列中查询⿏标事件消息时
WH_HARDWARE 当调⽤GetMessage 或 PeekMessage 来从消息队列种查询⾮⿏标、键盘消息时
WH_MSGFILTER 当对话框、菜单或滚动条要处理⼀个消息时。该钩⼦是局部的。它时为那些有⾃⼰的消息处理
易语言收费版和免费版的区别过程的控件对象设计的。
WH_SYSMSGFILTER 和WH_MSGFILTER⼀样,只不过是系统范围的
WH_JOURNALRECORD 当WINDOWS从硬件队列中获得消息时
WH_JOURNALPLAYBACK 当⼀个事件从系统的硬件输⼊队列中被请求时
WH_SHELL 当关于WINDOWS外壳事件发⽣时,譬如任务条需要重画它的按钮.
WH_CBT 当基于计算机的训练(CBT)事件发⽣时
WH_FOREGROUNDIDLE 由WINDOWS⾃⼰使⽤,⼀般的应⽤程序很少使⽤
WH_DEBUG ⽤来给钩⼦函数除错

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。