一:背景
1. 講故事
這些天計劃好好研究下tcp/ip,以及socket套接字,畢竟工控中設計到各種互動協議,如果只是模模糊糊的瞭解,對分析此類dump還是非常不利的,而研究協議最好的入手點就是用抓包工具 wireshark,廢話不多說,這篇透過 wireshark 提取一個小圖片作為入手。
二:wireshark 圖片抓包
1. 捕獲圖片
為了方便演示,我們就用最簡單的 http 上傳圖片的方式,客戶端程式碼如下:
<form method="post" action="/Home/Upload" enctype="multipart/form-data">
<input type="file" name="file" />
<button type="submit">Upload</button>
</form>
接下來是server端程式碼,用 chatgpt 吐出來的程式碼做了一點簡單修改。
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);
// 儲存檔案到磁碟
using (var stream = new FileStream(filePath, FileMode.Create))
{
await file.CopyToAsync(stream);
}
return Ok("File uploaded successfully.");
}
}
接下來將 asp.net core 部署在虛擬機器上,修改埠為80,appsettings.json 修改如下:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://0.0.0.0:80"
}
}
}
}
執行之後,一切正常,截圖如下:
2. wireshark 捕獲
這裡我們將 wireshark 部署在 server (192.168.25.133)端,不過在開啟之前有兩點要注意:
- 尋找到你需要採集流量包的網路卡,比如我這裡的 Ethernet0
- 設定一個捕獲過濾器,這樣就不會把你的 wireshark 採集介面給卡死。
參考截圖如下:
啟動捕獲後,在首頁開始上傳一個 1M左右的圖片,在 wireshark 中可以看到這 1M 的圖片被切割成了 791 個 tcp segment 傳送。
接下來在 上圖中的 Http 請求上點選右鍵,選擇 Follow -> TCP Stream ,會自動開啟本次 http 傳輸的全部內容,接下來記得做下面三個選擇:
- 選擇正確的資料包流向
- 資料格式為原始的Raw格式
- Save as 儲存到本地
詳情截圖如下:
根據 http 上傳圖片的格式,把內容中換行符之前和之後的二進位制都去掉,而這個換行符的二進位制表示為 0D0A
,接下來開啟 winhex,刪掉 0D0A
之前和之後的所有多餘字元。截圖如下:
- 之前
- 之後
如果大家有點懵,可以觀察一個正確的 PNG 在 WinHex 上的表現,選中多餘的二進位制之後做一個 delete 操作,然後重新命名為 test.png,截圖如下:
哈哈,一張圖片映入眼簾,打完收工!
三:總結
wireshark 還是非常強大有意思的,相比呈現工具更多的還是需要對協議的理解,希望能對dump分析提供一些原料動力!