这些天计划好好研究下tcp/ip,以及socket套接字,毕竟工控中设计到各种交互协议,如果只是模模糊糊的了解,对分析此类dump还是非常不利的,而研究协议最好的入手点就是用抓包工具 wireshark,废话不多说,这篇通过 wireshark 提取一个小图片作为入手。
为了方便演示,我们就用最简单的 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"
- }
- }
- }
- }
-
-
运行之后,一切正常,截图如下:
这里我们将 wireshark 部署在 server (192.168.25.133)端,不过在开启之前有两点要注意:
参考截图如下:
启动捕获后,在首页开始上传一个 1M左右的图片,在 wireshark 中可以看到这 1M 的图片被切割成了 791 个 tcp segment 发送。
接下来在 上图中的 Http 请求上点击右键,选择 Follow -> TCP Stream ,会自动打开本次 http 传输的全部内容,接下来记得做下面三个选择:
详情截图如下:
根据 http 上传图片的格式,把内容中换行符之前和之后的二进制都去掉,而这个换行符的二进制表示为 0D0A,接下来打开 winhex,删掉 0D0A 之前和之后的所有多余字符。截图如下:
如果大家有点懵,可以观察一个正确的 PNG 在 WinHex 上的表现,选中多余的二进制之后做一个 delete 操作,然后重命名为 test.png,截图如下:
哈哈,一张图片映入眼帘,打完收工!
wireshark 还是非常强大有意思的,相比呈现工具更多的还是需要对协议的理解,希望能对dump分析提供一些原料动力!