- 6
- 0
- 约2.65万字
- 约 25页
- 2017-05-15 发布于贵州
- 举报
WINDOWS子HOOK
Windows系统中钩子具有相当强大的功能,通过这种技术可以对几乎所有的Windows?系统中的消息进行拦截、监视、处理。这种技术可以广泛应用于各种软件,尤其是需要有监控、自动记录等对系统进行监测功能的软件。本文针对这个专题进行了探讨,希望可以为读者朋友们起到抛砖引玉的作用。 一、钩子的机制及类型 Windows的应用程序都是基于消息驱动的,应用程序的操作都依赖于它所得到的消息的类型及内容。钩子与Dos中断截获处理机制有类似之处。钩子(Hook)是Windows消息处理机制的一个平台,通过安装各种钩子,应用程序可以在上面设置子程序以监视指定窗口的某种消息,并且当消息到达目标窗口之前处理它。 在Windows中,钩子有两种,一种是系统钩子(RemoteHook),它对消息的监视是整个系统范围,另一种是线程钩子(LocalHook),它的拦截范围只有进程内部的消息。对于系统钩子,其钩子函数(HookFunction)应在Windows系统的动态链接库(DLL)中实现,而对于线程钩子来说,钩子函数可以在DLL之中实现,也可以在相应的应用程序之中实现。这是因为当开发人员创建一个钩子时,Windows先在系统内存中创建一个数据结构,该数据结构包含了钩子的相关信息,然后把该结构体加到已经存在的钩子链表中去,并且新的钩子将排在老的钩子的前面。当一个事件发生时,如果安装的是一个局部钩子,当前进程中的钩子函数将被调用。如果是一个远程钩子,系统就必须把钩子函数插入到其它进程的地址空间,要做到这一点就要求钩子函数必须在一个动态链接库中,所以如果想要使用远程钩子,就必须把该钩子函数放到动态链接库中去。对于钩子所监视的消息类型来说,Windws一共提供了如下几种类型:如表1所示: 表一、Windows消息类型 消息类型常量标识?值?消息类型?适用范围? WH_CALLWNDPROC?4?发给窗口的消息?线程或系统? WH_CALLWNDPROCRET?12?窗口返回的消息?线程或系统? WH_CBT?5?窗口变化、焦点设定等消息?线程或系统? WH_DEBUG?9?是否执行其它Hook的Hook?线程或系统? WH_FOREGROUNDIDLE?11?前台程序空闲?线程或系统? WH_GETMESSAGE?3?投放至消息队列中的消息?线程或系统? WH_JOURNALPLAYBACK?1?将所记载的消息进行回放?系统? WH_JOURNALRECORD?0?监视并记录输入消息?系统? WH_KEYBOARD?2?键盘消息?线程或系统? WH_MOUSE?7?鼠标消息?线程或系统? WH_MSGFILTER?-1?菜单滚动条、对话框消息?线程或系统? WH_SHELL?10?外壳程序的消息?线程或系统? WH_SYSMSGFILTER?6?所有线程的菜单滚动条、对话框消息?系统? 二、VB编程中钩子的实现 (一)钩子函数(HOOK?Function)的格式。Hook?Function实际上是一个函数,如果是系统钩子,该函数必须放在动态链接库中。该函数有一定的参数格式,在VB中如下: Private?Function?HookFunc(ByVal?nCode?As?Long,ByVal?wParam?As?Long,ByVal?lParam?As?Long)As?Long? 其中,nCode代表是什么情况之下所产生的钩子,随钩子的不同而有不同组的可能值;参数wParam,lParam传回值包括了所监视到的消息内容,它随Hook所监视消息的种类和nCode的值不同而不同。对于用VB所设置的钩子函数,一般的框架形式如下: Private?Function?HookFunc(ByVal?nCode?As?Long,ByVal?wParam?As?Long,ByVal?lParam?As?Long)As?Long Select?case?of?nCode? case?ncode0:hookfunc=callnexthookex(hHookFunc,nCode,wParam,lParam) case值1:处理过程1:HookFunc=X1 case2:处理过程2:HookFunc=X1 …… end?select end?Function? 函数的传回值,如果消息要被处理,则传0,否则传1,吃掉消息。 (二)钩子的安装及执行。钩子的安装要用到几个API函数:可以使用API函数SetWindowsHookEx()把一个应用程序定义的钩子子程安装到钩子链表中。SetWindowsHookEx()函数的声明如下:Declare?func
原创力文档

文档评论(0)