Windows Packet Divert (WinDivert) 是一个用于 Windows 操作系统的网络数据包拦截和修改工具,允许开发者在内核级别拦截、修改和重定向网络流量。它广泛应用于网络监控、调试、测试和安全领域。WinDivert 允许用户通过一个简单的 API 捕获和操作网络流量,包括 IP、TCP、UDP 数据包等。
Windows Packet Divert (WinDivert) 是一个用于 Windows 操作系统的网络数据包拦截和修改工具,允许开发者在内核级别拦截、修改和重定向网络流量。它广泛应用于网络监控、调试、测试和安全领域。WinDivert 允许用户通过一个简单的 API 捕获和操作网络流量,包括 IP、TCP、UDP 数据包等。
以下是 WinDivert 的协议、规范、标准以及技术文档的来源:
1. WinDivert 介绍
WinDivert 是一个非常灵活的工具,它可以拦截和修改网络数据包,通常用于网络分析、调试、负载均衡、安全工具和 VPN(虚拟专用网络)中。它基于 Windows 网络驱动模型,能够在应用层和内核层之间拦截数据包。
-
WinDivert GitHub: WinDivert 的官方 GitHub 页面,提供了完整的文档、源代码、示例和安装指南。
-
WinDivert Wiki: 详细的技术文档和使用说明,包括如何安装和使用 WinDivert 来进行数据包捕获和修改。
2. 协议规范和工作原理
WinDivert 本身并不定义一个独立的协议,而是提供了对 Windows 网络栈的低级访问,使开发者能够操作 TCP/IP 协议栈中的数据包。其工作原理基于以下几个关键技术:
-
数据包捕获: WinDivert 可以捕获传入和传出的所有网络数据包,包括以太网帧、IP 数据包、TCP/UDP 数据包等。
以太网帧、IP 数据包、TCP/UDP 数据包 的 协议、规范、标准、技术文档来源(全部为国际正式标准/RFC/IEEE 规范),并附上它们的官方出处,适合用作工程开发、协议栈学习或论文引用。
✅ 以太网(Ethernet)帧 – 协议 / 规范 / 标准
核心标准:IEEE 802 系列
以太网不由 IETF 管,而是由 IEEE(电气电子工程师学会) 制定。
关键规范
技术 标准号 标准名称 内容简介 以太网 MAC 层 IEEE 802.3 Ethernet 定义帧格式、MAC 地址、CSMA/CD 以太网物理层 IEEE 802.3u/ab/an/ba 等 Fast/Gigabit/10G Ethernet 定义各种速率的 PHY 层细节 以太网帧格式定义于:
📄 IEEE 802.3 – Media Access Control (MAC) Parameters, Physical Layer and Management Parameters for Ethernet
(IEEE 标准需要付费下载,但可以查到详细摘要)
官方来源:
🔗 IEEE 官方标准库:https://standards.ieee.org
✅ IP 数据包(IPv4 / IPv6)– 协议 / 标准 / 文档来源
IP 协议由 IETF(Internet Engineering Task Force) 维护,所有标准以 RFC(Request for Comments) 发布。
IPv4(Internet Protocol Version 4)
核心标准
RFC 名称 内容 RFC 791 Internet Protocol IPv4 基本结构与头部格式 RFC 792 ICMP 错误消息、网络诊断(ping) RFC 826 ARP 地址解析协议(IPv4 与 MAC 映射) 官方来源:
🔗 IETF RFC Editor
https://www.rfc-editor.org/rfc/rfc791
IPv6(Internet Protocol Version 6)
核心标准
RFC 名称 内容 RFC 8200 IPv6 Specification(取代 RFC 2460) IPv6 基础、头格式、扩展头 RFC 4443 ICMPv6 IPv6 错误处理 RFC 4861 Neighbor Discovery Protocol IPv6 的 ARP 替代 RFC 4862 Stateless Address Autoconfiguration 地址自动配置(SLAAC) 官方来源:
🔗 https://www.rfc-editor.org/rfc/rfc8200
✅ TCP / UDP 数据包 – 协议 / 标准 / 文档来源
TCP 和 UDP 也由 IETF 维护。
UDP(User Datagram Protocol)
核心标准:
RFC 内容 RFC 768 定义 UDP 头部格式、端口、校验和 官方来源:
🔗 https://www.rfc-editor.org/rfc/rfc768
TCP(Transmission Control Protocol)
核心标准(最重要):
RFC 内容 RFC 793 TCP 原始规范 RFC 1122 Host Requirements(对 RFC 793 的补充) RFC 1323 TCP 高性能扩展(时间戳/窗口扩大) RFC 2018 Selective ACK(SACK) RFC 5681 拥塞控制(慢启动、拥塞避免、快重传等) 官方来源:
🔗 https://www.rfc-editor.org/rfc/rfc793
📚 扩展资料(非常有用)
🧩 TCP/IP 官方参考书
名称 作者 说明 TCP/IP Illustrated, Vol. 1 W. Richard Stevens 最经典的 TCP/IP 教程,工程师必读 Computer Networks Andrew S. Tanenbaum 网络协议入门经典
🧭 所有协议的权威来源
协议 权威发布机构 来源链接 以太网 (Ethernet) IEEE 802.3 https://standards.ieee.org IPv4、IPv6 IETF RFC 系列 https://www.rfc-editor.org TCP/UDP IETF RFC 系列 https://www.rfc-editor.org —
如果你需要,我可以为你提供:
✅ 这些协议头部的详细字段解释
✅ 整理成 PDF/Word/Markdown 技术文档
✅ 画出以太网 → IP → TCP 的完整分层结构图
✅ 提供抓包示例(Wireshark)与解析方法 -
数据包修改: 捕获的数据包可以被修改,允许修改任何层次(如 IP 地址、端口、TCP 标志位等)。
-
数据包重定向: 修改后的数据包可以重新定向到另一个目标地址。
-
网络流量过滤: 通过配置不同的过滤器,WinDivert 允许只捕获特定类型的数据包。例如,用户可以设置过滤器,只捕获特定端口的 TCP 流量。
相关文档:
-
WinDivert API 文档: 这部分文档描述了 WinDivert 提供的 API 函数,如何使用它们来拦截、修改、重定向和丢弃数据包。
-
WinDivert 数据包过滤器: WinDivert 支持使用过滤表达式来指定捕获的网络流量,类似于
tcpdump或Wireshark的过滤器。
3. 技术细节和实现
WinDivert 使用了 Windows 的 NDIS (Network Driver Interface Specification) 和 Windows Filtering Platform (WFP) 来进行网络流量捕获与修改。WFP 是 Microsoft 提供的一个框架,用于在网络栈的多个层次进行网络流量过滤和操作。WinDivert 基于 WFP 实现了高效的包拦截和修改能力。
-
WFP (Windows Filtering Platform): WFP 提供了一套机制,允许开发者在网络栈的各个层次进行数据包过滤和操作。WinDivert 利用 WFP 拦截进出计算机的网络数据包。
- WFP 官方文档: Windows Filtering Platform Documentation
4. WinDivert 协议与应用领域
WinDivert 提供的网络拦截和重定向功能,适用于以下应用领域:
- 网络监控和分析: 用于捕获和分析网络数据包,诊断网络问题。
- 调试与测试: 开发人员可以用它来测试应用程序的网络功能,通过修改数据包来模拟各种网络场景。
- 安全工具: 在安全研究中,WinDivert 可用于开发防火墙、入侵检测系统(IDS)和恶意软件分析工具。
- VPN 和代理工具: WinDivert 允许开发者实现自己的虚拟专用网络(VPN)或代理服务器,通过拦截和重定向数据包来实现流量加密或重定向。
5. WinDivert 相关技术
-
NDIS (Network Driver Interface Specification): NDIS 是 Windows 中的一个网络驱动接口规范,它允许 WinDivert 与 Windows 网络栈进行交互。
-
Windows Network Stack: 了解 Windows 网络栈的基本工作原理,WinDivert 在内核中操作数据包流量。
6. WinDivert 相关开源工具和资源
-
Wireshark: 虽然 WinDivert 不是 Wireshark 的一部分,但它可以与 Wireshark 一起使用来捕获和分析网络流量。
-
Nmap: 与 WinDivert 配合使用时,Nmap 可以用来扫描网络流量,并结合 WinDivert 对数据包进行修改。
WinDivert 是一个强大的 Windows 网络包拦截工具,适用于多种网络调试、安全研究和虚拟化应用场景。它通过 Windows Filtering Platform 和 NDIS 提供了高效的网络流量捕获和修改能力。其文档、源代码和技术细节可通过其 GitHub 页面和相关的 WFP 和 NDIS 文档获得。WinDivert 的应用范围从简单的网络监控到复杂的安全分析、VPN 构建等都得到了广泛的使用。
WinDivert 完整拆解:底层原理|依赖文件|调用链路|配套链|演进|应用场景
一、基础定义
二、整体分层架构 & 完整逻辑链路
2.1 分层模型(内核 ↔ 用户态)
【用户态应用程序(C/C++/Go/Rust等)】
↓ 调用API
WinDivert.dll 用户态封装库
↓ IOCTL设备通信
【内核层】WinDivert.sys WDF/WFP驱动
↓ 挂载Windows Filtering Platform(WFP)过滤点
Windows tcpip.sys 协议栈 / NDIS网卡驱动
2.2 标准数据包流转完整链路(出入双向通用)
- 数据包抵达协议栈(入站:网卡→tcpip;出站:应用 socket→tcpip)
- WinDivert.sys WFP 过滤钩子拦截报文,内核执行预过滤规则(IP / 端口 / 协议 / 方向)
- 匹配过滤器的数据包暂停协议栈流转,存入驱动环形队列;不匹配直接放行
- 用户态调用
WinDivertRecv()通过 IOCTL 读取完整原始 IP 包(含头 + 载荷) - 用户态程序三种处理分支:
- 丢弃:不调用
WinDivertSend(),报文永久丢弃 - 原样放行:读取后直接 Send 重注入回内核协议栈
- 修改报文(改 IP / 端口 / TCP 载荷)后再 Send 重注入
- 丢弃:不调用
- 内核接收重注入数据包,恢复正常转发流程(网卡出站 / 上层应用接收)
2.3 多拦截分层(WinDivert Layer 分层能力)
WINDIVERT_LAYER_NETWORK网络层(IPv4/IPv6 全局拦截,最常用)WINDIVERT_LAYER_FLOW传输层流(TCP/UDP 连接粒度)WINDIVERT_LAYER_SOCKET应用 socket 粒度WINDIVERT_LAYER_REFLECT本地回环流量专用分层
三、全套依赖文件(仓库目录对应)
3.1 内核驱动文件(sys / 目录)
WinDivert64.sys64 位 Windows 内核驱动(WDF 框架,挂载 WFP)WinDivert32.sys32 位内核驱动- 编译依赖 WDK 驱动工具链,inf 安装脚本
inf/WinDivert.inf
3.2 用户态运行库(dll / 目录)
WinDivert.dll32/64 位用户态 API 封装,导出全部操作函数- 对外头文件
include/windivert.h:WinDivertOpen/Recv/Send/Close等 API 声明
3.3 编译配套脚本
wddk-build.bat:Windows 驱动编译脚本msvc-build.bat:用户态 DLL 编译mingw-build.sh:MinGW 交叉编译
3.4 系统底层依赖(Windows 自带,无第三方)
- 内核依赖:
ntoskrnl.exe、tcpip.sys、WFP 平台、NDIS 驱动框架 - 用户态依赖:
kernel32.dll、advapi32.dll(服务 / 设备安装)、ws2_32.dll
3.5 注册表配套链
HKLM\SYSTEM\CurrentControlSet\Services\WinDivertX.X- 驱动映像路径、启动类型、权限、WFP 钩子配置持久化
- 卸载:
sc stop WinDivert2.2 && sc delete WinDivert2.2
四、底层核心原理深度解构
4.1 内核实现:基于 WFP 过滤平台(核心根基)
FWPM_LAYER_INBOUND/OUTBOUND_IP_PACKET_V4/V6拦截原始 IP 报文;
4.2 内核→用户态通信机制
- 驱动创建设备对象
\\.\WinDivert,暴露 IOCTL 控制码 - 用户态
WinDivertOpen打开设备句柄,提交过滤表达式(类 BPF 语法) - 内核环形缓冲区缓存匹配数据包,零拷贝 / 轻拷贝传递至用户态内存
- 异步 IO 支持(
WinDivertRecvEx),高并发场景降低阻塞开销
4.3 过滤引擎原理
- 内核预解析过滤表达式(如
outbound and tcp.DstPort == 443) - 仅匹配报文才劫持,无关流量直接放行,性能损耗极低
- 支持优先级队列,多程序同时打开 WinDivert 可分层拦截
4.4 数据包修改约束
4.5 权限硬性约束
- 使用程序必须管理员权限,否则无法加载驱动、打开设备
- Windows 驱动签名强制:测试模式 / 信任证书才能加载未签名 WinDivert.sys
- 驱动以 SYSTEM 内核权限运行,用户程序仅控制读写队列,权限隔离
五、核心 API 调用配套链路(标准开发流程)
// 1. 打开WinDivert设备,注册过滤规则
HANDLE handle = WinDivertOpen("ip and outbound", WINDIVERT_LAYER_NETWORK, 0, 0);
// 2. 循环读取数据包
while(1){
WINDIVERT_ADDR addr;
char packet[65535];
UINT packetLen;
WinDivertRecv(handle, packet, sizeof(packet), &packetLen, &addr);
// 3. 业务处理:解析/修改报文
ModifyPacket(packet, &packetLen);
// 4. 重注入回内核;不调用Send等价丢弃报文
WinDivertSend(handle, packet, packetLen, &addr);
}
// 5. 释放资源
WinDivertClose(handle);
六、版本演进里程碑(WinDivert 完整时间线)
v1.x 初代基础(2008–2014)
- v1.0:基础 IP 拦截、Recv/Send 基础模型
- v1.4:新增 loopback 本地流量支持、时间戳、校验和自动修复
限制:仅网络层,无分层 Flow/Socket,不支持批量操作
v2.0 架构大改版(2016 里程碑)
- 新增四层分层(NETWORK/FLOW/SOCKET/REFLECT)
- 批量收发接口、异步 IO、完整 IPv6 原生支持
- 重写 WFP 驱动内核逻辑,淘汰老旧 NDIS 中间层方案
v2.1 稳定增强
- IP 分片完整处理、Socket 层细粒度拦截
- 优化多并发程序资源竞争问题
v2.2 当前稳定版(2022-09-21,最新 Release)
- 分片报文解析 / 重组大幅优化
- 过滤语言条件扩展、性能优化
- 完善 Win10/11、Server2019/2025 兼容性
- 修复大量报文截断、校验和边缘 Bug
七、独立应用场景 + 复合组合场景
7.1 独立基础场景
- 本地流量分流代理(***/V2R/Trojan 等 Windows 代理核心依赖)
拦截指定端口出站流量,转发至本地代理端口,实现全局规则分流,是最主流落地场景。
- 轻量用户态防火墙
无需编写内核驱动,基于过滤规则丢弃恶意 IP / 端口报文。
- 网络流量嗅探分析
完整捕获双向原始 IP 包,相比 Npcap 可同时阻断流量。
- 本地 NAT / 端口转发程序
用户态改写报文目的 IP / 端口,实现四层 DNAT(对标 RRAS NAT、netsh portproxy)。
- VPN / 隧道客户端
拦截本机流量封装加密隧道,解包后重注入内网。
- 网络模拟工具(Clumsy)
人为丢包、延迟、篡改报文,模拟弱网测试应用。
7.2 复合组块联动场景(串联你之前整套 Windows 网络体系)
组合 1:WinDivert + Windows RRAS 网关
组合 2:WinDivert + UPnP IGD
组合 3:WinDivert + DirectPlay 游戏流量管控
组合 4:WinDivert + SMB 局域网文件共享
八、横向关键对比(WinDivert vs Npcap vs 原生 WFP 开发)
| 对比项 | WinDivert | Npcap(WinPcap) | 原生 WFP 内核开发 |
|---|---|---|---|
| 报文控制能力 | 拦截 + 修改 + 丢弃 + 重注入 | 仅复制抓包,无法阻断原始流量 | 完整内核拦截,自由度最高 |
| 开发门槛 | 低,纯用户态 API,无需驱动开发 | 中,仅抓包接口 | 极高,必须编写内核驱动 |
| 支持 IPv6 | 完整原生 | 支持 | 完整 |
| 回环localhost流量 | 支持 | 有限支持 | 支持 |
| 授权协议 | LGPLv3/GPLv2 开源 | 商业 / 开源双协议 | 微软专有无开源 |
| 管理员权限 | 必须 | 必须 | 必须 |
| 典型产品 | ***、Clumsy、自定义分流工具 | Wireshark、抓包工具 | 企业级防火墙、安全软件 |
九、配套工具链 & 上下游组件
- 编译工具:WDK Windows 驱动开发工具、MSVC、MinGW
- 流量分析配套:Wireshark(抓取 WinDivert 转发报文)
- 系统配套:Windows 防火墙、RRAS、TCP/IP 协议栈、WFP 平台
- 开发配套:examples / 目录全套示例(防火墙、分流、嗅探、弱网模拟)
- 同类替代开源:WinTun(虚拟网卡隧道,侧重三层隧道而非报文拦截)
十、关键约束与底层限制
- 仅 Windows 平台,无 Linux/macOS 移植版本;
- 所有流量劫持依赖管理员权限,普通用户无法使用;
- 驱动需满足 Windows 驱动签名策略,生产环境需数字证书;
- 高并发超大流量场景内核队列存在丢包风险,需调整缓冲区参数;
- 仅拦截本机进出流量,无法跨网卡全局中转(需搭配路由 / RRAS);
- 和第三方杀毒 / EDR 的 WFP 钩子存在抢占冲突,易拦截失效。
Windows Packet Divert(WinDivert)是一个适用于Windows 10、Windows 11和Windows Server的用户模式数据包捕获和重定向工具。
WinDivert 允许用户模式应用程序捕获/修改/丢弃发送到/从 Windows 网络堆栈的网络数据包。总之,WinDivert 可以:
- 捕获网络数据包
- 过滤/丢弃网络数据包
- 嗅探网络数据包
- 重新注入网络数据包
- 修改网络数据包
WinDivert 可用于实现用户模式数据包过滤器、数据包嗅探器、防火墙、NAT、VPN、隧道应用程序等。
WinDivert 的主要特点包括:
- 数据包拦截、嗅探或丢弃模式
- 支持回环(本地主机)流量
- 完整的 IPv6 支持
- 网络层支持
- 简单而强大的 API
- 高级过滤语言
- 过滤优先级
- 静默安装
- 在 GNU Lesser General Public License(LGPL)条款下免费提供
详细文档和示例可参考以下链接:
- WinDivert 参考手册:WinDivert 2.2
- WinDivert README
- WinDivert 变更日志
- WinDivert 常见问题解答
- WinDivert 2.2 示例应用程序,包括流跟踪、简单数据包捕获和转储、简单防火墙应用程序、具有多线程的基本 WinDivert 应用程序框架、套接字操作转储、将 TCP 流重定向到本地代理服务器、简单 URL 黑名单过滤器等。
源代码托管在 GitHub 上:https://github.com/basil00/Divert
下载WinDivert 的源代码和二进制包请参考以下链接:
- WinDivert-2.2.2-Source.zip(源代码压缩包)
- WinDivert-2.2.2-A.zip(二进制包)
注意事项:
- WinDivert A/B/C 变体除了驱动签名外是相同的。对于大多数应用程序来说,使用哪个变体并不重要。
- 商业用户应尽可能使用自己的证书对驱动程序进行签名。
- 要使用 WinDivert,请确保应用程序具有管理员特权,否则 WinDivert 将无法加载。
还有一些项目使用了 WinDivert,如 ReQrypt、TcpCrypt、Suricata、GoodbyeDPI 等。这些项目均使用 WinDivert 来实现各种功能,例如 HTTP 请求隧道、网络流量加密、网络威胁检测等。

浙公网安备 33010602011771号