欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

.NET 異步封裝 WinDivert:輕松實現網絡數據攔截與修改

admin
2024年12月28日 20:56 本文熱度 64

前言

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端口,你是不能直接寫xxx.SrcPort = 81這樣的csharp代碼的,應該是xxx.SrcPort = 20736

WindivertDotnet項目花了很大的時間精力,為所有涉及的結構體字段訪問時都做了必要的Endian讀取和寫入自動轉換,讓調用者不再為Endian問題費腦子。

2.2、結合使用dotnet類型

IPv4地址占用4字節,IPv6地址占用16字節,所以一些封裝項目直接在結構體聲明為uint SrcAddrfixed uint SrcAddr[4],當然這些聲明是沒有錯誤,但是你叫使用者怎么使用呢,使用者往往是var ipAddress = IPAddress.Parse("1.2.3.4)"得到一個IPAddress類型,他們沒有精力去研究怎么把IPAddress轉為你的uint或uint[4],或者從uint或uint[4]轉換為IPAddress類型,再加上使用了uint,又得注意Endian的轉換,造成這種封裝離實際應用太遙遠。

WindivertDotnet在聲明字段類型時,當存在對應的dotnet高級類型時,優先使用這些高級類型,除了IPAddress之外,如果字段可以使用枚舉的,也都聲明為了枚舉類型,甚至在修改這些屬性值時,有嚴格的輸入校驗。

2.3、面向對象的封裝

WindivertDotnet將零散的過程式c-api,包裝為多種對象,而不是讓你面對滿天飛的各種靜態方法PInvoke調用IntPrt句柄和維護這些句柄的生命周期,例如WinDivertPacket對象,其本質是一個非托管的緩沖區內存,在沒有封裝之前,它就是一個csharp的IntPrt類型,看到這個類型,你得加個八倍鏡觀察可以做為參數傳給哪些靜態Api方法,同時確保不要忘記不使用之后,要手動去釋放它,否則內存就一直占用。

2.4、Filter

filter language是WinDivert引以為豪的設計,對WinDivert來說就像是從0到1發明了sql一樣,它允許使用簡單的文本表達式來讓驅動層高性能地過濾得自己感興趣的數據包,比如outbound and !loopback and (tcp.DstPort == 80 or udp.DstPort == 53),這種filter的作用,想必使用過wireshark軟件的都特別明白。

不足的是,人們在做dotnet封裝時,僅僅做了Invoke(string filter)這種傳話筒式的封裝,好家伙,filter language一共100個字段左右,我保證使用者不翻看filter language寶典的話,肯定不知道怎么構造這個string內容,您好歹從語法層面超越一下,提供一下filter的Builder也好啊。

WindivertDotnet提供Filter類型使用Lambda來構造這個filter language,有了它您不再需要珍藏filter language葵花寶典了,就像使用了EF之后不會sql又何妨呢,因為如下的csharp代碼,每個人都打得出:

var filter = Filter.True
    .And(f => f.Network.Outbound && !f.Network.Loopback)
    .And(f => f.Tcp.DstPort == 80 || f.Udp.DstPort == 53);

2.5、異步IO封裝

沒有async和await的IO,那不是完美的IO,WinDivert提供了可選的LPOVERLAPPED,讓上層可以使用IOCP模型,遺憾的是目前沒有任何封裝項目應用了這個參數,并結合IOCP模型包裝為dotnet的Task或ValueTask異步模型。他們都是直接PInvoke使用了SendRecv這兩個api,或者是SendEx之后又同步阻塞等待LPOVERLAPPED的完成,這種和dotnet里的 Task.Wait() 其實是一個道理,調用工作線程在IO完成之前只能干等,而沒法抽身回到線程池中。

WindivertDotnet將LPOVERLAPPED與IOCP模型結合,并封裝為dotnet的TAP異步模型,凝結出下面兩個核心方法:

ValueTask<intRecvAsync(WinDivertPacket, WinDivertAddress, CancellationToken);
ValueTask<intSendAsync(WinDivertPacket, WinDivertAddress, CancellationToken);

Api方法是簡單,但過程曲折,沒有資料,碰壁無數,哪怕是小小的CancellationToken參數,但它卻能讓pendding的IO操作撤銷下來。

總結

因FastGithub項目的需要,所以本項目才得以誕生,現在我是結合實際項目的中使用痛點來改進本項目,甚至添加了一些WinDivert目前沒有的功能,相信本項目越來越好用。

項目地址

WinDiverthttps://github.com/basil00/WinDivert

WindivertDotnethttps://github.com/xljiulang/WindivertDotnet

最后
如果你覺得這篇文章對你有幫助,不妨點個贊支持一下!你的支持是我繼續分享知識的動力。如果有任何疑問或需要進一步的幫助,歡迎隨時留言。也可以加入微信公眾號[DotNet技術匠] 社區,與其他熱愛技術的同行一起交流心得,共同成長!

作者:老九

出處:cnblogs.com/kewei/p/16801036.html


閱讀原文:原文鏈接


該文章在 2024/12/30 15:24:00 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved