了解HHOOK之路(一)

意外的知道Windows中钩子机制,通过截获消息,获取想知道的密码,但自己对HHOOK一窍不通,不得不承认,这是一条非常不爽的路。不过,我急切的希望了解这方面的内容,原因不能直说,但绝无恶意。

 

 

HOOK机制(原理)

在安装钩子程序之前,系统直接处理应用程序的消息;而安装钩子后,每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,其内置的钩子函数就可以对该消息进行处理:可以改变该消息后才向系统传递,也可以不作修改继续传递,还可以丢弃该消息,从而中止该消息的传递。

 

 

HHOOK种类(消息)

钩子的种类很多,每种钩子可以截获并处理相应的消息,如键盘钩子可以截获键盘消息,鼠标钩子可以截获鼠标消息,外壳钩子可以截获启动和关闭应用程序的消息,日志铸于可以监视和记录输人事件。一旦设置多种钩子,系统就会建立一个钩子链表,该链表运作方式类似于栈,开始安装的钩子放在表尾,最后安装的绚子放在表头.捕获的消息从表头流向表尾.所以最后安装的钩子最有可能处理该消息

 

 

HOOK基本函数

 

1. 安装钩子   在程序初始化的时候,调用函数SetWindowsHookEx安装钩子。

其函数原型为:

HHOOK SetWindowsHookEx(int idHook, HOOK PROClpfn, INSTANCE hMod, DWORD dwThreadId)

 

idHook表示钩子类型,它是和钩子函数类型一一对应的。比如,WH_KEYBOARD表示安装的是键盘钩子,WH_MOUSE表示是鼠标钩子等等。

Lpfn是钩子函数的地址。

HMod是钩子函数所在的实例的句柄。对于线程钩子,该参数为NULL;对于系统钩子,该

参数为钩子函数所在的DLL句柄。

dwThreadId指定钩子所监视的线程的线程号。对于全局钩子,该参数为NULL

SetWindowsHookEx返回所安装的钩子句柄。

 

在这里我想提到的是:创建的动态DLL连接库的调用。我查询过,有隐式调用和显示调用两种。因为自己还不懂,所以后面继续;

 

2. 定义钩子函数    

钩子函数是一种特殊的回调函数。钩子监视的特定事件发生后,系统会调用钩子函数进行处理。不同事件的钩子函数的形式是各不相同的。

LRESULT  CALLBACK  HookProc(int  nCode, WPARAM  wParam,  LPARAM  lParam)

参数wParamlParam包含所钩消息的信息,比如鼠标位置、状态,键盘按键等。

nCode包含有关消息本身的信息,比如是否从消息队列中移出。我们先在钩子函数中实现自定义的功能,然后调用函数CallNextHookEx.把钩子信息传递给钩子链的下一个钩子函数。

 

CallNextHookEx.的原型如下:

LRESULT  CallNextHookEx(HHOOK hhk, int nCode,WPARAM wParam,LPARAM lParam)

 

hhk是钩子句柄。

nCodewParamlParam是钩子函数的参数

当然也可以通过直接返回TRUE来丢弃该消息,就阻止了该消息的传递。

 

3. 卸载钩子

当 不 再 使 用 钩 子 时 , 必 须 及 时 卸 载 。 简 单 地 调 用 函 数 

BOOL  UnhookWindowsHookEx(HHOOK  hhk)即可

 

现在就写到这里吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值