详解如何通过wireshark实现捕获C#上传的图片

 更新时间:2023年11月17日 08:52:00   作者:一线码农  
这篇文章主要为大家详细介绍了如何通过wireshark实现捕获C#上传的图片,文中的示例代码简洁易懂,具有一定的学习价值,感兴趣的小伙伴可以了解下

一:背景

讲故事

这些天计划好好研究下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实现捕获C#上传的图片的文章就介绍到这了,更多相关wireshark捕获C#上传图片内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 在C#项目中使用NLog进行日志记录的方法步骤

    在C#项目中使用NLog进行日志记录的方法步骤

    这篇文章主要介绍了如何使用NLog进行日志记录,包括安装NuGet包、配置NLog.config文件、在代码中使用Logger以及验证日志输出,文章详细说明了在控制台/桌面应用和ASP.NET Core Web应用中的具体步骤,并强调了关键注意事项,需要的朋友可以参考下
    2025-12-12
  • 解析使用enumerator模式简化异步操作的详解

    解析使用enumerator模式简化异步操作的详解

    本篇文章是对使用enumerator模式简化异步操作进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C# 实现Scoket心跳机制的方法

    C# 实现Scoket心跳机制的方法

    这篇文章主要介绍了C# 实现Scoket心跳机制的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • C#二维数组基本用法实例

    C#二维数组基本用法实例

    这篇文章主要介绍了C#二维数组基本用法,以实例形式分析了C#中二维数组的定义、初始化、遍历及打印等用法,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • C# 控件属性和InitializeComponent()关系案例详解

    C# 控件属性和InitializeComponent()关系案例详解

    这篇文章主要介绍了C# 控件属性和InitializeComponent()关系案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • c#多线程网络聊天程序代码分享(服务器端和客户端)

    c#多线程网络聊天程序代码分享(服务器端和客户端)

    本程序使用VS2005 制作,程序分为三块,XuLIeHua类库下有我写的把结构序列化的类,还有就是服务器端和客户端
    2013-12-12
  • C#中循环语句:while、for、foreach的使用

    C#中循环语句:while、for、foreach的使用

    本篇文章主要介绍了C#中的三种循环语句(while、for、foreach)的实现方式,需要的朋友可以参考下
    2015-07-07
  • C#(int)中Convert、Parse、TryParse的区别

    C#(int)中Convert、Parse、TryParse的区别

    Convert.ToInt32、int.Parse(Int32.Parse)、int.TryParse、(int) 四者都可以解释为将类型转换为 int,那它们的区别是什么呢?
    2013-04-04
  • C#中使用gRPC通讯的示例详解

    C#中使用gRPC通讯的示例详解

    这篇文章主要为大家详细介绍了C#中如何使用gRPC通讯,包括GRPC文件的创建生成、服务端和客户端函数类库的封装等,需要的可以了解下
    2024-04-04
  • C#中的HttpWebRequest类介绍

    C#中的HttpWebRequest类介绍

    本文详细讲解了C#中的HttpWebRequest类,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-01-01

最新评论