N-Byte 是基於 .NET 開發的單機版網絡安全工具,核心採用 NDIS Hook Driver 技術在網絡層過濾封包,實現強大的防火牆功能。主程式以 C# 編寫,驅動程式則使用 DDK 下的 C 語言,兩者跨越托管/非托管邊界,通訊架構設計成為關鍵挑戰。
.NET 應用程式面臨兩大難題:
採用 Managed C++ (C++/CLI) 開發 DriverDll.dll 作為橋接層:
DeviceIoControl 與驅動通訊。// 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)無法直接跨邊界。解決路徑:
IoCtrl::GetAccessInfo() 讀取驅動資料,填入托管類別欄位。InfoEvent : EventArgs 封裝封包資訊。InfoProvider 類別透過 __delegate/__event 觸發事件,將 InfoEvent 物件推送給主程式。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 開發底層網絡安全工具的經典範式。