一:背景
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分析提供一些原料動力!