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

C# 開發個人防火牆:NDIS Hook 驅動與托管層通訊架構深度解析

     編輯:關於C語言

專案背景:N-Byte 網絡守望者

N-Byte 是基於 .NET 開發的單機版網絡安全工具,核心採用 NDIS Hook Driver 技術在網絡層過濾封包,實現強大的防火牆功能。主程式以 C# 編寫,驅動程式則使用 DDK 下的 C 語言,兩者跨越托管/非托管邊界,通訊架構設計成為關鍵挑戰。

核心難題:托管代碼控制非托管驅動

.NET 應用程式面臨兩大難題:

  1. 如何實現 .NET 應用程式對驅動程式的控制?
  2. 如何從驅動程式向 .NET 應用程式傳遞非托管數據類型?

解決方案:混合模式 C++ 做中介層

採用 Managed C++ (C++/CLI) 開發 DriverDll.dll 作為橋接層:

  • 非托管側:直接呼叫 DeviceIoControl 與驅動通訊。
  • 托管側:暴露給 C# 主程式呼叫的簡潔 API。

驅動控制範例

// Managed C++ 中的封裝類
public __gc class IoCtrl {
    DWORD WriteIo(DWORD code, PVOID buffer, DWORD count) {
        if (hDriverHandle == NULL) return ERROR_DRIVER_HANDLE;
        DWORD bytesReturned;
        BOOL ret = DeviceIoControl(hDriverHandle, code, buffer, count, NULL, 0, &bytesReturned, NULL);
        return ret ? SUCCESS : ERROR_IO_CTRL;
    }

    // 供 C# 呼叫的啟用封包過濾方法
    public bool StartIpHook() {
        return WriteIo(START_IP_HOOK, NULL, 0) == SUCCESS;
    }
}

C# 主程式僅需:ic.StartIpHook(); 即可間接控制驅動。

非托管結構體封送至托管層

驅動中定義的 ACCESS_INFO 結構(協議、源/目的 IP、Port)無法直接跨邊界。解決路徑:

  1. 非托管 IoCtrl::GetAccessInfo() 讀取驅動資料,填入托管類別欄位。
  2. C# 定義 InfoEvent : EventArgs 封裝封包資訊。
  3. Managed C++ InfoProvider 類別透過 __delegate/__event 觸發事件,將 InfoEvent 物件推送給主程式。
  4. 主程式以背景執行緒跑 GetInfoThreadProc(),訂閱 OnDriverInfo 事件處理資料。
// C# 端事件處理
pInfo = new InfoProvider();
FilterThread = new Thread(pInfo.GetInfoThreadProc);
FilterThread.IsBackground = true;
FilterThread.Start();
pInfo.OnDriverInfo += new InfoProvider.DriverInfo(DealWithInfo);

架構總結

此「C# 主程式 ⇄ Managed C++ 中介層 ⇄ 核心模式驅動」三層架構,有效解決了托管/非托管互通、資料封送、非同步事件通知等核心問題,是 .NET 開發底層網絡安全工具的經典範式。

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