C#利用SharpPcap实现网络包捕获嗅探

作者:Alan.hsiang 时间:2021-11-24 00:47:27 

本文是利用SharpPcap实现网络包的捕获的小例子,实现了端口监控,数据包捕获等功能,主要用于学习分享。

什么是SharpPcap?

SharpPcap 是一个.NET 环境下的网络包捕获框架,基于著名的 pcap/WinPcap 库开发。提供了捕获、注入、分析和构建的功能,适用于 C# 和 VB NET 开发语言。

SharpPcap有两部分组成:1> SharpPcap.dll 负责数据的捕获  2> PacketDotNet.dll负责数据包的解析

思路:

通过进程名字获取对应的端口号。
SharpPcap获取对应的数据包,通过解析数据包过滤相关的端口。

涉及知识点:

Process 获取相关进程信息。
netstat命令:netstat -ano|find "3844" 获取进程对应的端口
SharpPcap相关信息:

       通过CaptureDeviceList的静态方法获取设备列表。
       通过OnPacketArrival事件接收数据包。
       通过PacketDotNet来解析数据包

效果图下:

C#利用SharpPcap实现网络包捕获嗅探

SharpPcap核心代码:


/// <summary>
 /// 开始捕捉
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void btnStart_Click(object sender, EventArgs e)
 {
  if (this.combDevice.SelectedIndex > -1)
  {
   StartCapture(this.combDevice.SelectedIndex);
   this.btnStart.Enabled = false;
   this.btnStop.Enabled = true;
  }
  else {
   MessageBox.Show(this,"请选择一个设备","提示",MessageBoxButtons.OK);
  }
 }

/// <summary>
 /// 停止捕捉
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void btnStop_Click(object sender, EventArgs e)
 {
  Shutdown();
  this.btnStop.Enabled = false;
  this.btnStart.Enabled = true;
 }

private void StartCapture(int itemIndex)
 {
  packetCount = 0;
  device = CaptureDeviceList.Instance[itemIndex];
  packetStrings = new Queue<PacketWrapper>();
  bs = new BindingSource();
  dgvData.DataSource = bs;
  LastStatisticsOutput = DateTime.Now;

// start the background thread
  backgroundThreadStop = false;
  backgroundThread = new Thread(BackgroundThread);
  backgroundThread.Start();

// setup background capture
  device.OnPacketArrival += new PacketArrivalEventHandler(device_OnPacketArrival);
  device.OnCaptureStopped += new CaptureStoppedEventHandler(device_OnCaptureStopped);
  device.Open();

// tcpdump filter to capture only TCP/IP packets
  string filter = "ip and tcp";
  device.Filter = filter;

// force an initial statistics update
  captureStatistics = device.Statistics;
  UpdateCaptureStatistics();

// start the background capture
  device.StartCapture();

btnStop.Enabled = true;
 }

/// <summary>
 /// 设备接收事件
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void device_OnPacketArrival(object sender, CaptureEventArgs e)
 {
  // print out periodic statistics about this device
  var Now = DateTime.Now;
  var interval = Now - LastStatisticsOutput;
  if (interval > new TimeSpan(0, 0, 2))
  {
   Console.WriteLine("device_OnPacketArrival: " + e.Device.Statistics);
   captureStatistics = e.Device.Statistics;
   statisticsUiNeedsUpdate = true;
   LastStatisticsOutput = Now;
  }

lock (QueueLock)
  {
   PacketQueue.Add(e.Packet);
  }
 }

/// <summary>
 /// 设备停止事件
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="status"></param>
 private void device_OnCaptureStopped(object sender, CaptureStoppedEventStatus status)
 {
  if (status != CaptureStoppedEventStatus.CompletedWithoutError)
  {
   MessageBox.Show("Error stopping capture", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
  }
 }

private void UpdateCaptureStatistics()
 {
  tlblStatistic.Text = string.Format("接收包: {0}, 丢弃包: {1}, 接口丢弃包: {2}", captureStatistics.ReceivedPackets,captureStatistics.DroppedPackets, captureStatistics.InterfaceDroppedPackets);
 }

来源:http://www.cnblogs.com/hsiang/p/7696347.html

标签:C#,SharpPcap,嗅探
0
投稿

猜你喜欢

  • 详解IDEA使用Maven项目不能加入本地Jar包的解决方法

    2022-07-02 02:20:49
  • Kotlin Flow常用封装类StateFlow使用详解

    2022-07-16 03:46:28
  • 如何在IDE部署springboot项目(有swagger和无swagger都是一样的)到服务器或者虚拟机上的docker

    2023-09-01 00:33:25
  • SSM框架整合之junit测试的方法

    2022-11-12 16:03:19
  • Java IO异常如何处理详析

    2023-12-04 21:51:29
  • Java基于Runtime调用外部程序出现阻塞的解决方法

    2023-11-09 04:24:23
  • Java面向对象之猜拳游戏

    2022-10-29 21:26:45
  • java如何获得redis所有的key-value

    2022-03-13 12:22:14
  • 学生信息管理系统java版

    2023-06-16 15:48:10
  • JAVA编程不能不知道的反射用法总结

    2023-08-25 18:41:06
  • 关于各种排列组合java算法实现方法

    2023-11-15 05:46:55
  • Java枚举的七种常见用法总结(必看)

    2022-10-10 08:38:43
  • Java中使用Lambda表达式和函数编程示例

    2022-05-06 03:30:40
  • Springboot启动后执行方法小结

    2022-09-26 22:12:02
  • java 分转元与元转分实现操作

    2023-05-13 16:47:22
  • 深入了解Spring中最常用的11个扩展点

    2023-07-05 17:46:40
  • Android Studio实现简易登录界面制作

    2023-08-25 08:49:42
  • C#事件(event)使用方法详解

    2023-12-24 14:35:05
  • Mybatis-Plus的SQL语句组拼原理说明

    2021-07-03 20:39:22
  • Android自定义水波纹底部导航的实现

    2022-08-23 13:12:35
  • asp之家 软件编程 m.aspxhome.com