2024年9月6日发(作者:)
维普资讯
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
为钩子消息处理过程
用于各种软件.尤其是需要有监控、自动记录等对系统进行监测
m
KKThreadld=Cct
功能的软件。本文对钩子的实现的核心技术进行了详细论述.通
_
(hKKFindHwnd,NUUj;
过实例讨论了线程钩子的实现.并研究了一卡通系统与其他管
m_H0ok=SelWind0w居H0okEx(呲GⅡMESsAGE.C,etM ̄oe,g_hlnstDll,
理系统的集成问题。
m
_
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)・
本文发布于:2024-09-06 21:19:45,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/1725628785363010.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |