钩子的一般使用

去年的时候玩了一段时间的HOOK,今天同学问起了一个问题,我忽然发现这部分内容已经忘记的差不多了。

好多东西其实还是需要记录下来的,记忆力越来越差,我自己应该明白、承认并面对这个事实的。

好了,大概说下我理解的钩子的使用吧。

1.钩子的原理

简单的说,当用户做了某些动作后(比如移动鼠标、点击鼠标、按下键盘),系统会把相应的动作转化为消息送入对应的窗口过程中进行处理。但是在这之前,系统会先做一件事:看下该动作是否已经被钩子链接过。如果该动作已经是某个钩子的目标对象,则系统会把该消息送给该钩子处理,而非原先的窗口过程函数。

2.钩子的使用方式

钩子是放在DLL中的,因为钩子的处理部分需要被链接到对应的进程(系统把消息打算发送至的消息队列所在的进程)空间中,而DLL作为一个模块可以实现这样的目的。

1)DLL中设置一个导出函数,以便客户端进行调用。在该导出函数中设置钩子:SetWindowsHookEx,该函数原型为:

其中lpfn的原型为LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam){}

2)新建一个*.def文件,用于说明该DLL的名称以及导出内容

3)build一下DLL,生成*.dll和*.lib,其中lib文件是用来在链接DLL时给出的该DLL信息,比如什么是导出的等

4)在客户端中,隐式链接(当然也可以显式啦)DLL。把DLL文件拷贝到客户端的EXE文件父目录下,lib文件拷贝到客户端的工作目录下。并同时指明链接时去链接这个lib文件,这可通过在该客户端的工程属性中的“链接器”——“命令行”——“附加选项”等方式。

 

3.需要注意:

1)如果使用全局钩子,可能希望让别的进程也能访问本进程。这可通过导出函数把本进程中的数据传进DLL中,让其链接到别的进程中。但是因为现在的系统都使用“使用时复制”技术——即虽然DLL中定义的是同一个变量,但是其值是不同的,系统为每个进程中的DLL都分配一个页面存储其值,所以要实现这点,必须把本进程中的某一个数据等设置为共享数据,这可通过“共享数据节”来实现。

在DLL中使用如下方式:

2)全局钩子不是万能的,它不能屏蔽所有的消息——系统级的,如"ALT+TAB"等。

 

关于钩子的DLL举例如下:

   

其DEF文件如下:

注意

因为已经设置屏蔽了一切鼠标动作,所以在客户端点击"开始监视"后把鼠标点向其他地方,这时候就不会有任何窗口获得焦点,此时按F2就没用了,因为没有焦点操作系统就不会给任何窗口发送消息,进而也就没有钩子被拦截到了。此时所需要做的就是按下"ALT+TAB"切换窗口使得任意一个窗口获得焦点即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值