引 言 随着网络的发展和普及,对网络的监控日益成为网络安全的必然要求,也是管理和维护网络的一个有效手段。当前已经有多种应用比较广泛的网络监控和过滤程序,如美萍网管、we-blocker等,它们都可以实现基于网络URL和IP地址的监控和过滤功能。
本文将对如何开发一个嵌入到IE浏览器中的监控程序进行介绍,该程序可以根据网络URL和IP地址进行监控和过滤,并且记录系统日志,从而使你对IE(当然是使用它的用户)的所有操作一览无余。相信通过阅读本文,会加深你对网络监控程序的理解,以及提高你的COM编程能力和数据库编程能力。
本文在Delphi 6开发环境下实现,数据库使用桌面数据库Access 2000。
基础知识
1.COM编程
COM(Component Object Model,组建对象模型)是微软公司(Microsoft Company)提出的二进制通信规范,用于软件组件之间的跨越多个进程、机器、硬件和操作系统的互操作,它是一项通过接口(Interface)透明的传递封装数据的技术,并且独立于语言和操作平台。一个COM对象是实现一个或者若干个接口的对象,即COM对象借助接口输出它所提供的服务。
2.IE浏览器的体系结构 IE浏览器的体系结构如图1所示。其中MSHTML是位于SHDOCVW和HTML页面之间的COM对象,SHDOCVW对象用于处理页面的显示,而MSHTML用于处理页面的语法分析,并且将页面中的标记转换为元素。MSHTML是一个COM服务器,允许COM客户端程序访问它对外提供的服务。
实现IE浏览器嵌入式编程的基本方法是建立COM对象,从而以COM客户端程序的形式和MSHTML COM服务器建立连接,然后通过接口回调实现需要的控制功能。也即首先建立COM对象,实现系统规定的若干接口,然后注册COM对象,并且将COM对象的有关信息写入到IE浏览器扩展功能指定的注册表位置。
嵌入式IE浏览器监控程序的实现 嵌入式IE浏览器监控程序的实现主要包括监控程序的实现和维护程序的实现两部分,根据程序开发过程,可以将其分为四个步骤,下面分别对各个实现步骤进行详细介绍。
1.实现COM对象
开发COM对象的任务就是建立一个能够与IE浏览器的MSHTML COM服务器建立连接并且通过接口回调实现控制功能的COM对象,具体实现过程如下:
(1)运行Delphi,依次点击File|New|Other,切换到ActiveX页面,选择ActiveX Library,点击OK按钮,即建立一个新的工程。
(2) 再次点击File|New|Other,切换到ActiveX页面,选择COM Object,点击OK按钮,即出现如图2所示的COM Object Wizard界面,去掉Included Type Library复选框,在Class Name中输入COM对象的名称IEMonitor,然后点击OK按钮,即新建了一个名称为TIEMonitor的COM对象(该COM对象的CLSID由系统自动生成)(见图2)。
(3)将工程和单元文件依次保存为DIEMonitor.dpr和UIEMonitor.pas。切换到UIEMonitor.pas单元文件,编辑TIEMonitor的定义形式如下:
TIEMonitor = class(TComObject, IDispatch, IObjectWithSite) public function GetTypeInfoCount(out Count:Integer):HResult;stdcall; function GetTypeInfo(Index,LocaleID:Integer;out TypeInfo):HResult;stdcall; function GetIDsOfNames(const IID:TGUID;Names:Pointer; NameCount,LocaleID:Integer;DispIDs:Pointer):HResult;stdcall; function SetSite(const pUnkSite:IUnknown):HResult;stdcall; function GetSite(const riid:TIID;out site:IUnknown):HResult;stdcall; function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall; private IEThis:IWebBrowser2; Cookie:Integer; protected end; |
注意在UIEMonitor.pas单元文件的Uses中需要手动加入对SHDOCVW, Dialogs, SysUtils, Forms的引用。
其中主要是对IObjectWithSite接口的SetSite()方法和IDispatch接口的Invoke()方法的实现:首先通过SetSite()方法获得IE的WebBrowser接口,然后寻找连接点,并且通过调用Advise()方法建立COM自身与连接点的连接;当连接建立成功后,IE在事件引发后,会调用连接到自身的IDispatch接口对象的Invoke方法,不同的事件对应不同的DispID编码,因此可以通过在程序中判断DispID对不同的事件做出相应的处理。系统主要对BeforeNavigate2、DownLoadComplete和OnQuit三个事件进行处理,它们对应的DispID分别为250、104和253。在Invoke()方法中,根据DispID分别调用DoBeforeNavigate2()、DoDownLoadComplete()和DoOnQuit()函数实现相关处理和控制功能,具体实现详见程序源代码。
(4)编译工程,生成DIEMonitor.dll文件。