• 如何通过 wireshark 捕获 C# 上传的图片


    一:背景

    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">Uploadbutton>
    form>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    接下来是server端代码,用 chatgpt 吐出来的代码做了一点简单修改。

    
        public class HomeController : Controller
        {
            private readonly ILogger _logger;
            private readonly IWebHostEnvironment _env;
    
            public HomeController(IWebHostEnvironment env)
            {
                _env = env;
            }
    
            [HttpPost]
            public async Task 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.");
            }
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    接下来将 asp.net core 部署在虚拟机上,修改端口为80,appsettings.json 修改如下:

    
    {
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft.AspNetCore": "Warning"
        }
      },
      "Kestrel": {
        "Endpoints": {
          "Http": {
            "Url": "http://0.0.0.0:80"
          }
        }
      }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    运行之后,一切正常,截图如下:

    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 之前和之后的所有多余字符。截图如下:

    1. 之前

    1. 之后

    如果大家有点懵,可以观察一个正确的 PNG 在 WinHex 上的表现,选中多余的二进制之后做一个 delete 操作,然后重命名为 test.png,截图如下:

    哈哈,一张图片映入眼帘,打完收工!

    三:总结

    wireshark 还是非常强大有意思的,相比呈现工具更多的还是需要对协议的理解,希望能对dump分析提供一些原料动力!

  • 相关阅读:
    transformer论文及其变种
    RocketMQ(4.9.4)学习笔记 - 安装部署
    【国漫逆袭】火灵儿重返第一巅峰,云曦排名飙升,不良人陷入颓势
    「帝国风暴兵」加入 The Sandbox,推出真实的全新人物化身系列和体验!
    Centos7安装Docker
    IDEA 的 debug 怎么实现?出于这个好奇心,我越挖越深
    java面试(网络)
    A+B 输入输出练习I(c++基础)
    开发GD32遇到的坑B点
    重定向(dup、dup2、dup3)--Linux
  • 原文地址:https://blog.csdn.net/huangxinchen520/article/details/134441538