詳解如何通過(guò)wireshark實(shí)現(xiàn)捕獲C#上傳的圖片
一:背景
講故事
這些天計(jì)劃好好研究下tcp/ip,以及socket套接字,畢竟工控中設(shè)計(jì)到各種交互協(xié)議,如果只是模模糊糊的了解,對(duì)分析此類dump還是非常不利的,而研究協(xié)議最好的入手點(diǎn)就是用抓包工具 wireshark,廢話不多說(shuō),這篇通過(guò) wireshark 提取一個(gè)小圖片作為入手。
二:wireshark 圖片抓包
1. 捕獲圖片
為了方便演示,我們就用最簡(jiǎn)單的 http 上傳圖片的方式,客戶端代碼如下:
<form method="post" action="/Home/Upload" enctype="multipart/form-data"> <input type="file" name="file" /> <button type="submit">Upload</button> </form>
接下來(lái)是server端代碼,用 chatgpt 吐出來(lái)的代碼做了一點(diǎn)簡(jiǎn)單修改。
public class HomeController : Controller { private readonly ILogger<HomeController> _logger; private readonly IWebHostEnvironment _env; public HomeController(IWebHostEnvironment env) { _env = env; } [HttpPost] public async Task<IActionResult> Upload(IFormFile file) { if (file == null || file.Length == 0) { return BadRequest("Please select a file to upload."); } // 生成唯一的文件名 var fileName = Guid.NewGuid().ToString() + Path.GetExtension(file.FileName); // 拼接文件保存路徑 var filePath = Path.Combine(_env.WebRootPath, "uploads", fileName); // 保存文件到磁盤(pán) using (var stream = new FileStream(filePath, FileMode.Create)) { await file.CopyToAsync(stream); } return Ok("File uploaded successfully."); } }
接下來(lái)將 asp.net core 部署在虛擬機(jī)上,修改端口為80,appsettings.json 修改如下:
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "Kestrel": { "Endpoints": { "Http": { "Url": "http://0.0.0.0:80" } } } }
運(yùn)行之后,一切正常,截圖如下:
2. wireshark 捕獲
這里我們將 wireshark 部署在 server (192.168.25.133)端,不過(guò)在開(kāi)啟之前有兩點(diǎn)要注意:
- 尋找到你需要采集流量包的網(wǎng)卡,比如我這里的 Ethernet0
- 設(shè)置一個(gè)捕獲過(guò)濾器,這樣就不會(huì)把你的 wireshark 采集界面給卡死。
參考截圖如下:
啟動(dòng)捕獲后,在首頁(yè)開(kāi)始上傳一個(gè) 1M左右的圖片,在 wireshark 中可以看到這 1M 的圖片被切割成了 791 個(gè) tcp segment 發(fā)送。
接下來(lái)在 上圖中的 Http 請(qǐng)求上點(diǎn)擊右鍵,選擇 Follow -> TCP Stream ,會(huì)自動(dòng)打開(kāi)本次 http 傳輸?shù)娜績(jī)?nèi)容,接下來(lái)記得做下面三個(gè)選擇:
- 選擇正確的數(shù)據(jù)包流向
- 數(shù)據(jù)格式為原始的Raw格式
- Save as 保存到本地
詳情截圖如下:
根據(jù) http 上傳圖片的格式,把內(nèi)容中換行符之前和之后的二進(jìn)制都去掉,而這個(gè)換行符的二進(jìn)制表示為 0D0A
,接下來(lái)打開(kāi) winhex,刪掉 0D0A
之前和之后的所有多余字符。截圖如下:
之前
之后
如果大家有點(diǎn)懵,可以觀察一個(gè)正確的 PNG 在 WinHex 上的表現(xiàn),選中多余的二進(jìn)制之后做一個(gè) delete 操作,然后重命名為 test.png,截圖如下:
哈哈,一張圖片映入眼簾,打完收工!
到此這篇關(guān)于詳解如何通過(guò)wireshark實(shí)現(xiàn)捕獲C#上傳的圖片的文章就介紹到這了,更多相關(guān)wireshark捕獲C#上傳圖片內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解C# 網(wǎng)絡(luò)編程系列:實(shí)現(xiàn)類似QQ的即時(shí)通信程序
本篇主要介紹了c#實(shí)現(xiàn)類似QQ的即時(shí)通信程序 ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-12-12如何用C#獲取計(jì)算機(jī)詳細(xì)的軟件和硬件信息
我們應(yīng)該都知道System.Management提供的類可以用于讀取本地計(jì)算機(jī)設(shè)備的各種數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于如何用C#獲取計(jì)算機(jī)詳細(xì)的軟件和硬件信息的相關(guān)資料,需要的朋友可以參考下2022-12-12C#實(shí)現(xiàn)注冊(cè)碼注冊(cè)機(jī)制效果詳解
這篇文章主要為大家詳細(xì)介紹了C#如何實(shí)現(xiàn)注冊(cè)碼注冊(cè)機(jī)制效果,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下2023-01-01結(jié)構(gòu)體和聯(lián)合體的區(qū)別及說(shuō)明
文章主要介紹了C語(yǔ)言中的結(jié)構(gòu)體和聯(lián)合體,結(jié)構(gòu)體是一種自定義的復(fù)合數(shù)據(jù)類型,可以包含多個(gè)成員,每個(gè)成員可以是不同的數(shù)據(jù)類型,聯(lián)合體是一種特殊的數(shù)據(jù)結(jié)構(gòu),可以在內(nèi)存中共享同一段存儲(chǔ)空間來(lái)存儲(chǔ)不同類型的數(shù)據(jù)2025-01-01C#把數(shù)組中的某個(gè)元素取出來(lái)放到第一個(gè)位置的實(shí)現(xiàn)方法
這篇文章主要介紹了C#把數(shù)組中的某個(gè)元素取出來(lái)放到第一個(gè)位置的實(shí)現(xiàn)方法,涉及C#針對(duì)數(shù)組的常見(jiàn)操作技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-12-12C#實(shí)現(xiàn)rabbitmq 延遲隊(duì)列功能實(shí)例代碼
本篇文章主要介紹了C#實(shí)現(xiàn)rabbitmq 延遲隊(duì)列功能實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-04-04