ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Windows数据包捕获实战指南:从SNI-Spoofing 看WinDivert与pydivert关键技巧

Windows数据包捕获实战指南:从SNI-Spoofing 看WinDivert与pydivert关键技巧 Windows数据包捕获实战指南从SNI-Spoofing 看WinDivert与pydivert关键技巧【免费下载链接】SNI-SpoofingBypass DPI with IP/TCP-Header manipulation项目地址: https://gitcode.com/gh_mirrors/sn/SNI-SpoofingSNI-Spoofing是一个运行在 Windows 上的网络流量伪装工具它通过WinDivert 数据包捕获与pydivert库对 IP/TCP 头部进行实时篡改实现对 DPI深度包检测的绕过。本文以该项目为蓝本带你零基础掌握 Windows 平台下数据包捕获、过滤、改包与注入的完整链路是入门 WinDivert 与 pydivert 的实用教程。一、先搞懂SNI 是什么为什么值得伪装SNIServer Name Indication服务器名称指示是 TLS 握手中ClientHello明文携带的目标域名。DPI 设备正是靠读取这一字段判断你在访问哪个网站从而实现基于域名的拦截。SNI-Spoofing 的思路很直接在本地起一个监听端口接收客户端流量主动发起一条到目标服务器的连接但用伪装域名Fake SNI的 ClientHello 替换真实握手首包利用 WinDivert 挂钩内核网络栈实时捕获、校验并注入这条连接上的每一个 TCP 包握手建立后本地流量与远端流量双向中继对上层应用完全透明。WinDivert数据包捕获与pydivert注入原理示意整个方案的三个核心文件如下主程序与中继逻辑main.py数据包捕获与注入器injecter.py伪装数据包处理器fake_tcp.py二、为什么 Windows 选 WinDivert 而不是 Npcap很多新手做抓包会先想到 Npcap/Wireshark但两者定位不同对比项Npcap / WinPcapWinDivert能力只能捕获副本旁路观察捕获 修改 注入可干预真实流量层级用户态抓包驱动内核驱动WFP 调用典型场景流量分析、排障流量伪装、DPI 绕过、代理加速Python 绑定scapy / pypcappydivert关键点在于注入InjectSNI-Spoofing 不是旁观者它必须把伪造好的 ClientHello真正塞回网络栈这正是 WinDivert 的核心价值——捕获到的包可以改头改尾后重新发回系统。提醒WinDivert 是驱动级工具需要以管理员身份运行这也是新手跑此类项目最常见的第一个坑。三、pydivert 一键安装最快配置方法pydivert 是 WinDivert 的 Python 封装安装只需一行依赖已声明在 requirements.txt 中pip install pydivert3.1.0pydivert 的 API 非常克制核心只有三件套WinDivert(filter)—— 按过滤器创建捕获句柄recv()—— 收包返回结构化的Packet对象send(packet, send_as_is)—— 把包发回系统send_as_isTrue时系统不再重新计算校验和。项目里的 injecter.py 就是一个最小可用的捕获循环self.w: WinDivert WinDivert(w_filter) # 用过滤器打开驱动 with self.w: while True: packet self.w.recv(65575) # 阻塞收包 self.inject(packet) # 逐包处理只有 4 行却完整体现了 Windows 数据包捕获的标准骨架过滤器 → 收包 → 处理 → 回送。四、技巧 1用过滤器把流量漏斗化全量捕获所有包既慢又容易误伤正确姿势是在打开 WinDivert 时就限定范围。项目主程序在启动时动态拼接过滤器字符串main.pyw_filter tcp and ( (ip.SrcAddr 本机IP and ip.DstAddr 目标IP ) or (ip.SrcAddr 目标IP and ip.DstAddr 本机IP ) )这个过滤器的含义是只捕获本机 IP 与目标 IP 之间双向的 TCP 包。三个要点值得新手抄作业tcp and限定协议直接排除 UDP/ICMP 等无关流量双向条件各写一条SrcAddr/DstAddr缺一不可否则只能看到单方向过滤器在 injecter.py 构造WinDivert时传入驱动层就完成过滤用户态零浪费。五、技巧 2收发判断方向Packet 对象直接改内存收到的Packet对象带有ip、tcp等结构化字段读改都很直观。项目用 fake_tcp.py 中的inject()方法区分进出方向packet.is_inbound—— 目标服务器发来的包packet.is_outbound—— 本机发出的包。而改包注入的全部魔法就在 fake_tcp.py 的fake_send_thread()里packet.tcp.psh True # 打上 PSH 标志 packet.ip.packet_len packet.ip.packet_len len(fake_data) # 修正 IP 总长 packet.tcp.payload connection.fake_data # 用伪造 ClientHello 替换载荷注意packet.ip.packet_len必须手动同步——你替换了载荷长度IP 头里的总长度字段就得跟着改否则包在下一跳就会被丢弃。这就是IP/TCP 头部操纵Header manipulation最基础的一步。伪造的 ClientHello 由 utils/packet_templates.py 中的ClientHelloMaker生成以一份真实抓包的 TLS 握手为模板只替换其中的随机数、会话 ID 和SNI 字段伪装域名如auth.vercel.com在 config.json 中一行配置即可切换。六、技巧 3send_as_is与 TCP 序列号陷阱这是全项目最精华、也最容易翻车的一点。项目采用wrong_seq错误序列号策略见 fake_tcp.pyif connection.bypass_method wrong_seq: packet.tcp.seq_num (connection.syn_seq 1 - len(packet.tcp.payload)) 0xffffffff connection.fake_sent True self.w.send(packet, True) # send_as_is True原理拆解正常握手中客户端发出 SYN记录其seq_num随后第三个 ACK 的序列号应为syn_seq 1程序故意把伪造包的seq_num算成应有序列号 - 载荷长度即一个错误的序列号让 DPI 设备按常规抓包逻辑难以把 ClientHello 内容正确还原关键在self.w.send(packet, True)的第二个参数Truesend_as_is。默认情况下 WinDivert 回送包时会重算 TCP 校验和而伪造的序列号需要保持原样送达——所以必须传True告诉驱动别动我的校验和包是什么样就回送什么样。新手最常见的两个错误❌ 用send(packet, False)回送改过的包 → 驱动重算校验和伪装失效❌ 忘记处理 32 位序列号回绕 → 项目里所有序号运算都带了 0xffffffff抄写时请勿省略。此外fake_tcp.py 还完整演示了握手状态机校验SYN 的 ack_num 必须为 0、SYN-ACK 的 ack 必须等于syn_seq 1……任何一条不满足就判定非预期包并安全关闭连接见 on_unexpected_packet。做流量注入时这种防御性校验是保证连接稳定性的关键。七、项目结构速览照着它搭你自己的抓包工具文件职责学习要点main.py本地监听 流量中继监听端口、sock_connect与 utils/network_tools.py 自动探测出口网卡 IPinjecter.py捕获循环基类WinDivert 生命周期管理with语句fake_tcp.py改包与注入头部字段改写、send_as_is、状态机校验monitor_connection.py连接状态表用五元组(src_ip, src_port, dst_ip, dst_port)作键索引连接utils/packet_templates.pyClientHello 构造基于真实模板做字节级替换config.json运行配置监听端口、目标 IP/端口、Fake SNI八、常见坑与排查清单 ️驱动加载失败确认以管理员身份运行且未被安全软件拦截 WinDivert 驱动收不到包90% 是过滤器写错先用宽松过滤器tcp验证链路再逐步收紧连接直接断开检查 IP 总长是否随载荷同步更新、序列号是否处理了回绕校验和不匹配确认伪造包回送时使用了send_as_isTrue端口被占修改 config.json 中的LISTEN_PORT后重启。九、总结通过 SNI-Spoofing 这个项目一条 Windows 数据包捕获的完整知识线就串起来了WinDivert 过滤器精确选包 → pydivertrecv收包 → Packet 对象直接改 IP/TCP 头 →send(send_as_is)控制校验和 → 状态机保证注入时机正确这套捕获—篡改—注入的三板斧是 DPI 绕过、透明代理、流量加速类工具的通用底座。建议从 injecter.py 的四行主循环读起再顺着 fake_tcp.py 的状态机走一遍你就能独立搭出属于自己的 Windows 数据包处理工具了。【免费下载链接】SNI-SpoofingBypass DPI with IP/TCP-Header manipulation项目地址: https://gitcode.com/gh_mirrors/sn/SNI-Spoofing创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表