.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 編輯過 |
關鍵字查詢
相關文章
正在查詢... |