引言
随着网络的发展和普及对网络的监控日益成为网络安全的必然要求也是管理和维护网络的一个有效手段当前已经有多种应用比较广泛的网络监控和过滤程序如美萍网管weblocker等它们都可以实现基于网络URL和IP地址的监控和过滤功能
本文将对如何开发一个嵌入到IE浏览器中的监控程序进行介绍该程序可以根据网络URL和IP地址进行监控和过滤并且记录系统日志从而使你对IE(当然是使用它的用户)的所有操作一览无余相信通过阅读本文会加深你对网络监控程序的理解以及提高你的COM编程能力和数据库编程能力
本文在Delphi 开发环境下实现数据库使用桌面数据库Access
基础知识
COM编程
COM(Component Object Model组建对象模型)是微软公司(Microsoft Company)提出的二进制通信规范用于软件组件之间的跨越多个进程机器硬件和操作系统的互操作它是一项通过接口(Interface)透明的传递封装数据的技术并且独立于语言和操作平台一个COM对象是实现一个或者若干个接口的对象即COM对象借助接口输出它所提供的服务
IE浏览器的体系结构
IE浏览器的体系结构如图所示其中MSHTML是位于SHDOCVW和HTML页面之间的COM对象SHDOCVW对象用于处理页面的显示而MSHTML用于处理页面的语法分析并且将页面中的标记转换为元素MSHTML是一个COM服务器允许COM客户端程序访问它对外提供的服务
实现IE浏览器嵌入式编程的基本方法是建立COM对象从而以COM客户端程序的形式和MSHTML COM服务器建立连接然后通过接口回调实现需要的控制功能也即首先建立COM对象实现系统规定的若干接口然后注册COM对象并且将COM对象的有关信息写入到IE浏览器扩展功能指定的注册表位置
嵌入式IE浏览器监控程序的实现
嵌入式IE浏览器监控程序的实现主要包括监控程序的实现和维护程序的实现两部分根据程序开发过程可以将其分为四个步骤下面分别对各个实现步骤进行详细介绍
实现COM对象
开发COM对象的任务就是建立一个能够与IE浏览器的MSHTML COM服务器建立连接并且通过接口回调实现控制功能的COM对象具体实现过程如下:
()运行Delphi依次点击File|New|Other切换到ActiveX页面选择ActiveX Library点击OK按钮即建立一个新的工程
() 再次点击File|New|Other切换到ActiveX页面选择COM Object点击OK按钮即出现如图所示的COM Object Wizard界面去掉Included Type Library复选框在Class Name中输入COM对象的名称IEMonitor然后点击OK按钮即新建了一个名称为TIEMonitor的COM对象(该COM对象的CLSID由系统自动生成)(见图)
()将工程和单元文件依次保存为DIEMonitordpr和UIEMonitorpas切换到UIEMonitorpas单元文件编辑TIEMonitor的定义形式如下:
TIEMonitor = class(TComObject IDispatch IObjectWithSite)
public
functionGetTypeInfoCount(out Count:Integer):HResult;stdcall;
function GetTypeInfo(IndexLocaleID:Integer;out TypeInfo):HResult;stdcall;
function GetIDsOfNames(const IID:TGUID;Names:Pointer;
NameCountLocaleID: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; varParams; VarResult ExcepInfo ArgErr: Pointer): HResult; stdcall;
private
IEThis:IWebBrowser;
Cookie:Integer;
protected
end;
注意在UIEMonitorpas单元文件的Uses中需要手动加入对SHDOCVW Dialogs SysUtils Forms的引用
其中主要是对IObjectWithSite接口的SetSite()方法和IDispatch接口的Invoke()方法的实现:首先通过SetSite()方法获得IE的WebBrowser接口然后寻找连接点并且通过调用Advise()方法建立COM自身与连接点的连接;当连接建立成功后IE在事件引发后会调用连接到自身的IDispatch接口对象的Invoke方法不同的事件对应不同的DispID编码因此可以通过在程序中判断DispID对不同的事件做出相应的处理系统主要对BeforeNavigateDownLoadComplete和OnQuit三个事件进行处理它们对应的DispID分别为和在Invoke()方法中根据DispID分别调用DoBeforeNavigate()DoDownLoadComplete()和DoOnQuit()函数实现相关处理和控制功能具体实现详见程序源代码
()编译工程生成DIEMonitordll文件
注册/卸载COM对象
注册COM对象包括注册COM对象以及将COM对象的有关信息写入到IE浏览器扩展功能指定的注册表位置下面分别对其注册方法进行介绍卸载方法分别和注册方法相对应
()注册/卸载COM对象一种方法是在Delphi开发环境下运行Run|Register ActiveX Server/Run|Unregister ActiveX Server自动完成COM对象的注册/卸载;另一种方法是通过调用MS Windows操作系统提供的regsvrexe命令进行注册
() 注册/卸载COM对象的有关信息到IE浏览器扩展功能指定的注册表位置将COM对象的CLSID写入到IE浏览器扩展功能指定的注册表位置后当IE浏览器启动时就通过该CLSID查找COM对象有关信息(如文件路径)从而实现了COM对象嵌入式功能扩展为了实现这个目的只需要在注册表的[HKEY_LOCAL_MACHINE\Software\Microsoft\ Windows\CurrentVersion\Explorer\Browser Helper Objects]项下建立一个名称为COM对象的CLSID的注册表项目即可
开发监控模块
监控模块主要完成对IE浏览器的监控功能在Invoke()函数中触发BeforeNavigator事件时调用执行主要包括ChkUrl()WriteSite()WriteLog()和GetIP()四个功能函数分别完成检查URL(及IP地址)记录URL和IP地址记录系统日志根据URL取得IP地址的功能分别简单介绍如下具体实现详见程序源代码
()ChkUrl()函数:它是监控模块的核心函数也是模块的入口函数ChkUrl()函数首先取得用户请求的URL并且调用GetIP()函数取得其对应的IP地址然后到系统中查找该URL及IP是否已经存在如果存在则根据系统保存的结果禁止/允许用户访问否则就根据系统的当前工作状态(禁止/允许)动态处理同时调用WriteSite()函数将该URL和IP地址保存到系统中最后调用WriteLog()函数记录系统日志
()WriteSite()函数:完成将URL和IP地址保存到系统中的功能同时记录系统当前日期和时间
()WriteLog()函数:将有关信息形成系统日志并且保存下来主要有网络URL和IP地址用户名称访问日期和时间处理结果(禁止/允许访问)等信息
()GetIP()函数:提供根据URL取得对应IP地址的功能通过调用TNMHTTP组件的相关功能实现:首先将URL赋值给TNMHTTP组件的Host属性然后调用ResolveRemoteHost()方法就可以从其RemoteIP属性中获得对应的IP地址
开发维护程序
维护程序主要实现系统参数维护和日志管理两方面功能在启动时需要管理员登录
()系统参数维护:启用/停止系统监控功能等程序界面如图所示
()系统日志管理:日志的查询打印等功能(见图)
总结和系统进一步完善计划
本文详细介绍了嵌入式IE浏览器监控程序的开发方法和实现过程该系统以COM对象的形式嵌入到IE浏览器中可以实现对IE浏览器(即用户)的监控功能