Windows 軟體防火牆經歷四代演進:
掛鉤層級由高到低:SPI → AFD → TDI → NDIS。NDIS 層功能最強、最難繞過。主流兩種技術:
SendPacketsHandler/ReceivePacketHandler。缺點:需重啟生效/卸載。關鍵結構體 _NDIS_OPEN_BLOCK 中的 SendPacketsHandler、ReceivePacketHandler 為核心處理點(現代驅動多用此雙 Handler,非舊文獻常提的 SendHandler/ReceiveHandler)。
NDIS 層屬核心模式且無進程上下文,無法識別發起連線的 PID。解法:在 TDI 層掛鉤 TDI_CONNECT、TDI_LISTEN、TDI_SET_EVENT_HANDLER 等,呼叫 PsGetCurrentProcessId() 取得進程 ID,彈出提示或依規則放行/阻擋。優點:微軟提供濾波器驅動介面 IoAttachDeviceToDeviceStack,開發較 NDIS 簡單。
// 動態註冊偽 NDIS 協定取得鏈表頭
NDIS_HANDLE RegisterBogusNDISProtocol() {
NDIS_PROTOCOL_CHARACTERISTICS BogusProtocol = {0};
BogusProtocol.MajorNdisVersion = 4;
NdisInitUnicodeString(&ProtocolName, L"BogusProtocol");
BogusProtocol.Name = ProtocolName;
BogusProtocol.ReceiveHandler = DummyReceive;
BogusProtocol.SendPacketsHandler = DummySendPackets; // 關鍵
NdisRegisterProtocol(&Status, &hBogusProtocol, &BogusProtocol, sizeof(BogusProtocol));
return (Status == STATUS_SUCCESS) ? hBogusProtocol : NULL;
}
// TDI Dispatch Routine 掛鉤範例
NTSTATUS hook_disp(PDEVICE_OBJECT dev, PIRP irp) {
if (irpSp->MinorFunction == TDI_CONNECT) {
HANDLE pid = PsGetCurrentProcessId();
// 依 pid 查規則、彈視窗、決定放行/阻擋
}
// ... 其他 TDI_* 處理
}
現代 Windows 防火牆 = NDIS 封包過濾 (高效能、低延遲) + TDI 應用程式識別 (精準進程控制) + 用戶模式服務 (UI、規則管理、日誌) + HIPS 行為引擎 (註冊表/檔案/進程監控)。黑客與反駭技術同源共演,推動防火牆持續進化。