隨著網路普及,企業需監控員工瀏覽行為。本文示範以 Browser Helper Object (BHO) 技術,開發嵌入 IE 的 COM 監控元件,攔截導航事件、依 URL/IP 過濾、記錄稽核日誌,並提供獨立管理介面設定策略與查詢日誌。開發環境:Delphi 6 + Access 2000。
HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects\{CLSID}CoCreateInstance 建立 COM 物件,呼叫 IObjectWithSite::SetSite(pUnkSite)QueryInterface 取得 IWebBrowser2,尋找連接點 DWebBrowserEvents2Advise 建立事件連接,IE 觸發事件時回呼 IDispatch::InvokeDispID 判斷事件:250=BeforeNavigate2、104=DownloadComplete、253=OnQuitFile → New → Other → ActiveX → ActiveX Library,專案存為 DIEMonitor.dprFile → New → Other → ActiveX → COM Object,Class Name: IEMonitor,取消 Included Type Library,單元存為 UIEMonitor.pas
uses SHDOCVW, Dialogs, SysUtils, Forms, ActiveX, ComObj;
type
TIEMonitor = class(TComObject, IDispatch, IObjectWithSite)
private
FIEThis: IWebBrowser2;
FCookie: Integer;
protected
// IObjectWithSite
function SetSite(const pUnkSite: IUnknown): HResult; stdcall;
function GetSite(const riid: TIID; out site: IUnknown): HResult; stdcall;
// IDispatch
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 Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;
end;
function TIEMonitor.SetSite(const pUnkSite: IUnknown): HResult;
var
pcp: IConnectionPointContainer;
cpc: IConnectionPoint;
punk: IUnknown;
begin
Result := S_OK;
if pUnkSite = nil then begin // IE 關閉
if FCookie <> 0 then begin
FIEThis := nil;
// 解除連接...
end;
Exit;
end;
// 取得 IWebBrowser2
pUnkSite.QueryInterface(IWebBrowser2, FIEThis);
// 尋找事件連接點
FIEThis.QueryInterface(IConnectionPointContainer, pcp);
pcp.FindConnectionPoint(DIID_DWebBrowserEvents2, cpc);
punk := Self as IUnknown;
cpc.Advise(punk, FCookie);
end;
function TIEMonitor.Invoke(DispID: Integer; ...): HResult;
begin
Result := S_OK;
case DispID of
250: DoBeforeNavigate2(Params); // 導航前攔截
104: DoDownloadComplete; // 下載完成記錄
253: DoOnQuit; // IE 關閉清理
end;
end;
| 函式 | 職責 |
|---|---|
ChkUrl | 核心入口:取得 URL → GetIP 解析 IP → 查資料庫判斷允許/封鎖 → WriteSite 記錄 URL/IP → WriteLog 寫稽核日誌 |
GetIP | 利用 TNMHTTP.Host := URL; TNMHTTP.ResolveRemoteHost; IP := TNMHTTP.RemoteIP 解析域名 IP |
WriteSite | 將 URL、IP、日期時間寫入資料表 |
WriteLog | 記錄:URL、IP、使用者、時間、處理結果(允許/封鎖) |
procedure TIEMonitor.DoBeforeNavigate2(var Params);
var
pDisp: IDispatch;
url: WideString;
flags: Integer;
targetFrame: WideString;
postData: OleVariant;
headers: WideString;
cancel: WordBool;
begin
// 解析參數陣列取得 URL、Cancel 旗標
// 呼叫 ChkUrl(url) 判斷
if ShouldBlock then cancel := True; // 設定 Cancel 參數攔截導航
end;
DIEMonitor.dllRun → Register ActiveX Server 或命令列 regsvr32 DIEMonitor.dllHKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects\{CLSID}(註冊程式自動完成)
獨立 EXE 專案,登入驗證後提供:


BHO 技術雖屬 IE 時代產物,但其COM 事件攔截、進程內注入、權限提升等核心概念,對理解現代瀏覽器擴充架構、EDR Hook 技術、系統級監控皆有啟發價值。