资源描述
精选优质文档-倾情为你奉上网络安全实践课程项目报告项目名称:基于SharpPcap的网络嗅探器的设计年 级:2010级计算机学院 专 业: 网络工程 班 级: 网络工程二班 姓 名: 陈绪群 学 号: 成 绩: 指导教师: 卢 正 添 提交报告时间: 2013年12月20日摘要: SharpPcap是.Net平台上高性能的包捕获开发工具。本文对SharpPcap的结构和功能进行了详细的介绍和分析,阐述了基SharpPcap捕获和分析网络数据包的方法和主要步骤,并且给出了一个在.Net平台上,Microsoft Visual Studio 2008环境下,基于SharpPcap捕获和 分析网络数据包的实例。该实例能过滤用户指定IP地址、端口号和网络协议的数据包,并在界面实时显示数据包的具体信息。本文还研究了基于Sharpcap的局域网数据包的捕获机制,实现了.NET平台下的原始数据包捕获应用设计,解决了.Net下使用原始套接字抓包慢、丢包严重的问题,填补了.Net程序员捕获原始数据包的空白,实践证明此方法比较快速、准确、稳定、高效。关键词:Sharpcap;数据包;捕获;C#;.Net;1. 研究背景网络技术的日新月异,发展突飞猛进,计算机网络的应用越来越广泛,其作用也越来越重要。但是由于计算机系统中软硬件的脆弱性和计算机网络的脆弱性以及地理分布的位置、自然环境、自然破坏以及人为因素的影响,不仅增加了信息存储、处理的风险,也给信息传送带来了新的问题。计算机网络安全问题越来越严重,网络破坏所造成的损失越来越大。Internet的安全已经成为亟待解决的问题。多数黑客入侵成功并植入后门后的第一件事就是选择一个合适当前网络的嗅探器,以获得更多的受侵者的信息。嗅探器是一种常用的收集有用数据的方法,可以作为网络数据包的设备。网络嗅探器就是是利用计算机的网络接口截获其他计算机的数据报文的一种工具,而且它与一般的键盘捕获程序不同。键盘捕获程序捕获在终端上输入的键值,而嗅探器捕获的则是真实的网络报文.如果把网络嗅探器放置于网络节点处,对网络中的数据帧进行捕获的一种被动监听手段,是一种常用的收集有用数据的方法,可以分析各种信息包并描述出网络的结构和使用的机器,由于它接收任何一个在同一网段上传输的数据包,所以也就存在着捕获密码、各种信息、秘密文档等一些没有加密的信息的可能性。这成为黑客们常用的扩大战果的方法,用来夺取其他主机的控制权。当然嗅探器的正当用处主要是网络管理人员分析网络的流量,以便找出所关心的网络中潜在的问题。例如,假设网络的某一段运行得不是很好,报文的发送比较慢,而我们又不知道问题出在什么地方,此时就可以用嗅探器截获网络中的数据包,分析问题的所在。因此研究网络底层数据包捕获和分析技术对于保障网络安全有着重要的意义。2. 相关技术2.1 开发环境与工具Microsoft Visual Studio 2008,Windows 72.2 开发相关技术2.2.1 C#语言简介C#是在2000年7月发布的一种全新且简单、安全、语言,是专门为.NET的应用而开发的语言。它吸收了C+、Visual Basic、Delphi、Java等语言的优点,体现了当今最新的的功能和精华。C#继承了C语言的语法风格,同时又继承了C+的特性。不同的是,C#的对象模型已经面向Internet进行了重新设计,使用的是.NET的类库;C#不再提供对类型的支持,使得程序不能随便访问空间,从而更加健壮;C#不再支持,避免了以往类层次结构中由于多重继承带来的可怕后果。.NET为C#提供了一个强大的、易用的、一致的程序设计环境。同时,(Common Language Runtime)为C#程序语言提供了一个托管的运行时环境,使程序比以往更加稳定、安全。其特点有:语言简洁。 保留了C+的强大功能。 功能。 语言的自由性。 强大的。 支持跨平台。 与XML相融合。 2.2.2 嗅探技术简介数据在网络上是以很小的称为帧(Frame)的单位传输的,帧由几部分组成,不同的部分执行不同的功能。帧通过特定的称为网络驱动程序的软件进行成型,然后通过网卡发送到网线上,通过网线到达它们的目的机器,在目的机器的一端执行相反的过程。接收端机器的以太网卡捕获到这些帧,并告诉操作系统帧已到达,然后对其进行存储。就是在这个传输和接收的过程中,存在着安全方面的问题。 每一个在局域网(LAN)上的工作站都有其硬件地址,这些地址唯一地表示了网络上的机器(这一点与Internet地址系统比较相似)。当用户发送一个数据包时,这些数据包就会发送到LAN上所有可用的机器。3 图示:一个简单的局域网组成在一般情况下,网络上所有的机器都可以“听”到通过的流量,但对不属于自己的数据包则不予响应(换句话说,工作站A不会捕获只属于工作站B的数据,而是简单地忽略这些数据)。 嗅探器工作在网络的底层,在网络上监听数据包来获取敏感信息。从原理上来说,在一个实际的系统中,数据的收发是由网卡来完成的,网卡接收到传输来的数据,其内的单片程序接收数据帧的目的MAC地址,根据计算机上的网卡驱动程序设置的接收模式判断该不该接收,认为该接收就接收后产生中断信号通知CPU,认为不该接收就丢掉不管,所以不该接收的数据网卡就截断了,计算机根本就不知道。对于网卡来说一般有四种接收模式:a)广播方式:该模式下的网卡能够接收网络中的广播信息。b)组播方式:设置在该模式下的网卡能够接收组播数据。c)直接方式:在这种模式下,只有目的网卡才能接收该数据。d)混杂模式:在这种模式下的网卡能够接收一切通过它的数据,而不管该数据是否是传给它的。首先,在以太网中是基于广播方式传送数据的,也就是说,所有的物理信号都要经过我的机器。其次,如果某个工作站的网络接口处于混杂模式,那么它就可以捕获网络上所有的数据。嗅探程序是一种利用以太网的特性把网络适配卡(NIC,一般为以太网卡)置为混杂模式状态的工具,一旦网卡设置为这种模式,它就能接收传输在网络上的每一个信息包,而不管该数据是否传给它的。4 2.2.3 TCP/IP协议现今因特网上用到的主要协议有:用户数据报协议(UDP),次要文件传输协议(TFTP),网际协议(IP),因特网控制报文协议(ICMP),传输控制协议(TCP),地址转换协议(ARP),虚终端协议(Telnet),反向地址转换协议(RARP),外部网关协议(EGP)版本2,引导协议(BootP),路由信息协议(RIP),距离向量多播路由协议(DVMRP)。下面对其中的4个协议做一些简单的介绍: IP :网际协议IP是TCP/IP的心脏,也是网络层中最重要的协议。IP层接收由更低层(网络接口层,例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层-TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是按顺序发送的或者没有被破坏。IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。 高层的TCP和UDP服务在接收数据包时,通常假设包中的源地址是有效的。也可以这样说,IP地址形成了许多服务的认证基础,这些服务相信数据包是从一个有效的主机发送来的。IP确认包含一个选项,叫作IP Source Routing,可以用来指定一条源地址和目的地址之间的直接路径。对于一些TCP和UDP的服务来说,使用了该选项的IP包好象是从路径上的最后一个系统传递过来的,而不是来自于它的真实地点。这个选项是为了测试而存在的,说明了它可以被用来欺骗系统来进行平常是被禁止的连接。那么,许多依靠IP源地址做确认的服务将产生问题并且会被非法入侵。 TCP:如果IP数据包中有已经封好的TCP数据包,那么IP将把它们向上传送到TCP层。TCP将包排序并进行错误检查,同时实现虚电路间的连接。TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。 TCP将它的信息送到更高层的应用程序,例如Telnet的服务程序和客户程序。应用程序轮流将信息送回TCP层,TCP层便将它们向下传送到IP层,设备驱动程序和物理介质,最后到接收方。 面向连接的服务(例如Telnet、FTP、Rlogin、X Windows和SMTP)需要高度的可靠性,所以它们使用了TCP。DNS在某些情况下使用TCP(发送和接收域名数据库),但使用UDP传送有关单个主机的信息。 UDP:UDP与TCP位于同一层,但对于数据包的顺序错误或重发。因此,UDP不被应用于那些使用虚电路的面向连接的服务,UDP主要用于那些面向查询-应答的服务,例如NFS。相对于FTP或Telnet,这些服务需要交换的信息量较小。使用UDP的服务包括NTP(网落时间协议)和DNS(DNS也使用TCP)。 欺骗UDP包比欺骗TCP包更容易,因为UDP没有建立初始化连接(也可以称为握手)(因为在两个系统间没有虚电路),也就是说,与UDP相关的服务面临着更大的危险。 ICMP: ICMP与IP位于同一层,它被用来传送IP的的控制信息。它主要是用来提供有关通向目的地址的路径信息。ICMP的Redirect信息通知主机通向其他系统的更准确的路径,而Unreachable信息则指出路径有问题。另外,如果路径不可用了,ICMP可以使TCP连接体面地终止。PING是最常用的基于ICMP的服务。62.2.4 数据包简介 “包”(Packet)是通信传输中的数据单位,一般也称“数据包”。有人说,局域网中传输的不是“帧”(Frame)吗?没错,但是TCP/IP协议是工作在第三层()、第四层()上的,而帧是工作在第二层(数据链路层)。上一层的内容由下一层的内容来传输,所以在局域网中,“包”是包含在“帧”里的。OSI(Open System Interconnection,开放系统互联)模型是由国际标准化组织(ISO)定义的标准,它定义了一种分层体系结构,在其中的每一层定义了针对不同通信级别的协议。OSI模型有5层,1到5层分别是:物理层、数据链路层、网络层、传输层、应用层。OSI模型在逻辑上可分为两个部分:低层的1至3层关注的是原始数据的传输;高层的4至5层关注的是网络下的应用程序。 2.2.4 SharpPcap2.2.4.1 Sharpcap简介SharpPcap是Tamir Gal专门为.Net开发环境写的数据包捕获框架,它是Winpcap组件和Windows网络核心函数的完美结合。该程序集继承Winpcap又超越Winpcap,它采用了消息机制,将面向对象的优越性表现的淋漓尽致,同时还集成了部分网络API函数和读取注册表的API函数,。它封装了接口类、异常类、事件类、数据包类等32个类,适用于C#.Net、VB.Net。2.2.4.1 Sharpcap中主要类的功能(1)LivePcapDeviceList类获取计算机的网卡列表。该类有1个字段,2个属性,4个方法,主要是获取本机的网卡列表和刷新列表。(2)LivePcapDevice类封装了网卡所有的功能,如捕获、发送、过滤等。该类有2个阻塞设置字段,7个网卡信息属性,12个网卡操作方法,其中打开网卡方法2次重载,发送包方法3次重载,另外还有网卡流量统计信息方法、队列发送方法。由于它继承了PcapDevice类,因此还有网卡过滤设置方法,发送文件,关闭文件方法,缓冲区设置方法,捕捉方法,延时设置等多种方法。(3)DeviceMode类枚举类网卡工作模式。它指定网卡的工作模式是正常还是混杂。(4)PcapInterface类封装了本机适配器的所有信息。该类有7个属性用来描述适配器名称、标志,本机IP、MAC,网关地址等信息。(5)PcapStatistics、StatisticsModePacket类负责网络统计信息。PcapStatistics类用来统计适配器接收到的包,丢弃的包数目。(6)SendQueue类负责发送包队列处理。(7)Sockaddr、Sockaddr.Type类解决了地址簇的问题;PcapUnmanagedStructure类封装了Winpcap总用到的结构体和常量。(8)WinPcapRequiredException、PacketArrivalEventHandler、CaptureStoppedEventHandler类定义了Sharpcap中产生的所有的异常、消息。(9)ARP类封装了ARP协议的所有功能。它提供了2个重载构造函数,3个属性用来设置ARP协议的几个参数,一个方法获取目标主机的MAC地址。(10) MiscUtil.Conversion、MiscUtil.IO、PacketDotNet等接口类负责所有的接口定义。3.系统分析与设计3.1 需求分析(1) 能够监听所有数据包,以及监听指定IP地址的数据包;(2) 能够显示完整的IP数据包首部信息,例如:版本、首部长度、数据包长度、数据包类型(协议字段)、TTL、源IP地址、目的IP地址等;(3) 能够显示完整的TCP报文段信息,例如:源端口、目的端口、序号、确认号、数据部分等;(4) 能够自动提取FTP的用户名和密码;(5) 具有图形化操作界面。3.2系统体系结构ApplicationPacketDotNet.dllNPF Device Driver Kernel LeverUser LevelPacketsSharpPcap.dll3.3 设计方案4.系统实现4.1 功能实现4.1.1获得适配器列表LivePcapDeviceList devices = null;先声明LivePcapDeviceList类对象,一般该对象都会作为其他类的属性,因此可以先设置对象为空。然后在实现获取网卡列表的过程中添加下面这个句子:devices = LivePcapDeviceList.Instance;该句子执行了LivePcapDeviceList类中的构造函数,在构造函数中实现的功能类似于Winpcap中的pcap_findalldevs函数。与其不同的是该构造函数中还调用了.Net类库中的NetworkInterface类,能够检测当前在用的适配器并能返回网卡的MAC和网关地址。这是Winpcap没有做到的。4.1.2 打开适配器LivePcapDevice device =null;同上,先声明类对象。device = devicesselect;然后,将获得的网卡列表中某一项传递给该对象。其中select指明该项在列表中的位置。device. Open(DeviceMode mode);device.Open(DeviceMode mode, int read_timeout);或者device.DumpOpen(string filename);接着是打开适配器了,LivePcapDevice类重载了打开适配器的方法,mode参数指明了打开适配器的模式,如正常模式、混杂模式,read_timeout参数为超时时间设置。最后一个函数是打开一个网络包文件,由于不经常用,不作过多解释。4.1.3 设置适配器过滤准则device.Filter=filterExpression;filterExpression参数是一个字符串,它指定适配器的过滤规则,如”ip and tcp”、”ip and icmp”。4.1.4 进行数据包捕获在完成以上工作后,我们可以开始捕获包了。device.StartCapture();该语句将开启一个新的线程,专门负责监听适配器是否有数据包到来。这个线程的意义就是同主窗体这个线程分开,避免了当数据包到来时主线程阻塞,造成程序“死掉”。4.1.5 数据包的接收数据包捕获过程中最重要的环节就是数据包的接收,接收的设计影响这个捕获的效率、准确度,甚至决定了捕获数据包的成败。因此,也到了.Net再次发挥性能优势的地方了。在数据包接收之前,必须要建立数据包接收函数的消息映射,该消息映射可以解决类与类之间的安全通信,还大大增强了程序的实时性,同时减缓了CPU的资源开销。device.OnPacketArrival += new PacketArrivalEventHandler(device_OnPacketArrival);void device_OnPacketArrival(object sender, CaptureEventArgs e).第一个语句是将数据包到来的事件通过消息映射到自定义函数device_OnPacketArrival上,这里一定要注意device_OnPacketArrival的声明格式,也就是函数中的参数。Sender是消息的发送方,e参数是发送方传递过来的消息,该消息类型已在Sharpcap中定义。此时此刻一定要理解e也是一个类对象,其中它的属性中还有一个类对象Packet,Packet其中一个属性Data就是适配器捕捉到的一个数据包,Data是一个字节流。因此,不难理解被捕获到的包是怎样在类间传递的了。在device_OnPacketArrival可以添加自己的处理过程了,所有的检测工具都是在这个过程中大展笔墨的。4.1.6 数据处理结果的显示当完成数据处理过程后,是不是将自己的结果直接显示到主窗体上?答案是否定的。要知道数据包捕获后处理过程是属于一个线程的,而窗体是另一个线程。这里涉及到线程之间的安全通信问题。假设如果以上所有的过程都没有在主窗体这个类下,那么还涉及到类与类之间的安全通信,并且大多数开发人员为了增强程序的效率和稳定性,通常不会把以上完成的步骤直接放在主窗体类下。但由于方才讲述了如何实现类与类之间通信,此处只讲述线程与线程之间的安全通信手段。.Net在解决这个问题时提供了一个解决方案:委托。public delegate void LVDelegateHandler(ListViewItem li);先声明一个委托,也就是托管代码。建立委托的详细过程参见参考文献8。public void UpdateLV(ListViewItem li) .Net平台下的大多数控件都有一个方法:Invoke,该方法将控件显示与某个实现过程通过委托联系起来,形成一一映射。不得不提醒一下:建立的委托参数格式必须与自定义的实现过程一致。说明:listBox1是一个显示控件,showlist是自定义的普通函数,在该函数中添加显示处理程序。4.1.7 关闭适配器在退出数据包捕获程序之前,不要忘记了关闭适配器。device.StopCapture();device.Close();第一个语句是停止适配器监听,该语句背后执行将适配器监听线程合并到主线程中然后退出。这里采用了常用的关闭线程的方法,而非使线程强制退出,从而是程序性能更加稳定。第二个句子就是关掉适配器了。4.1.8 动态显示数据包分析结果 这里采用Treeview控件来显示协议分析结果,处理函数如下:private void listView1_SelectedIndexChanged(object sender, EventArgs e)5.测试与评价5.1 测试方法以自己设计抓包软件抓取的包同WireShark网络抓包软件抓取的数据包对比来测试自己设计的抓包软件是否正常。5.2 测试结果1.抓取结果如下:2.对抓取到的同一个FTP数据包进行分析比对经过比对,抓包的信息完全一致,基本可以判定,自己设计的嗅探器在抓包与数据分析上没有问题,而且软件设计的要求基本实现。5.3系统实现情况分析实现功能情况如下:1. 抓包功能2. 数据内容分析功能3. 协议分析功能4. 包过滤设置5. 嗅探器操作6. 个性化设置换皮肤换皮肤后:7. 关于本软件信息5.4对未来的展望由于基于.Net的sharpPcap无论从界面还是抓取实现上都比较容易,而且比较RawSocket效率更高,更快,所以,基于SharpPcap的抓包分析软件在未来我觉得还是很不错。再就是本系统在设计和实现上由于时间等的原因,未能完整分析各种包,所以,希望在后面的空闲时间内可以完善该系统。专心-专注-专业
展开阅读全文