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来解析数据包
效果图下:
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