C#基于SharpPcap数据包捕获软件开发实例

时间:2024-05-21 07:21:21

点击打开链接

一、软件总体设计

  运行于windows平台,使用图形图像界面进行交互,界面风格良好,操作简单快捷。本软件依靠SharpPcap插件,这个是一个.NET 环境下的网络包捕获框架,基于著名的 pcap/WinPcap 库开发。提供了捕获、注入、分析和构建数据包的功能。本软件主要使用其捕获部分提供的相关方法进行二次开发。软件主要分为四个功能模块,网络接口的选取、数据包的捕获与解析、数据包的过滤和数据包捕获过程简单统计。用户打开本软件后首先进行网络接口的选择,该部分会对正在活动(有数据包捕获的接口)接口进行提示。网络接口选择完成后,点击开始按钮将开始数据包的捕获,捕获后的每一个数据包会以包序列的形式在主界面中对其相关信息进行简略显示。点击相应的数据包条目,会依照TCP/IP协议的层次显示详细的数据包信息。输入过滤条件可以对捕获的数据包进行过滤,仅显示满足条件的部分数据包条目,过滤条件可在数据包捕获前或捕获中进行设置。点击统计控件,会对数据包的捕获过程进行简单统计和分析。

                                                      C#基于SharpPcap数据包捕获软件开发实例

                                                                                            功能图

                                             C#基于SharpPcap数据包捕获软件开发实例

                                                                                              流程图


二、 各模块详细设计方案及核心算法


 1.网络接口选择模块设计

       SharpPcap中存在CaptureDeviceList类,该类对操作网络接口提供了相关的方法,使用该类中的 Instance属性,调用该属性可以获得本机一个网络接口列表,该列表中包含本机中全部的网络接口。设备分为2个子类,一类是真实的网络设备吧,还有一类是通过读取抓包文件生成的虚拟设备。在网络接口选择模块中,将网络接口列表作为参数传入一个新创建的窗体,该窗体用于选择捕获哪个接口传输的数据包。在这个模块需要获取接口的名称和接口的活动状态,使用RadioButton控件让用户选择抓取模式。用户选则完成后修改主窗体的静态变量来传递用户所选择的接口在接口列表的索引和所选择抓取模式,便于后续的相关操作。网络接口列表中的每一个元素均为ICaptureDevice类的实例,该类的ToString()方法返回一个string类型的字符串,该字符串包括了网络名称、IP地址等相关信息,该字符串中每一类信息以回车分割,通过分割字符串的操作可以获取需要的网络名称。判断接口活动状态的方法是将所有接口的抓包方法打开,判断该接口是否存在数据包的传输,如果存在,则表明该接口处于活动状态。接口名称和接口状态装填到DataGridView控件中进行显示,便于用户选择。具体抓取方法在数据包的捕获与解析模块设计中会有详细介绍。该部分的主要代码如下图。

C#基于SharpPcap数据包捕获软件开发实例C#基于SharpPcap数据包捕获软件开发实例


2.数据包的捕获与解析模块设计

      该模块用于捕获和解析数据包的相关内容,目前本软件支持的捕获并解析的数据包所属协议包括:ARP、PPPoE、PPP、LCP、IPV4、IPV6、ICMP、IGMP、TCP、UDP、POP3、SMTP、FTP、HTTP、DNS、SNMP、TFTP、SSDP、DHCP等,具体捕获层次如下图。

C#基于SharpPcap数据包捕获软件开发实例

      首先创建数据绑定的实例 BindingSource BS=new BindingSource()该实例用于与DataGridView控件的DataSource属性。当向BS中添加元素,就会在DataGridView中显示。捕获数据包之前,首先设置所选择接口的OnPacketArrival事件,该事件在数据包被捕获时会被触发。注册该事件时调用数据包处理的方法,即可设置数据包到来后将数据包的简略信息添加到DataGridView控件的操作。事件注册完成后调用接口的Open方法打开接口,Open方法的参数为捕获模式。最后调用StartCapture()方法即可开始捕获数据包。具体代码如下图

                                            C#基于SharpPcap数据包捕获软件开发实例

  数据包处理方法中编写数据包到来后进行相关操作的代码,这个方法的定义中有两个参数,一个object类型sender和一个CaptureEventArgs类型的e。使用e.Packet属性可以获取触发该事件时捕获的数据包。这里封装一ParketStatistics类,该类传入的参数为抓取到数据包编号(该编号从开始抓取时从0自增)和e.Packet的基础包。使用这个类对数据包中的数据进行简略信息的解析。该类创建的实例将被添加到数据绑定BS中,在ParketStatistics中定义相应属性的get访问器,在向BS中添加元素后会将对应的数据添加到DataGridView控件当中进行显示ParketStatistics类中的属性定义如下图

                                                               C#基于SharpPcap数据包捕获软件开发实例

  这里需要的部分信息可直接调用e.Packet中封装的相关属性直接获得。但是对于协议和信息是无法直接获得的,这时候需要封装一个数据包解析的类ParketAnalysis,该类用于对数据包按层次解析。该类在实例化的时候传入的参数为ParketStatistics的实例。这个类使我们这个软件的核心,使用该类可以获得本软件中支持的全部协议的全部信息。该类的实现方法是通过对基础数据包从网络接口层到应用层依次进行解析,解析底层协议的数据包时可以获得上层使用的协议。这时根据上层使用的协议将基础包转换为上层协议类型的数据包即可获得上层协议的相关字段,依次向上进行将可完成全部数据包的解析。对于应用层数据包解析时,在传输层并未提供上层协议,这时我们可以通过端口进行判断,不同端口使用不同的协议。数据包解析部分过程如下图。

                C#基于SharpPcap数据包捕获软件开发实例 

              C#基于SharpPcap数据包捕获软件开发实例

   在SharpPcap和TwzyProtocol插件中封装了大部分协议对应的数据包类,这些类我们直接进行实例化,然后就可以获得协议中的相应字段,具体如下图

                 C#基于SharpPcap数据包捕获软件开发实例

   但是部份协议在这两个插件中并未进行封装,对于这些未封装的协议这里要利用他们底层协议中载荷属性保存的上层数据对上层协议进行解析。这里的载荷属性为PayloadData,该属性会返回一个byte数组,该数据保存了上层协议的全部信息。对于基于TCP的应用层协议比较好进行解析,这些协议是以命令行的形式呈现的,将byte数组依照编码格式转换为字符串即可获得全部的命令行。通过对于字符串的分割和简单处理即可解析该协议,如下图对于FTP协议的解析。

                   C#基于SharpPcap数据包捕获软件开发实例

  对于其他的协议解析起来需要依托协议格式对byte数组进行分割,解析,这部分处理起来比较麻烦,也是本软件设计的难点之一。这里将以TFTP协议的解析作为例子对解析方法进行说明。TFTP数据包分为五种Read request (RRQ)、Write request (WRQ)、Data (DATA)、Acknowledgment (ACK)、Error (ERROR),这五种对应的格式如下图

                  C#基于SharpPcap数据包捕获软件开发实例

解析TFTP数据包时我们先从byte数组中获取前两位,计算这个数据包是TFTP协议中的哪种包,然后根据不同的数据包使用不同的解析办法。对于协议中定长的字段使用byte数组中提供的Skip()方法和Tack()方法即可,Skip方法中的参数为byte数组起始截取位置Tack方法的参数为截取的长度。对于不定长的字段直接使用Skip()方法截取的到结尾即可,将截取后的byte数组转换为字符串,原byte数组中以0作为分割符的部分将变为\0,使用Split()方法,以\0作为分隔符分割字符串即可获得不定长的string类型的协议字段。解析TFTP协议的代码如下图。         

                   C#基于SharpPcap数据包捕获软件开发实例

                   C#基于SharpPcap数据包捕获软件开发实例

                   C#基于SharpPcap数据包捕获软件开发实例

3.数据包过滤模块设计

  本软件支持的过滤方式有四种,分别为协议过滤、源地址过滤、目的地址过滤、地址过滤(既可以是源地址也可以是目的地址)。这部分首先要从combobox控件中读取过滤的字符串,根据过滤的字符串判断过滤的条件所属的类型,根据不同的过滤类型,编写不同的方法进行过滤。这里设置过滤条件可以在捕获按钮点击之前进行也可以在捕获过程中进行。在开始前进行的实现方案是判断数据包中相应的字段与过滤的条件是否匹配,匹配则添加到数据绑定BS。具体代码如下图。

                   C#基于SharpPcap数据包捕获软件开发实例

在捕获进行中的实现方案分为两个部分,第一个部分是清空数据绑定BS。对已经捕获的数据包在当前条件下进行过滤,将满足当前条件的添加到数据绑定。然后与开始前进行过滤的实现方案一样,在包的处理方法中对新到来的数据包判断其中相应的字段与过滤的条件是否匹配,匹配则添加到数据绑定。实现代码如下图。

       C#基于SharpPcap数据包捕获软件开发实例

 4.数据包统计模块设计

  这部分针对数据包的捕获过程利用相关的控件进行图形化的显示。对于数据包的捕获情况有更好的了解,通过图表显示与当前连接最密切的网络地址,对网络安全防护有一定的帮助。这部分的实现主要依托于C#的chart控件,该控件可以用来绘制各类图表。这里使用了折线图和条形图,属性设置如下图。

                  C#基于SharpPcap数据包捕获软件开发实例

   本部分会对两个部分进行统计,第一部分是对每秒钟捕获的数据包数目进行统计。这里需要一个Timer控件用于计时,该计时器的间隔设置为1S,每经过1S触发一次计时器的事件,在该事件的事件方法中计算出这一秒钟抓取的数据包数目(两个变量,一个变量用于记录此时的数据包总量,另一个变量记录前一秒数据包总量,相减的差值即为这一秒内的数目,然后进行变量交换,前一秒的数量为当前数量,当前数量为0)。另外在折线图中仅显示近10秒的数据包捕获情况,所以还要设置折线图的上界和下界,这里的上界和下界在每一次事件触发时都会同时自加,保证动态的效果。具体代码如下图。

    C#基于SharpPcap数据包捕获软件开发实例   C#基于SharpPcap数据包捕获软件开发实例

另一部分的统计是对于所有已经捕获的包中从某个地址发往本机的包的数量和本机发往某个目的地址包的数量最多的的五个地址进行数量的统计。该统计可以反映与本机频繁交换数据的某个地址。这个统计过程也是按照秒更新的,实现的方法也是要依托Timer控件。另外我们需要在主窗体的代码中定义两个静态变量,这两个静态变量用于统计每一个IP地址发往本机的包的数目和本机发往每一个IP地址的包的数目,这两个变量的类型是 Dictionary<string, int>,这是一种键、值容器,它使用C#中的Linq库,可以对元素进行快速查找和排序。在这里使用这个容器可以对每一个IP地址发送的包和接收的包进行计数。这里的string为键,存入的为IP地址,int为值,存入的为该IP地址发送的包的数目。具体的使用方法如下图。

                    C#基于SharpPcap数据包捕获软件开发实例

由于要统计的是最多的5个地址,所以还要Dictionary<string, int>容器中的元素进行排序,这里排序使用的Linq库中的排序语句写法。对于排完序的容器,我们利用foreach语句遍历其中前五个元素,这五个元素就是要统计的,将这五个元素的IP地址和对应的数目添加到图表即可。具体实现如下。

                 C#基于SharpPcap数据包捕获软件开发实例




ps:需要源码啥的留邮箱吧,这个资源上传问题真的大。。。。。莫名其妙就是上传不了,要不就是链接挂了,但是留邮箱我不能保证时刻都能看到,我不是每天都来看博客,只能说尽量吧。。。。。需要的加我QQ吧,827391162。这里我也不经常看。。。