Win32钩子在一卡通系统中的应用

阅读: 评论:0

2024年9月6日发(作者:)

Win32钩子在一卡通系统中的应用

维普资讯

28 福建 电脑 2006年第9期 

Win32钩子在一卡通系统中的应用 

冯健文 

(韩山师范学院数学与信息技术学院广东潮州521041) 

【摘要】:介绍了WIN32系统中钩子机制的基本原理,重.&-vf ̄了其实现方法,并把该方法应用于一卡通系统集成中。 

成功实现了一卡通系统和原管理系统的罚款同步。实践证明,钩子技术有易实现、效果好、实用的优点。能解决一些常规方法 

不能解决的问题。 

【关键词】:钩子,截获,一卡通,API 

1.引言 

钩子(Hook)是一种易实现、效果好的API函数截获技术。 

在PDA、工业控制、教育软件开发中有着广泛的应用【”。钩子机制 

允许应用程序截获处理Window消息或特定事件。每次特定消 

息发出。在没有到达目的窗口前。就先被钩子程序捕获。因此可 

以定义钩子子程来加工处理、或继续传递该消息.还可以强制结 

束消息的传递。 

文章首先介绍了钩子机制的原理,重点讨论了其实现方法。 

然后基于线程钩子和API函数.对一卡通系统集成中的罚款同 

步问题给出了解决方法。 

2.Win32钩子工作原理 

2.1工作原理∞l 

每一个Hook都有一个与之相关联的指针列表.称之为钩子 

链表,由系统来维护。这个列表的指针指向指定的。应用程序定 

义的.被Hook子程调用的回调函数。也就是该钩子的各个处理 

子程。当与指定的Hook类型关联的消息发生时。系统就把这个 

消息传递到Hook子程。一些Hook子程可以只监视消息。或者 

修改消息.或者停止消息的前进。避免这些消息传递到下一个 

Hook子程或者目的窗口。最近安装的钩子放在链的开始,而最 

早安装的钩子放在最后.也就是后加入的先获得控制权。 

钩子子程是一个应用程序定义的回调函数(CAIJ.RACK 

Function1,用以监视系统或某一特定类型的事件。这些事件可以 

是与某一特定线程关联的.也可以是系统中所有线程的事件。钩 

子子程必须按照以下的语法定义: 

LRESULT CALLBACK HookProe (int nCode,Ⅵ吼 RAM 

wParam,LPARAM IParam); 

HookProe是应用程序定义的子程名字。nCode参数是Hook 

代码,Hook子程使用这个参数来确定任务。这个参数的值依赖 

于Hook类型.每一种Hook都有自己的Hook代码特征字符集。 

wParam和1Param参数的值依赖于Hook代码.但是它们的典型 

值是包含了关于发送或者接收消息的信息。 

2.2钩子的安装 

使用API函数SetWindowsHookEx0把一个应用程序定义的 

钩子子程安装到钩子链表中。该函数总是在Hook链的开头安装 

Hook子程。当指定类型的Hook监视的事件发生时,系统就调用 

与这个Hook关联的Hook链的开头的Hook子程。每一个Hook 

链中的Hook子程都决定是否把这个事件传递到下一个Hook 

子程 

HHOOK SetWindowsHookEx(int idHook,HOOKPROC lph, 

HINSTANCE hMod,DWORD dwThreadId) 

idHook是钩子的类型:lpfn是钩子子程的地址指针,如果 

dw,nlreadId参数为0.它必须指向DLL中的钩子子程:hMod是 

钩子函数的人口地址。一般设定其为本应用程序的实例句柄。如 

果dwThreadId标识当前进程创建的一个线程.而且子程代码位 

于当前进程.hMod必须为NULL。dwThreadId是与安装的钩子子 

受2003年度朝韩山师范学院重点科研课题资助(200306) 

程相关联的线程的标识符。如果为0,钩子子程与所有的线程关 

联。即为全局钩子。函数成功则返回钩子子程的句柄。失败返回 

NULL。 

以上所说的钩子子程与线程相关联是指在一钩子链表中发 

给该线程的消息同时发送给钩子子程。且被钩子子程先处理。 

2.3钩子的调用 

当某一事件发生需要调用钩子子程时.就要调用钩子处理 

函数。 

LRESU【 CALLBACK HooKProc (int nCode,WPARAM 

Param,LPARAM Epsom) 

注意一般此函数结尾处调用CallNextI-IokEx,以执行钩子链 

表所指的下一个钩子子程。否则安装了别的钩子的应用程序就 

会收不到钩子通知。从而产生错误的结果。这个函数成功时返回 

钩子链中下一个钩子过程的返回值.返回值的类型依赖于钩子 

的类型。这个函数的原型如下: 

LRESULT CallNextHookEx (HHOOK hhk;int nCode; 

WPARAM wParam;LPARAM IParam;1 

2.4钩子的卸载 

钩子在使用完之后需卸载。函数原型如下: 

UnHookWindowsHookEx f HH00K hhk;) 

函数成功返回TRUE。否则返回FALSE。 

3.钩子在一卡通系统中的应用 

3.1应用分析 

卡通是一种先进的信息化集成方案。学校实现一卡通后。 

非接触式IC卡代替原有的图书证、上机证、医疗证、饭卡以及其 

他消费活动的证件。在一卡通系统设计中。常会碰到这样的情 

况:某些管理系统已使用多年。数据库不开放。二次开发也很困 

难。无法支持一卡通功能;而重新开发基于一卡通的管理系统。 

成本代价又太高。一种合理的解决方案是实现一卡通系统与这 

些管理系统的简单无缝集成。我们已实现了原管理系统能接收 

IC卡中的证号数据。维持了原系统正常的工作。下面讨论的实 

例是采用钩子来解决罚款同步问题。 

钩子程序在一卡通系统和原管理系统间将起消息传递作 

用。原管理系统可以进行罚款。现要同时在消费者的IC卡帐户 

中扣除罚款金额。因为无法存取原系统数据库。因此采用钩子在 

原系统进行罚款操作时.拦截该管理系统的证号和罚款金额等 

数据。传递给一卡通系统,由一卡通系统进行IC卡扣费操作,同 

时使得原系统的罚款操作正常进行。 

程序主要流程如下:(1)确定使用的钩子类型;(2)建立DLL 

文件。定义钩子函数;(3)当一卡通系统捕获罚款功能的操作(如 

点击罚款菜单)时.就调用钩子函数在原管理系统的罚款窗口取 

得证号、金额等数据;(4)发送一条包含这些数据的消息给一卡 

通系统;(5)激活一卡通的罚款功能,实现罚款处理;(6)维持原 

系统的罚款操作 难点是实现对原罚款窗口创建时的消息的捕 

获。以及发送包含数据的消息来激活一卡通的罚款功能。 

维普资讯

2006年第9期 福建 电脑 29 

3.2实现过程 LAND Delphi 7.0编写。 

3.2.1确定钩子类型 

,,监控罚款窗口 

WindoWS的消息有很多类型.因此要先确定目标消息类型, 

f(hparwnd<>O)then 

从而确定使用的钩子类型。可使用SPY++工具查看要捕获消息 

SetKK.Hook(hPm-wnd):,,调用钩子 

的类型。每条消息的都标明有”SRPt.字符之一。”S”表明该消息是 

(2)处理拦截消息 

使用SendMessage发送到消息队列的.要等待返回.需使用 

钩子拦截的消息在(;etMs异Pr0c中进行加工处理,定义结构 

WH CALLWNDPROC钩子捕捉:”R”表明该消息是使用 

体COPYDATASTRUCT cds存储金额等数据.KHwnd和KChfld. 

SendMessage发送到消息队列.并经过目标窗口的处理函数处理 Hwnd保存罚款窗口句柄和按钮句柄 

过的消息,需使用WH

CALLWNDPROC肛1’钩子捕捉;”P”表明 

脯获原罚款窗口和按钮 

该消息是使用PostM_essage寄送到消息队列的。不要求返回。使 

HwrqD KHwnd=FindWindow(NUu.”罚款”): 

用WH

HWND KChildHwnd= 

_

GETMESSAGE钩子捕捉。本实例中需要捕获按钮的点 

::FindWindowEx(KHwnd,NUU ̄ Button”.”扣款”); 

击事件。采用WH GETMESSAGE捕捉。 

HCDS存放金额等数据 

3.2.2建立钩子DLL文件 

fi(((MSG‘)lParam)->mesMge== 

钩子子程一般放在DLL文件中.因为在Win32环境下就可 

WM

_

LBUTrONDOWN&&((MSG’)lParam卜>hwnd 

以在多个进程中共享数据.同时多次调用钩子子程时时间更短。 

=KChildHwnd) 兰截按钮消息 

卜・ 发送数据给一卡通系统(3.2.4节) 

采用了Visual C++6.0为DLL的编程工具。 

,,继续转发按钮消息(3.2.6节)J 

(1)建立钩子子程声明文件 

retum(CallNextHookEx(m_Hook.nCode.wPm IPm∞)); 

编辑KKHook.h文件: 

3.2.4发送数据 

dechpec(dlhxport)BOOL SetKKHook0; 

在GetMsgProc过程中。当拦截了按钮消息后.就把CDS结 

dcckpec(duexp0^)BOOL DisableKKHook0; 

构体通过WM COPYDATA类型消息发送给一卡通系统。 

编辑KKHook.def文件: 

LIBRARY ”KKHook” 

SendMessage(h_YKTHwnd,WM_COPYDATA,(WeARJ ̄M)KHwnd, 

DESCRIP11ON KKHook EILL 

(LPARAM)&cds);//发送数据给一卡通系统 

EXPORTS 

3.2.5激活一卡通系统 

SctKKHook@l 

DisableKKHook@2 

在一卡通系统,自定义一个消息MyC0pyDam,然后在该消 

(2)定义变量和函数 

息处理过程中.激活一卡通的罚款功能。 

饿nc1ude”KKHook.h”//钩子子程声明文件 

procedure MyCopyDataMsg(var mss:TMessage); 

#pr ̄gma data_seg(”shared”y,共享数据段 

begin KKForm:ifTKKForm.Create(application); 

HWND m 

end; 

_

KKHwnd=O; 

,,某管理系统句柄

HHOOK m_Hook=NUU //钩子句柄 

3.2.6维持原系统操作 

帕)Ja na dam_seg 0 

HWND h 

YKTHwnd NULL;

= 

//-- ̄ ̄ 

统句柄

最后.还必须得原罚款窗口能正常收到按钮消息.因此要在 

_

HINSTANCE g_hlnstDII=NUI L;//DLL实例 

GetMsgProc过程中模拟发送一个按钮消息。 

//消息处理函数 

SendMessage(KHwnd,WM—LBU兀 NDOWN,(WPARAM)KChHd— 

LRESULT WINAPI GetMsgProc(int nCode,WPARAM wP ̄am,LPARAM 1Param); 

自定义钩子子程 

Hwnd,o); 

12BAPI BOOL WINAH SetKKH0ok 

4.结束语 

(HWND hKKFindHwnd) 

钩子具有相当强大的功能.通过这种技术可以对几乎所有 

l DWORDm_KKThreadld=0;//线程ID 

的WIN32系统消息进行拦截、监视、处理。这种技术可以广泛应 

,,如果捕获目标窗口句柄。就获取线程句柄和安装钩子.设置CctMgProc 

为钩子消息处理过程 

用于各种软件.尤其是需要有监控、自动记录等对系统进行监测 

KKThreadld=Cct 

功能的软件。本文对钩子的实现的核心技术进行了详细论述.通 

_

(hKKFindHwnd,NUUj; 

过实例讨论了线程钩子的实现.并研究了一卡通系统与其他管 

m_H0ok=SelWind0w居H0okEx(呲GⅡMESsAGE.C,etM ̄oe,g_hlnstDll, 

理系统的集成问题。 

_

KKThreadld); 

if(m_Hook=NULL),,卸载钩子 

UnhookWindowsHookEx(m_Hook): 

参考文献: 

} 

1.刘亚,李广鑫,用利隼.API函数截获关奠技术研究Ⅱ】.微机发展,2004. 

3.2.3定义消息处理过程 

voll4.no8:58 

(1)监控罚款窗口 

2.RICHTEILJ.Windows拔心蝙程【M].北京:机械工业出版社,2000:204, 

在一卡通系统中采用线程函数监控罚款窗口.一旦取得窗 

2O9 

口句柄。就调用钩子。监控按钮消息。一卡通系统使用BOR— 

3.Charles Pc=old.Windows程序设计【M].北京:北京大学出版社,1999: 

162.165 

(上接第34页) 

2.刘宏志.计算机网络实验教学的实践与探索Ⅱ】.山西医科大学学报, 

参考文献: 2005,(4). 

1.牛卫红.计算机实验教学改革的探讨Ⅱ】.郑州牧业工程高等专科学校学 3.罗朝盛.计算机基础课程实验教学改革的新思路Ⅱ】.计算机教育。2005, 

报,2003.(2). (4)・ 

Win32钩子在一卡通系统中的应用

本文发布于:2024-09-06 21:19:45,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/1725628785363010.html

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

标签:钩子   消息   系统   子程   罚款   函数
留言与评论(共有 0 条评论)
   
验证码:
排行榜

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23