包过滤技术
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 包,但是不能获取到相关进程信息。
Windows 2000 Firewall-Hook Driver
和 Filter-Hook Driver 类似,拥有多个回调函数。
NDIS-Hook Driver
借用 NDIS 驱动 ndis.sys。替换相关函数来实现包过滤,教 NDIS 优先级更高,一般用于安全软件、防火墙或者是恶意软件。
WFP
自 Windows Vista / Service 2008 后,上述 Filter-Hook 和 Firewall-Hook 便不再可用,微软提供了新的 Windows 筛选平台(WFP)旨在代替上述所有技术,为应用程序提供完整的包过滤开发平台。并且,WFP 包括内核和用户两种模式,使其适用于不同需求的程序。