狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

.NET 異步封裝 WinDivert:輕松實現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)攔截與修改

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

前言

WinDivert 是一個用于 Windows 操作系統(tǒng)的內(nèi)核模式驅(qū)動程序,允許用戶模式應(yīng)用程序攔截、修改和丟棄網(wǎng)絡(luò)數(shù)據(jù)包。

通過 WinDivert,可以實現(xiàn)各種高級網(wǎng)絡(luò)功能,如防火墻、流量分析工具和虛擬專用網(wǎng)絡(luò)(VPN)客戶端。

WinDivert介紹

WinDivert是windows下為數(shù)不多的非常優(yōu)秀網(wǎng)絡(luò)庫,非常適合用于開發(fā)抓包或修改包的應(yīng)用程序,其擁有以下能力:

  • 抓取網(wǎng)絡(luò)數(shù)據(jù)包

  • 過濾或丟棄網(wǎng)絡(luò)數(shù)據(jù)包

  • 嗅探網(wǎng)絡(luò)數(shù)據(jù)包

  • 注入網(wǎng)絡(luò)數(shù)據(jù)包

  • 修改網(wǎng)絡(luò)數(shù)據(jù)包

同時WinDivert還提供了完整的loopback(回環(huán))IP、IPv6的支持,簡約而強(qiáng)大的Api、高級別的過濾語言(可以想象為sql一樣的東西)。

如此優(yōu)秀的項目自然有著各個語言的二次封裝項目,我在github上也找到了對應(yīng)多個的dotnet封裝項目,但無一例外,他們封裝的比較簡陋或太過于簡陋,下面是封裝項目的一些不足之處:

1、IPHeader、TcpHeader、UdpHeader等未提供網(wǎng)絡(luò)和主機(jī)的Endian轉(zhuǎn)換

2、局限于PInvoke,沒有意識使用dotnet的對象(比如IPv4直接聲明為uint類型)

3、沒有面向?qū)ο蟮姆庋b,甚至簡陋到只有聲明了static的PInvoke方法

4、過濾語言沒有任何處理,使用時要翻閱WinDivert的文檔(寫手sql一個感覺)

5、沒有異步IO封裝,都是清一色的IO同步阻塞(異步IO封裝難度大)

WindivertDotnet介紹

WindivertDotnet是面向?qū)ο蟮腤inDivert的dotnet異步封裝,其保持著完整的底層庫能力,又提供dotnet的完美語法來操作:

Filter對象支持Lambda構(gòu)建filter language,脫離字符串的苦海;

內(nèi)存安全的WinDivert對象,基于IOCP的ValueTask異步發(fā)送與接收方法;

內(nèi)存安全的WinDivertPacket對象,提供獲取包有效數(shù)據(jù)長度、解包、重構(gòu)chucksums等;

WinDivertParseResult提供對解包的數(shù)據(jù)進(jìn)行精細(xì)修改,修改后對WinDivertPacket直接生效;

2.1、網(wǎng)絡(luò)和主機(jī)的Endian自動轉(zhuǎn)換

由于windows平臺是LittleEndian,而標(biāo)準(zhǔn)的IPHeader、TcpHeader、UdpHeader網(wǎng)絡(luò)定義都是BigEndian,如果未做任何處理,當(dāng)接收到一個SrcPort為80、DstPort為443的Tcp包時映射為結(jié)構(gòu)體時,你調(diào)式會看到如下結(jié)果:

由于沒有做Endian自動轉(zhuǎn)換,在調(diào)試時看到的數(shù)據(jù)甚至讓人抓狂,此時如果你把SrcPort改為我們理解為81端口,你是不能直接寫xxx.SrcPort = 81這樣的csharp代碼的,應(yīng)該是xxx.SrcPort = 20736

WindivertDotnet項目花了很大的時間精力,為所有涉及的結(jié)構(gòu)體字段訪問時都做了必要的Endian讀取和寫入自動轉(zhuǎn)換,讓調(diào)用者不再為Endian問題費(fèi)腦子。

2.2、結(jié)合使用dotnet類型

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

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

2.3、面向?qū)ο蟮姆庋b

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

2.4、Filter

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

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

WindivertDotnet提供Filter類型使用Lambda來構(gòu)造這個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模型,遺憾的是目前沒有任何封裝項目應(yīng)用了這個參數(shù),并結(jié)合IOCP模型包裝為dotnet的Task或ValueTask異步模型。他們都是直接PInvoke使用了SendRecv這兩個api,或者是SendEx之后又同步阻塞等待LPOVERLAPPED的完成,這種和dotnet里的 Task.Wait() 其實是一個道理,調(diào)用工作線程在IO完成之前只能干等,而沒法抽身回到線程池中。

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

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

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

總結(jié)

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

項目地址

WinDiverthttps://github.com/basil00/WinDivert

WindivertDotnethttps://github.com/xljiulang/WindivertDotnet

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

作者:老九

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


閱讀原文:原文鏈接


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