当前位置: 首页 > news >正文

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

  1. 之前

  1. 之后

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

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

三:总结

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

相关文章:

  • 用 js 实现数组中指定元素的替换
  • 修改CentOS默认mail发件人名称
  • 2023 年 数维杯(C题)国际大学生数学建模挑战赛 |数学建模完整代码+建模过程全解全析
  • window.open 打开后全屏
  • 开发vue3 UI组件库,并且发布到NPM
  • Redis开发与运维pdf
  • API接口漏洞利用及防御
  • React hooks(一):useState
  • 景联文科技:驾驭数据浪潮,赋能AI产业——全球领先的数据标注解决方案供应商
  • 新版本!飞凌嵌入式RK3568系列开发板全面支持Debian 11系统
  • C#开发的OpenRA游戏之世界存在的属性RenderDebugState(5)
  • 分类预测 | Matlab实现PSO-GRU粒子群算法优化门控循环单元的数据多输入分类预测
  • 使用Python轻松实现科研绘图
  • Ubuntu中安装R语言环境并在jupyter kernel里面增加R kernel
  • linux版:TensorRT安装教程
  • 自己简单写的 事件订阅机制
  • export和import的用法总结
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • Spring框架之我见(三)——IOC、AOP
  • vue脚手架vue-cli
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 今年的LC3大会没了?
  • 利用jquery编写加法运算验证码
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 我有几个粽子,和一个故事
  • 在weex里面使用chart图表
  • 自定义函数
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • Nginx实现动静分离
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #QT项目实战(天气预报)
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (1)(1.13) SiK无线电高级配置(六)
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (2022 CVPR) Unbiased Teacher v2
  • (33)STM32——485实验笔记
  • (9)STL算法之逆转旋转
  • (C)一些题4
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (转载)hibernate缓存
  • .net FrameWork简介,数组,枚举
  • .Net Winform开发笔记(一)
  • .NET 命令行参数包含应用程序路径吗?
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .Net的C#语言取月份数值对应的MonthName值
  • .NET开源快速、强大、免费的电子表格组件
  • /var/lib/dpkg/lock 锁定问题
  • [].shift.call( arguments ) 和 [].slice.call( arguments )
  • [20160902]rm -rf的惨案.txt
  • [20190113]四校联考