基于HOOK技术的监控软件设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2 W H_CALLW ND PROC 钩子应用实例
通过外围监控方式实现对特定窗体创建和销毁消息进行监
控有两种方式 :一种方式是根据窗体的标题名称的不同实施监 控 ,另一种方式是根据窗体类名的不同实施监控 。如 W indows常 规窗体的类名是 #32770, IE广告窗体通常是无标题窗体 。本实例 中受控窗体是某公司自行研制的软件提示信息窗体 ,其窗体数量 较多 ,标题各不相同 ,但窗体外观样式雷同 ,类名相同 ,所以本文 采用第二种方式进行监控 。通过对其提示信息窗体类名进行分析
MO RN ITO R I NG SO FTW ARE D ES IGN BASED O N W I NDOW S HOO K TECHNOLO GY
Zhang Yong Xing Honghong Zhang J ilei
(D epa rtm en t of B asic S cience, N ava l A eronau tica l Engineering Institu te, Yan ta i 264001, S handong, Ch ina)
end; PShareMem = ^TShareMem; {定义该记录型的指针 }
2. 2 注入受控进程方式
此处通过挂钩函数将 WH _CallW ndProc类型的钩子注入受 控进程 。
Procedure StartHook; stdcall;
B EG IN
IF errorhook = 0 then { errorhook是自定义的 Thandle 类型的变量 , 用来存储挂钩函数返 回值 。} BEGIN {注入受控进程 }
可以知道 :该类窗体的类名为用户自定义的 TmessageD ialogForm。 实例包括两部分 :动态连接库 dll部分及可执行文件 exe部
分 。在动态连接库文件中主要通过挂钩函数将特定内存映像文
件映射到受控软件进程空间中去 ,并通过钩子函数实现对 Tmes2 sageD ialogForm窗体的截获 ,截获后向 exe程序发送特定信息 。 exe文件中主要实施对截获消 息的处理 ,比如记录 、改写 、翻 译或实施信息放大等操作 。
B EG IN IF ( nCode = HC_Action) then{表示截获有效消息 }
B EG IN HHookinf: = PcwpStruct( lPar) ; {将消息的左参数转变为 PcwpStruct 类型 }
Keywords W indows hook M essage Monitor
0 引 言
监控软件设计一般是在受控软件源代码未知的条件下进行 的 。解决该问题的方法一般有两种 :一种是实施嵌入式编程 ,即 通过分析受控软件的反编译代码 ,找出实现所要求功能的具体 代码段 ,然后通过汇编语言对受控软件实施改写 ,再重新编 译 [1 ] 。这种方法的优点是监控软件和受控软件可以合于一体 , 运行效率高 ;缺点是反编译后的汇编代码复杂 ,不易分析 ,另外 嵌入式编程只分析了受控软件的一部分代码 ,未能从整体上了 解源代码的具体运行过程 ,这不仅破坏了受控软件源代码的完 整性 ,也会给受控软件运行带来新的不稳定因素 。另一种方法 是避开受控软件源代码 ,采用外围监控 ,即为受控软件构建一个 外壳 ,通过消息注入技术和内存映像文件来实现受控软件与监 控软件的信息交流 ,也叫 HOOK技术 。该种方法既可以保证不 破坏受控软件的完整性和稳定性 ,又能实现对特定消息的监控 。 本文主要是通过第二种方法实现对某受控软件信息窗体创建和 销毁消息进行监控 。文中的编程方法还可用于运行电脑程序项 目监控 、实时控制软件的运行状态记录 、特定窗口信息过滤处理 和软件助手制作等领域 。
) : Hhook; stdcall;
其中 idHook取 WH _CALLWNDPROC时 ,将注册一个 WH _ CALLWNDPROC类型钩子 ,该类型钩子在受控软件 SENDM ES2 SAGE函数被调用时起作用 。
(2) 钩子链 钩子在得到控制权后 ,如果要将得到的消息继续传递给下 一个钩子 ,那么它必须用 CallNextHookEx函数来传递它 ,否则应 直接返回 0值 。调用下一个钩子函数的 W indow s AP I函数 Call2 NextHookEx的声明如下 :
摘 要 介绍了 W indow s系统钩子的运行机制 ,给出了在 Delphi编程环境中利用 WH _CALLWNDPROC系统钩子实现对特定窗口 的创建和销毁消息进行截获和处理的具体实现方法 ,解决了在软件源代码未知的前提下对软件实施外围监控的问题 。该种方法可 应用于软件运行状态监控 、IE广告过滤 ,软件助手制作等领域 。 关键词 W indow s钩子 消息 监控
1. 2 D elph i下钩子的安装和卸载
(1) 挂钩函数 在 Delphi环境下要安装钩子要使用 W indow s AP I挂钩函数 SetW indow sHookEx,该函数将监控程序定义的钩子过程安装到 钩子链中 。
收稿日期 : 2007 - 01 - 22。张勇 ,讲师 ,主研领域 :系统分析与集成 , 计算机应用系统设计 ,网格技术 。
dll文件 工 作 流 程 如 图 1 所示 。
限于篇幅关系 ,本文仅列 出 dll文件中的主要代码并对 其进行简要说明 。
2. 1 内存映像文件定义
图 1 dll文件工作流程
内存映像文件是在监控软件和受控软件之间进行信息传递
的数据结构 ,通过在 dll文件中定义内存映像文件可以把该数据
结构映射到受控软件的进程空间中去 。
在使用 W H _CALLWNDPROC 钩子时 ,其 lParam 参数中包 含了窗口创建和销毁的消息码 。通过比较其 lParam 参数可以 识别当前的消息类型 。
(3) 脱钩函数 如果要撤销当前已安装的钩子 ,则要使用 UnHookW indow2 sHookEx函数 ,其声明如下 : UnHookW indowsHookEx ( hhk: Hhook) : Boolean; {其中 hhk是待撤销 钩子的句柄 。}
Function CallW ndProc ( nCode: integer; wPar: W PARAM; lPar: LPARAM ) : lResult; stdcall;
var HHookinf: PcwpStruct; {WH_CallW ndProc类型钩子消息结构指针 } Buffer,MyCap tion: array[ 0. . 127 ] of Char; {存放窗口标题信息缓冲 区}
第 2期
张勇等 :基于 HOOK技术的监控软件设计
121
以下是 Delphi下的 SetW indow sHookEx函数声明 [2 ] : SetW indowsHookEx ( idHook: Integer; {钩子类型标志 , 此处为 WH _
CALLWND PROC } lpfn: TFNHookProc; {安装钩子函数的指针 } hmod: H INST; {钩子函数所在模块句柄 } dwThread Id: DWORD {关联的线程 ,本文此处为 0,表示系统级钩子 }
errorhook: = SetW indowsHookEx ( WH _ CallW ndProc, CallW ndProc, H Instance, 0) ; {其中 CallW ndProc是自定义的钩子回调函数名称 }
END;
END;
2. 3 自定义钩子函数
该函数实现对 TM essageD ialogForm 类型窗体进行截获 ,并 将所截获的窗体句柄及窗体标题存入前述的内存映像文件中 , 同时向 exe文件发送创建或销毁两种不同的消息 , exe文件在收 到该消息后读取内存映像文件中的特定内容进行处理 [3 ] 。
TShareMem = packed record hProcW nd: HWND; {监控软件句柄 } hHookW nd: HWND; {受控消息所在窗口句柄 } Text: array[ 0. . 127 ] of Char; {窗口标题信息字符串 ,最多 128 个字 符 ,返回该信息的目的是实施数据库对照信息放大 }
Abstract W indow s systematic hook and its operation mechanism are introduced. In Delphi p rogramm ing environment, using WH _CALL2 WNDPROC systematic hook, the specific realization cap turing and handling method is given for specific w indow body creating or destroy mes2 sage. Under unknown software source code environment, it imp lements the p roblem peripheral monitoring for it. This method can be app lied in monitoring the state of software operation, software assistance and IE advertisement filter.
第 26卷第 2期 2009年 2月
计算机应用与软件 Computer App lications and Software
Vol126 No. 2 Feb. 2009
基于 HOO K技术的监控软件设计
张 勇 邢红宏 张继磊
(海军航空工程学院基础实验部 山东 烟台 264001)
Result: = CallNextHookEx ( hhk: Hhook;wenku.baidu.comnCode: Integer; wParam:
W PARAM; lParam: LPARAM )
hhk是当前钩子的句柄 ,即建立钩子时 SetW indow sHookEx 函数的 返 回 值 。 nCode 用 于 调 用 下 一 个 挂 钩 函 数 。wParam、 lParam 都是与钩子类型和挂钩函数有关的参数 。
1 钩子函数及其运行机制
1. 1 W indows系统钩子
消息机制是 W indow s的主要特性之一 ,是 W indow s系统本 身的驱动机制 。W indow s通过钩子来探测其它进程并改变其它 进程的行为 。W indow s钩子共有 14种 ,每种钩子分别用于捕获
某一特定类型或某一范围的消息 。钩子分为线程钩子和系统钩 子两类 ,在动态链接库 (. dll)文件中加载系统钩子 ,可以将自定 义的内存块 (内存映像文件 )映射到其他进程的地址空间中去 。 一旦在 W indow s的消息处理链中插入某种钩子 ,就可以捕获指 定进程中特定类型的 W indow s消息 ,所有向该进程发送的特定 消息都先经过该函数进行处理 。通过“钩挂 ”程序 ,可以给 W in2 dows一个处理或过滤某种事件的回调函数 ,该函数叫作“钩子 函数 ”。在特定的消息发出 ,却没有到达目的窗口之前 ,钩子函 数就先捕获该消息 ,即钩子函数先得到控制权 。可以在回调函 数中实现某类消息的处理过程 ,钩子函数既可以加工处理 (改 变 )该消息 ,也可以不作处理而向下传递该消息 ,还可以强制结 束该消息的传递 。对每种类型的钩子由系统维护一个钩子链 , 最后安装的钩子放在链的开始 ,而最先安装的钩子放在最后 ,也 就是后加入的钩子先获得控制权 。国内目前发表的文章 [2~4 ]主 要就键盘钩子 、鼠标钩子 、外壳钩子及日志钩子进行了阐述 ,对 WH _CALLWNDPROC钩子的使用方法及其具体应用的阐述很 少 。本文主要是利用 WH _CALLWNDPROC钩子实现对特定类 型窗口创建和销毁的消息进行监视 ,并在可执行文件中实施对 截获消息的具体处理 。
相关文档
最新文档