首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 開發嵌入式 IE 瀏覽器監控程式:COM 物件攔截導航、記錄日誌與管理介面實作

     編輯:Delphi

隨著網路普及,企業需監控員工瀏覽行為。本文示範以 Browser Helper Object (BHO) 技術,開發嵌入 IE 的 COM 監控元件,攔截導航事件、依 URL/IP 過濾、記錄稽核日誌,並提供獨立管理介面設定策略與查詢日誌。開發環境:Delphi 6 + Access 2000。

核心架構:BHO + IObjectWithSite + IDispatch

  • IE 啟動時讀取註冊表 HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects\{CLSID}
  • 透過 CoCreateInstance 建立 COM 物件,呼叫 IObjectWithSite::SetSite(pUnkSite)
  • COM 物件 QueryInterface 取得 IWebBrowser2,尋找連接點 DWebBrowserEvents2
  • Advise 建立事件連接,IE 觸發事件時回呼 IDispatch::Invoke
  • 依 DispID 判斷事件:250=BeforeNavigate2、104=DownloadComplete、253=OnQuit

步驟一:建立 ActiveX Library 專案與 COM 物件

  1. File → New → Other → ActiveX → ActiveX Library,專案存為 DIEMonitor.dpr
  2. File → 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;

SetSite:取得 WebBrowser 並建立事件連接


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;

Invoke:分派關鍵事件


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、使用者、時間、處理結果(允許/封鎖)

BeforeNavigate2 攔截邏輯


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;

步驟四:註冊與部署

  1. 編譯產生 DIEMonitor.dll
  2. 註冊:Run → Register ActiveX Server 或命令列 regsvr32 DIEMonitor.dll
  3. 3. 寫入註冊表:HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects\{CLSID}(註冊程式自動完成)

步驟五:管理介面

獨立 EXE 專案,登入驗證後提供:

  • 系統參數維護: 啟用/停用監控、設定預設策略(白名單/黑名單模式)
  • 日誌管理: 依日期/使用者/結果查詢、列印、匯出

管理介面 - 系統參數維護

管理介面 - 系統日誌查詢

擴充方向

  • 支援 HTTPS(需解密/憑證處理)
  • 整合 Active Directory 使用者身分
  • 即時警報:敏感網站觸發郵件/簡訊通知管理員
  • 遷移至現代瀏覽器(Edge WebView2、Chrome Extension)

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

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved