.NET 异步封装 WinDivert:轻松实现网络数据拦截与修改
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
前言WinDivert 是一个用于 Windows 操作系统的内核模式驱动程序,允许用户模式应用程序拦截、修改和丢弃网络数据包。 通过 WinDivert,可以实现各种高级网络功能,如防火墙、流量分析工具和虚拟专用网络(VPN)客户端。
WinDivert介绍 WinDivert是windows下为数不多的非常优秀网络库,非常适合用于开发抓包或修改包的应用程序,其拥有以下能力:
同时WinDivert还提供了完整的loopback(回环)IP、IPv6的支持,简约而强大的Api、高级别的过滤语言(可以想象为sql一样的东西)。 如此优秀的项目自然有着各个语言的二次封装项目,我在github上也找到了对应多个的dotnet封装项目,但无一例外,他们封装的比较简陋或太过于简陋,下面是封装项目的一些不足之处: 1、IPHeader、TcpHeader、UdpHeader等未提供网络和主机的Endian转换 2、局限于PInvoke,没有意识使用dotnet的对象(比如IPv4直接声明为uint类型) 3、没有面向对象的封装,甚至简陋到只有声明了static的PInvoke方法 4、过滤语言没有任何处理,使用时要翻阅WinDivert的文档(写手sql一个感觉) 5、没有异步IO封装,都是清一色的IO同步阻塞(异步IO封装难度大) WindivertDotnet介绍 WindivertDotnet是面向对象的WinDivert的dotnet异步封装,其保持着完整的底层库能力,又提供dotnet的完美语法来操作: Filter对象支持Lambda构建filter language,脱离字符串的苦海; 内存安全的WinDivert对象,基于IOCP的ValueTask异步发送与接收方法; 内存安全的WinDivertPacket对象,提供获取包有效数据长度、解包、重构chucksums等; WinDivertParseResult提供对解包的数据进行精细修改,修改后对WinDivertPacket直接生效; 2.1、网络和主机的Endian自动转换 由于windows平台是LittleEndian,而标准的IPHeader、TcpHeader、UdpHeader网络定义都是BigEndian,如果未做任何处理,当接收到一个SrcPort为80、DstPort为443的Tcp包时映射为结构体时,你调式会看到如下结果: 由于没有做Endian自动转换,在调试时看到的数据甚至让人抓狂,此时如果你把SrcPort改为我们理解为81端口,你是不能直接写 WindivertDotnet项目花了很大的时间精力,为所有涉及的结构体字段访问时都做了必要的Endian读取和写入自动转换,让调用者不再为Endian问题费脑子。 2.2、结合使用dotnet类型 IPv4地址占用4字节,IPv6地址占用16字节,所以一些封装项目直接在结构体声明为 WindivertDotnet在声明字段类型时,当存在对应的dotnet高级类型时,优先使用这些高级类型,除了 2.3、面向对象的封装 WindivertDotnet将零散的过程式c-api,包装为多种对象,而不是让你面对满天飞的各种静态方法PInvoke调用IntPrt句柄和维护这些句柄的生命周期,例如WinDivertPacket对象,其本质是一个非托管的缓冲区内存,在没有封装之前,它就是一个csharp的
2.4、Filter filter language是WinDivert引以为豪的设计,对WinDivert来说就像是从0到1发明了sql一样,它允许使用简单的文本表达式来让驱动层高性能地过滤得自己感兴趣的数据包,比如 不足的是,人们在做dotnet封装时,仅仅做了 WindivertDotnet提供Filter类型使用Lambda来构造这个filter language,有了它您不再需要珍藏filter language葵花宝典了,就像使用了EF之后不会sql又何妨呢,因为如下的csharp代码,每个人都打得出:
2.5、异步IO封装没有async和await的IO,那不是完美的IO,WinDivert提供了可选的 WindivertDotnet将
Api方法是简单,但过程曲折,没有资料,碰壁无数,哪怕是小小的CancellationToken参数,但它却能让pendding的IO操作撤销下来。 总结 因FastGithub项目的需要,所以本项目才得以诞生,现在我是结合实际项目的中使用痛点来改进本项目,甚至添加了一些WinDivert目前没有的功能,相信本项目越来越好用。 项目地址 WinDivert:https://github.com/basil00/WinDivert WindivertDotnet:https://github.com/xljiulang/WindivertDotnet 作者:老九 阅读原文:原文链接 该文章在 2024/12/30 15:24:00 编辑过 |
关键字查询
相关文章
正在查询... |