引 言
隨著網(wǎng)絡(luò)的發(fā)展和普及,對(duì)網(wǎng)絡(luò)的監(jiān)控日益成為網(wǎng)絡(luò)安全的必然要求,也是管理和維護(hù)網(wǎng)絡(luò)的一個(gè)有效手段。當(dāng)前已經(jīng)有多種應(yīng)用比較廣泛的網(wǎng)絡(luò)監(jiān)控和過濾程序,如美萍網(wǎng)管、we-blocker等,它們都可以實(shí)現(xiàn)基于網(wǎng)絡(luò)URL和IP地址的監(jiān)控和過濾功能。
本文將對(duì)如何開發(fā)一個(gè)嵌入到IE瀏覽器中的監(jiān)控程序進(jìn)行介紹,該程序可以根據(jù)網(wǎng)絡(luò)URL和IP地址進(jìn)行監(jiān)控和過濾,并且記錄系統(tǒng)日志,從而使你對(duì)IE(當(dāng)然是使用它的用戶)的所有操作一覽無余。相信通過閱讀本文,會(huì)加深你對(duì)網(wǎng)絡(luò)監(jiān)控程序的理解,以及提高你的COM編程能力和數(shù)據(jù)庫編程能力。
本文在Delphi 6開發(fā)環(huán)境下實(shí)現(xiàn),數(shù)據(jù)庫使用桌面數(shù)據(jù)庫Access 2000。
基礎(chǔ)知識(shí)
1.COM編程
COM(Component Object Model,組建對(duì)象模型)是微軟公司(Microsoft Company)提出的二進(jìn)制通信規(guī)范,用于軟件組件之間的跨越多個(gè)進(jìn)程、機(jī)器、硬件和操作系統(tǒng)的互操作,它是一項(xiàng)通過接口(Interface)透明的傳遞封裝數(shù)據(jù)的技術(shù),并且獨(dú)立于語言和操作平臺(tái)。一個(gè)COM對(duì)象是實(shí)現(xiàn)一個(gè)或者若干個(gè)接口的對(duì)象,即COM對(duì)象借助接口輸出它所提供的服務(wù)。
2.IE瀏覽器的體系結(jié)構(gòu)
IE瀏覽器的體系結(jié)構(gòu)如圖1所示。其中MSHTML是位于SHDOCVW和HTML頁面之間的COM對(duì)象,SHDOCVW對(duì)象用于處理頁面的顯示,而MSHTML用于處理頁面的語法分析,并且將頁面中的標(biāo)記轉(zhuǎn)換為元素。MSHTML是一個(gè)COM服務(wù)器,允許COM客戶端程序訪問它對(duì)外提供的服務(wù)。
實(shí)現(xiàn)IE瀏覽器嵌入式編程的基本方法是建立COM對(duì)象,從而以COM客戶端程序的形式和MSHTML COM服務(wù)器建立連接,然后通過接口回調(diào)實(shí)現(xiàn)需要的控制功能。也即首先建立COM對(duì)象,實(shí)現(xiàn)系統(tǒng)規(guī)定的若干接口,然后注冊COM對(duì)象,并且將COM對(duì)象的有關(guān)信息寫入到IE瀏覽器擴(kuò)展功能指定的注冊表位置。
嵌入式IE瀏覽器監(jiān)控程序的實(shí)現(xiàn)
嵌入式IE瀏覽器監(jiān)控程序的實(shí)現(xiàn)主要包括監(jiān)控程序的實(shí)現(xiàn)和維護(hù)程序的實(shí)現(xiàn)兩部分,根據(jù)程序開發(fā)過程,可以將其分為四個(gè)步驟,下面分別對(duì)各個(gè)實(shí)現(xiàn)步驟進(jìn)行詳細(xì)介紹。
1.實(shí)現(xiàn)COM對(duì)象
開發(fā)COM對(duì)象的任務(wù)就是建立一個(gè)能夠與IE瀏覽器的MSHTML COM服務(wù)器建立連接并且通過接口回調(diào)實(shí)現(xiàn)控制功能的COM對(duì)象,具體實(shí)現(xiàn)過程如下:
(1)運(yùn)行Delphi,依次點(diǎn)擊File|New|Other,切換到ActiveX頁面,選擇ActiveX Library,點(diǎn)擊OK按鈕,即建立一個(gè)新的工程。
(2) 再次點(diǎn)擊File|New|Other,切換到ActiveX頁面,選擇COM Object,點(diǎn)擊OK按鈕,即出現(xiàn)如圖2所示的COM Object Wizard界面,去掉Included Type Library復(fù)選框,在Class Name中輸入COM對(duì)象的名稱IEMonitor,然后點(diǎn)擊OK按鈕,即新建了一個(gè)名稱為TIEMonitor的COM對(duì)象(該COM對(duì)象的CLSID由系統(tǒng)自動(dòng)生成)。
(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中需要手動(dòng)加入對(duì)SHDOCVW, Dialogs, SysUtils, Forms的引用。
其中主要是對(duì)IObjectWithSite接口的SetSite()方法和IDispatch接口的Invoke()方法的實(shí)現(xiàn):首先通過SetSite()方法獲得IE的WebBrowser接口,然后尋找連接點(diǎn),并且通過調(diào)用Advise()方法建立COM自身與連接點(diǎn)的連接;當(dāng)連接建立成功后,IE在事件引發(fā)后,會(huì)調(diào)用連接到自身的IDispatch接口對(duì)象的Invoke方法,不同的事件對(duì)應(yīng)不同的DispID編碼,因此可以通過在程序中判斷DispID對(duì)不同的事件做出相應(yīng)的處理。系統(tǒng)主要對(duì)BeforeNavigate2、DownLoadComplete和OnQuit三個(gè)事件進(jìn)行處理,它們對(duì)應(yīng)的DispID分別為250、104和253。在Invoke()方法中,根據(jù)DispID分別調(diào)用DoBeforeNavigate2()、DoDownLoadComplete()和DoOnQuit()函數(shù)實(shí)現(xiàn)相關(guān)處理和控制功能,具體實(shí)現(xiàn)詳見程序源代碼。
(4)編譯工程,生成DIEMonitor.dll文件。
隨著網(wǎng)絡(luò)的發(fā)展和普及,對(duì)網(wǎng)絡(luò)的監(jiān)控日益成為網(wǎng)絡(luò)安全的必然要求,也是管理和維護(hù)網(wǎng)絡(luò)的一個(gè)有效手段。當(dāng)前已經(jīng)有多種應(yīng)用比較廣泛的網(wǎng)絡(luò)監(jiān)控和過濾程序,如美萍網(wǎng)管、we-blocker等,它們都可以實(shí)現(xiàn)基于網(wǎng)絡(luò)URL和IP地址的監(jiān)控和過濾功能。
本文將對(duì)如何開發(fā)一個(gè)嵌入到IE瀏覽器中的監(jiān)控程序進(jìn)行介紹,該程序可以根據(jù)網(wǎng)絡(luò)URL和IP地址進(jìn)行監(jiān)控和過濾,并且記錄系統(tǒng)日志,從而使你對(duì)IE(當(dāng)然是使用它的用戶)的所有操作一覽無余。相信通過閱讀本文,會(huì)加深你對(duì)網(wǎng)絡(luò)監(jiān)控程序的理解,以及提高你的COM編程能力和數(shù)據(jù)庫編程能力。
本文在Delphi 6開發(fā)環(huán)境下實(shí)現(xiàn),數(shù)據(jù)庫使用桌面數(shù)據(jù)庫Access 2000。
基礎(chǔ)知識(shí)
1.COM編程
COM(Component Object Model,組建對(duì)象模型)是微軟公司(Microsoft Company)提出的二進(jìn)制通信規(guī)范,用于軟件組件之間的跨越多個(gè)進(jìn)程、機(jī)器、硬件和操作系統(tǒng)的互操作,它是一項(xiàng)通過接口(Interface)透明的傳遞封裝數(shù)據(jù)的技術(shù),并且獨(dú)立于語言和操作平臺(tái)。一個(gè)COM對(duì)象是實(shí)現(xiàn)一個(gè)或者若干個(gè)接口的對(duì)象,即COM對(duì)象借助接口輸出它所提供的服務(wù)。
2.IE瀏覽器的體系結(jié)構(gòu)
IE瀏覽器的體系結(jié)構(gòu)如圖1所示。其中MSHTML是位于SHDOCVW和HTML頁面之間的COM對(duì)象,SHDOCVW對(duì)象用于處理頁面的顯示,而MSHTML用于處理頁面的語法分析,并且將頁面中的標(biāo)記轉(zhuǎn)換為元素。MSHTML是一個(gè)COM服務(wù)器,允許COM客戶端程序訪問它對(duì)外提供的服務(wù)。
實(shí)現(xiàn)IE瀏覽器嵌入式編程的基本方法是建立COM對(duì)象,從而以COM客戶端程序的形式和MSHTML COM服務(wù)器建立連接,然后通過接口回調(diào)實(shí)現(xiàn)需要的控制功能。也即首先建立COM對(duì)象,實(shí)現(xiàn)系統(tǒng)規(guī)定的若干接口,然后注冊COM對(duì)象,并且將COM對(duì)象的有關(guān)信息寫入到IE瀏覽器擴(kuò)展功能指定的注冊表位置。
嵌入式IE瀏覽器監(jiān)控程序的實(shí)現(xiàn)
嵌入式IE瀏覽器監(jiān)控程序的實(shí)現(xiàn)主要包括監(jiān)控程序的實(shí)現(xiàn)和維護(hù)程序的實(shí)現(xiàn)兩部分,根據(jù)程序開發(fā)過程,可以將其分為四個(gè)步驟,下面分別對(duì)各個(gè)實(shí)現(xiàn)步驟進(jìn)行詳細(xì)介紹。
1.實(shí)現(xiàn)COM對(duì)象
開發(fā)COM對(duì)象的任務(wù)就是建立一個(gè)能夠與IE瀏覽器的MSHTML COM服務(wù)器建立連接并且通過接口回調(diào)實(shí)現(xiàn)控制功能的COM對(duì)象,具體實(shí)現(xiàn)過程如下:
(1)運(yùn)行Delphi,依次點(diǎn)擊File|New|Other,切換到ActiveX頁面,選擇ActiveX Library,點(diǎn)擊OK按鈕,即建立一個(gè)新的工程。
(2) 再次點(diǎn)擊File|New|Other,切換到ActiveX頁面,選擇COM Object,點(diǎn)擊OK按鈕,即出現(xiàn)如圖2所示的COM Object Wizard界面,去掉Included Type Library復(fù)選框,在Class Name中輸入COM對(duì)象的名稱IEMonitor,然后點(diǎn)擊OK按鈕,即新建了一個(gè)名稱為TIEMonitor的COM對(duì)象(該COM對(duì)象的CLSID由系統(tǒng)自動(dòng)生成)。
(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中需要手動(dòng)加入對(duì)SHDOCVW, Dialogs, SysUtils, Forms的引用。
其中主要是對(duì)IObjectWithSite接口的SetSite()方法和IDispatch接口的Invoke()方法的實(shí)現(xiàn):首先通過SetSite()方法獲得IE的WebBrowser接口,然后尋找連接點(diǎn),并且通過調(diào)用Advise()方法建立COM自身與連接點(diǎn)的連接;當(dāng)連接建立成功后,IE在事件引發(fā)后,會(huì)調(diào)用連接到自身的IDispatch接口對(duì)象的Invoke方法,不同的事件對(duì)應(yīng)不同的DispID編碼,因此可以通過在程序中判斷DispID對(duì)不同的事件做出相應(yīng)的處理。系統(tǒng)主要對(duì)BeforeNavigate2、DownLoadComplete和OnQuit三個(gè)事件進(jìn)行處理,它們對(duì)應(yīng)的DispID分別為250、104和253。在Invoke()方法中,根據(jù)DispID分別調(diào)用DoBeforeNavigate2()、DoDownLoadComplete()和DoOnQuit()函數(shù)實(shí)現(xiàn)相關(guān)處理和控制功能,具體實(shí)現(xiàn)詳見程序源代碼。
(4)編譯工程,生成DIEMonitor.dll文件。