包过滤技术

Windows 经过微软多年迭代,为开发者提供了多种网络包过滤技术,包括 user-mode 和 kernel-mode 的不同系统层级下的过滤技术。

Raw Socket

微软在 Winsock 2 后提供了原始套接字(Raw Socket)功能,和 Linux 类似,原始套接字可以在用户态接受所有经过 Winsock 的 IP 协议数据包。但是这种方法只能进行监听,而不能过滤和拦截。并且对于不经过 Winsock 的网络流量,不能被这个层次侦听。如通过传输驱动程序接口(TDI,Transport Driver Interface)通信的流量。

Winsock DLL

如果需要在 Winsock 层次实现过滤和,可以选择修改系统 Winsock DLL 文件,或者动态 HOOK Winsock 相关函数。但是同样的,无法接触到 Winsock 之外的网络流量。

LSP / SPI

在 Winsock 2 中,微软除了提供了 Socket API 还通过分层服务提供者(LSP,Layered Service Provider)提供了一个 Winsock 服务提供接口(SPI,Service Provider Interface),通过 LSP 可以向其他应用程序提供包传输和名称解析等服务。其他程序可以通过 ws2_32.dll 和 LSP 程序进行通信。

通过 LSP 提供的分层协议、基础协议来替换 Winsock 的默认协议,并用协议链重组重新串联数据包通道。这样就可以通过 LSP 实现 Winsock 包流量过滤和拦截。

Windows 2000 Packet Filtering Interface

微软在 Windows 2000 中提供了一个特别的网络包过滤接口,可以实现 IP 和端口的过滤。

内核 Hook

在 kernel-mode 下,常用的 SSDT Hook 技术并不能用在 Winsock 相关 API 上,因为 Winsock 并未经过 SSDT 转发。要实现内核 Hook 只能采用 inline Hook,较为复杂。

TDI 过滤驱动

传输层驱动接口(TDI,Transport Driver Interface)也是 Windows 在 kernel-mode 模式下提供给驱动程序调用的。并且该接口还特别提供了数据包所关联的进程信息,在驱动层做包过滤十分方便。但是,该接口由 TCPIP.sys 驱动程序提供,仅对 tcp/ip 协议簇下的数据包有效,如 ICMP 可能不直接经过这个驱动。

NDIS

在新的 Windows 系统中,微软对 TDI 进行改进,提供了新的网络驱动接口规范(NDIS,Network Driver Interface Specification)。该规范适用于不同的协议簇,可以捕获几乎所有网络流量。

Windows 2000 Filter-Hook Driver

在 Windows 2000 后的系统中,微软在 ipfiltdrv.sys 驱动提供了一个简单的数据包拦截哦功能,可以获取所有 IP 包,但是不能获取到相关进程信息。

参考 http://www.codeproject.com/KB/IP/drvfltip.aspx

Windows 2000 Firewall-Hook Driver

和 Filter-Hook Driver 类似,拥有多个回调函数。

参考 http://www.codeproject.com/KB/IP/FwHookDrv.aspx

NDIS-Hook Driver

借用 NDIS 驱动 ndis.sys。替换相关函数来实现包过滤,教 NDIS 优先级更高,一般用于安全软件、防火墙或者是恶意软件。

WFP

自 Windows Vista / Service 2008 后,上述 Filter-Hook 和 Firewall-Hook 便不再可用,微软提供了新的 Windows 筛选平台(WFP)旨在代替上述所有技术,为应用程序提供完整的包过滤开发平台。并且,WFP 包括内核和用户两种模式,使其适用于不同需求的程序。