基于winpcap的网络嗅探器设计与实现

Ridiculous

发布日期: 2019-02-08 10:27:38 浏览量: 1435
评分:
star star star star star star star star star star
*转载请注明来自write-bug.com

第一章 摘要

随着网络的普及和网络技术的发展,网络已经成为了人们日常生活和工作中不可获缺的一部分,越来越多的信息和资源放到了互联网上,网络的安全性和可靠性变得越来越重要,因此,对于能够分析、诊断网络,测试网络性能与安全性的工具软件的需求也越来越迫切。网络嗅探器作为一个使用WinPcap开发包,嗅探流过网卡的数据并智能分析过滤,快速找到所需要的网络信息的工具,成为了人们获取、分析数据包的主要工具,网络嗅探器具有两面性,攻击者可以用它来监听网络中数据,达到非法获得信息的目的,网络管理者可以通过使用嗅探器捕获网络中传输的数据包并对其进行分析,分析结果可供网络安全分析之用。

本设计的基本任务是设计一个嗅探软件,实现对常用网络数据包抓取、分析。

软件所要完成对本机在网络中的通信数据,比如协议类型,源、目的地址和端口、数据包的大小等加以分析的功能。

本设计用到的开发工具为Microsoft Visual Studio 2010 开发环境为Windows 7/Windows XP。

关键字:网络嗅探器,数据报文,数据包,捕捉,分析

第二章 开发背景

2.1 网络安全现状

随着各种新的网络技术的不断出现、应用和发展,计算机网络的应用越来越广泛,其作用也越来越重要。但是由于计算机系统中软硬件的脆弱性和计算机网络的脆弱性以及地理分布的位置、自然环境、自然破坏以及人为因素的影响,不仅增加了信息存储、处理的风险,也给信息传送带来了新的问题。计算机网络安全问题越来越严重,网络破坏所造成的损失越来越大。Internet 的安全已经成为亟待解决的问题。多数黑客入侵成功并植入后门后的第一件事就是选择一个合适当前网络的嗅探器,以获得更多的受侵者的信息。嗅探器是一种常用的收集有用数据的方法,可以作为分析网络数据包的设备。网络嗅探器就是利用计算机的网络接口截获其他计算机的数据报文的一种工具,而且它与一般的键盘捕获程序不同。键盘捕获程序捕获在终端上输入的键值,而嗅探器捕获的则是真实的网络报文.如果把网络嗅探器放置于网络节点处,对网络中的数据帧进行捕获的一种被动监听手段,是一种常用的收集有用数据的方法,可以分析各种信息包并描述出网络的结构和使用的机器,由于它接收任何一个在同一网段上传输的数据包,所以也就存在着捕获密码、各种信息、秘密文档等一些没有加密的信息的可能性。这成为黑客们常用的扩大战果的方法,用来夺取其他主机的控制权。当然嗅探器的正当用处主要是网络管理人员分析网络的流量,以便找出所关心的网络中潜在的问题。

2.2 开发意义

本次设计只是对抓取到的本机在网络中的通信数据,比如说协议类型,源、目的地址和端口、数据包的大小等加以分析,而无法做到像Sniffer 或者影音神探那种成熟的嗅探器所拥有的强大功能。作为从事网络技术方面的人员来说,要想有效地利用它、防范它,就得深入地学习、分析网络嗅探技术。最为重要的是,对于网络嗅探器的设计与实现,使我对网络通信,数据传输和网络信息安全等有了切身的体会与融入,同时也是对网络安全技术这门课的学以致用,不断提高自我的一种有效途径。

第三章 设计分析

3.1 实现目标

  • 实现网络嗅探器的界面。

  • 实现抓取数据包的功能。

  • 实现暂停抓取数据包功能。

  • 实现清空列表功能。

3.2 开发技术简介

3.2.1 TCP/IP协议分析

TCP/IP 是供已连接因特网的计算机进行通信的通信协议。

TCP/IP 定义了电子设备(比如计算机)如何连入因特网,以及数据如何在它们之间传输的标准。

TCP/IP是一个四层的分层体系结构。高层为传输控制协议,它负责聚集信息或把文件拆分成更小的包。这些包通过网络传送到接收端的TCP层,接收端的TCP层把包还原为原始文件。低层是网际协议,它处理每个包的地址部分,使这些包正确的到达目的地。网络上的网关计算机根据信息的地址来进行路由选择。即使来自同一文件的分包路由也有可能不同,但最后会在目的地汇合。 TCP/IP使用客户端/服务器模式进行通信。TCP/IP通信是点对点的,意思是通信是网络中的一台主机与另一台主机之间的。TCP/IP与上层应用程序之间可以说是“没有国籍的”,因为每个客户请求都被看做是与上一个请求无关的。正是它们之间的“无国籍的”释放了网络路径,才是每个人都可以连续不断的使用网络。 许多用户熟悉使用TCP/IP协议的高层应用协议。

众所周知,如今电脑上因特网都要作TCP/IP协议设置,显然该协议成了当今地球村“人与人”之间的“牵手协议”。 通俗而言:TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台电脑规定一个地址。1974年12月,卡恩、瑟夫的第一份TCP协议详细说明正式发表。当时美国国防部与三个科学家小组签定了完成TCP/IP的协议,结果由瑟夫领衔的小组捷足先登,首先制定出了通过详细定义的TCP/IP协议标准。当时作了一个试验,将信息包通过点对点的卫星网络,再通过陆地电缆,再通过卫星网络,再由地面传输,贯串欧洲和美国,经过各种电脑系统,全程9.4万公里竟然没有丢失一个数据位,远距离的可靠数据传输证明了TCP/IP协议的成功。

1983年1月1日,运行较长时期曾被人们习惯了的NCP被停止使用,TCP/IP协议作为因特网上所有主机间的共同协议,从此以后被作为一种必须遵守的规则被肯定和应用。正是由于TCP/IP协议,才有今天“地球村”因特网的巨大发展。

以下简单介绍TCP/IP中的协议都具备什么样的功能,都是如何工作的:

3.2.1.1 IP

IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层—-TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是按顺序发送的或者没有被破坏。IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。高层的TCP和UDP服务在接收数据包时,通常假设包中的源地址是有效的。也可以这样说,IP地址形成了许多服务的认证基础,这些服务相信数据包是从一个有效的主机发送来的。IP确认包含一个选项,叫做IP source routing,可以用来指定一条源地址和目的地址之间的直接路径。对于一些TCP和UDP的服务来说,使用了该选项的IP包好像是从路径上的最后一个系统传递过来的,而不是来自于它的真实地点。这个选项是为了测试而存在的,说明了它可以被用来欺骗系统来进行平常是被禁止的连接。那么,许多依靠IP源地址做确认的服务将产生问题并且会被非法入侵。

3.2.1.2 TCP

如果IP数据包中有已经封好的TCP数据包,那么IP将把它们向‘上’传送到TCP层。TCP将包排序并进行错误检查,同时实现虚电路间的连接。TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。

TCP将它的信息送到更高层的应用程序,例如Telnet的服务程序和客户程序。应用程序轮流将信息送回TCP层,TCP层便将它们向下传送到IP层,设备驱动程序和物理介质,最后到接收方。

3.2.1.3 UDP

UDP与TCP位于同一层,但它不管数据包的顺序、错误或重发。因此,UDP不被应用于那些使用虚电路的面向连接的服务,UDP主要用于那些面向查询—-应答的服务,例如NFS。相对于FTP或Telnet,这些服务需要交换的信息量较小。使用UDP的服务包括NTP(网络时间协议)和DNS(DNS也使用TCP)。

3.2.1.4 ICMP

ICMP与IP位于同一层,它被用来传送IP的控制信息。它主要是用来提供有关通向目的地址的路径信息。ICMP的‘Redirect’信息通知主机通向其他系统的更准确的路径,而‘Unreachable’信息则指出路径有问题。另外,如果路径不可用,ICMP可以使TCP连接‘体面地’终止。PING是最常用的基于ICMP的服务。

3.2.2 数据包简介

包是TCP/IP协议通信中的基本的数据单位之一,一般也叫数据包。

必须把内装产品的包装盒放到一个邮局指定的专用纸箱里,这样才能够邮寄。这里,产品包装盒相当于数据包,里面放着的产品相当于可用的数据,而专用纸箱就相当于帧,且一个帧中只有一个数据包。 “包”听起来非常抽象,那么是不是不可见的呢?通过一定技术手段,是可以感知到数据包的存在的。

通过数据包捕获软件,也可以将数据包捕获并加以分析。就是用网络嗅探器捕获数据包,可以查看捕获到的数据包的 MAC 地址、IP 地址、协议类型端口号等细节。通过分析这些数据,网管员就可以知道网络中到底有什么样的数据包在活动了。数据包的结构非常复杂,不是三言两语能够说清的,在这里主要了解一下它的关键构成就可以了,这对于理解TCP/IP 协议的通信原理是非常重要的。数据包主要由“目的IP 地址”、“源IP 地址”、“净载数据” 等部分构成。 数据包的结构与我们平常写信非常类似,目的IP 地址是说明这个数据包是要发给谁的,相当于收信人地址;源IP 地址是说明这个数据包是发自哪里的,相当于发信人地址;而净载数据相当于信件的内容。 正是因为数据包具有这样的结构,安装了 TCP/IP 协议的计算机之间才能相互通信。我们在使用基于TCP/IP 协议的网络时,网络中其实传递的就是数据包。比如说当你上网打开网页,这个简单的动作,就是你先发送数据包给网站,它接收到了之后,根据你发送的数据包的 IP 地址,返回给你网页的数据包,也就是说,网页的浏览,实际上就是数据包的交换。理解数据包,对于网络管理的网络安全具有至关重要的意义。

3.2.3 C++语言简介

C++程序设计语言是由来自AT&T Bell Laboratories的Bjarne Stroustrup(即本文作者)设计和实现的,它兼具Simula语言在组织与设计方面的特性以及适用于系统程序设计的C语言设施。C++最初的版本被称作“带类的C(C with classes)” [Stroustrup,1980],在1980年被第一次投入使用;当时它只支持系统程序设计(§3)和数据抽象技术(§4.1)。支持面向对象程序设计的语言设施在1983年被加入C++;之后,面向对象设计方法和面向对象程序设计技术就逐渐进入了C++领域。在1985年,C++第一次投入商业市场[Stroustrup,1986][Stroustrup,1986b]。在1987至1989年间,支持范型程序设计的语言设施也被加进了C++[Ellis,1990][Stroustrup,1991]。

C++的一个目标就是提供更易用并具有一定承受能力的设计思想和程序设计技术,进一步提高程序的质量。这些技术中的绝大部分都源自Simula [Dahl,1970][Dahl,1972][Birtwistle,1979],并通常被作为面向对象程序设计和面向对象设计思想来讨论。然而,C++的设计目标总还是在于要支持一定范围内的各种程序设计风格和设计思想。这与一般在语言设计方面的观点形成一定对比。一般在语言设计上总是试图将所有系统内建于单独一个被重点支持的、带有强制性的程序设计风格之中(或称典范paradigm)。

3.2.4 嗅探技术简介

数据在网络上是以很小的称为帧(Frame)的单位传输的,帧由几部分组成,不同的部分执行不同的功能。帧通过特定的称为网络驱动程序的软件进行成型,然后通过网卡发送到网线上,通过网线到达它们的目的机器,在目的机器的一端执行相反的过程。接收端机器的以太网卡捕获到这些帧,并告诉操作系统帧已到达,然后对其进行存储。就是在这个传输和接收的过程中,存在安全方面的问题。

每一个在局域网(LAN)上的工作站都有其硬件地址,这些地址惟一地表示了网络上的机器(这一点与Internet 地址系统比较相似)。当用户发送一个数据包时,这些数据包就会发送到LAN 上所有可用的机器。

在一般情况下,网络上所有的机器都可以“听”到通过的流量,但对不属于自己的数据包则不予响应(换句话说,工作站A 不会捕获属于工作站B 的数据,而是简单地忽略这些数据)。

嗅探器工作在网络的底层,在网络上监听数据包来获取敏感信息。从原理上来说,在一个实际的系统中,数据的收发是由网卡来完成的,网卡接收到传输来的数据,网卡内的单片程序接收数据帧的目的MAC 地址,根据计算机上的网卡驱动程序设置的接收模式判断该不该接收,认为该接收就接收后产生中断信号通知CPU,认为不该接收就丢掉不管,所以不该接收的数据网卡就截断了,计算机根本就不知道。对于网卡来说一般有四种接收模式:

  • 广播方式:该模式下的网卡能够接收网络中的广播信息。

  • 组播方式:设置在该模式下的网卡能够接收组播数据。

  • 直接方式:在这种模式下,只有目的网卡才能接收该数据。

  • 混杂模式:在这种模式下的网卡能够接收一切通过它的数据,而不管该数据是否是传给它的。

首先,在以太网中是基于广播方式传送数据的,也就是说,所有的物理信号都要经过我的机器。其次,如果某个工作站的网络接口处于混杂模式,那么它就可以捕获网络上所有的数据包和帧。

Sniffer 程序是一种利用以太网的特性把网络适配卡(NIC,一般为以太网卡)置为混杂模式状态的工具,一旦网卡设置为这种模式,它就能接收传输在网络上的每一个信息包, 而不管该数据是否传给它的。

第四章 嗅探器

4.1 嗅探器设计原理

嗅探器作为一种网络通讯程序,也是通过对网卡的编程来实现网络通讯的,对网卡的编程也是使用通常的套接字(socket)方式来进行。但是,通常的套接字程序只能响应与自己硬件地址相匹配的或是以广播形式发出的数据帧,对于其他形式的数据帧比如已到达网络接口但却不是发给此地址的数据帧,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取到达的数据包。而网络嗅探器的目的恰恰在于从网卡接收所有经过它的数据包,这些数据包即可以是发给它的也可以是发往别处的。显然,要达到此目的就不能再让网卡按通常的正常模式工作,而必须将其设置为混杂模式。

嗅探器最初由 Network General 推出,由 Network Associates 所有。最近,Network Associates 决定另开辟一个嗅探器产品单元,该单元组成一家私有企业并重新命名为 Network General,如今嗅探器已成为 Network General 公司的一种特征产品商标

4.2 网络技术与设备简介

数据在网络上是以很小的称为帧(Frame)的单位传输的,帧由几部分组成,不同的部分执行不同的功能。帧通过特定的称为网络驱动程序的软件进行成型,然后通过网卡发送到网线上,通过网线到达它们的目的机器,在目的机器的一端执行相反的过程。接收端机器的以太网卡捕获到这些帧,并告诉操作系统帧已到达,然后对其进行存储。就是在这个传输和接收的过程中,存在安全方面的问题。

每一个在局域网(LAN)上的工作站都有其硬件地址,这些地址惟一地表示了网络上的机器。当用户发送一个数据包时,这些数据包就会发送到LAN上所有可用的机器。

在一般情况下,网络上所有的机器都可以“听”到通过的流量,但对不属于自己的数据包则不予响应(换句话说,工作站A不会捕获属于工作站B的数据,而是简单地忽略这些数据)。如果某个工作站的网络接口处于混杂模式,那么它就可以捕获网络上所有的数据包和帧。

网络监听原理

Sniffor程序是一种利用以太网的特性把网络适配卡(NIC,一般为以太网卡)置为杂乱(promiscuous)模式状态的工具,一旦网卡设置为这种模式,它就能接收传输在网络上的每一个信息包。 普通的情况下,网卡只接收和自己的地址有关的信息包,即传输到本地主机的信息包。要使Sniffer能接收并处理这种方式的信息,系统需要支持 BPF,Linux下需要支持SOCKET-PACKET。但一般情况下,网络硬件和TCP/IP堆栈不支持接收或者发送与本地计算机无关的数据包,所以,为了绕过标准的TCP/IP堆栈,网卡就必须设置为混杂模式。一般情况下,要激活这种方式,内核必须支持这种伪设备BPFilter,而且需要root权限来运行这种程序,所以Sniffer需要root身份安装,如果只是以本地用户的身份进入了系统,那么不可能嗅探到root的密码,因为不能运行Sniffer。

基于Sniffer这样的模式,可以分析各种信息包并描述出网络的结构和使用的机器,由于它接收任何一个在同一网段上传输的数据包,所以也就存在着捕获密码、各种信息、秘密文档等一些没有加密的信息的可能性。这成为黑客们常用的扩大战果的方法,用来夺取其他主机的控制权。

4.3 网络监听的目的

当一个黑客成功地攻陷了一台主机,并拿到了root权限,而且还想利用这台主机去攻击同一网段上的其他主机时,他就会在这台主机上安装Sniffer软件,对以太网设备上传送的数据包进行侦听,从而发现感兴趣的包。如果发现符合条件的包,就把它存到一个LOG文件中去。通常设置的这些条件是包含字“username”或“password”的包,这样的包里面通常有黑客感兴趣的密码之类的东西。一旦黑客截获得了某台主机的密码,他就会立刻进入这台主机。

Sniffer除了能得到口令或用户名外,还能得到更多的其他信息,比如一个重要的信息、在网上传送的金融信息等等。Sniffer几乎能得到任何在以太网上传送的数据包。

Sniffer是一种比较复杂的攻击手段,一般只有黑客老手才有能力使用它,而对于一个网络新手来说,即使在一台主机上成功地编译并运行了 Sniffer,一般也不会得到什么有用的信息,因为通常网络上的信息流量是相当大的,如果不加选择地接收所有的包,然后从中找到所需要的信息非常困难;而且,如果长时间进行监听,还有可能把放置Sniffer的机器的硬盘撑爆。

这种对网卡混杂模式的设置是通过原始套接字(raw socket)来实现的,这也有别于通常经常使用的数据流套接字和数据报套接字。在创建了原始套接字后,需要通过setsockopt()函数来设置IP头操作选项,然后再通过bind()函数将原始套接字绑定到本地网卡。为了让原始套接字能接受所有的数据,还需要通过ioctlsocket()来进行设置,而且还可以指定是否亲自处理IP头。至此,实际就可以开始对网络数据包进行嗅探了,对数据包的获取仍象流式套接字或数据报套接字那样通过recv()函数来完成。但是与其他两种套接字不同的是,原始套接字此时捕获到的数据包并不仅仅是单纯的数据信息,而是包含有 IP头、 TCP头等信息头的最原始的数据信息,这些信息保留了它在网络传输时的原貌。通过对这些在低层传输的原始信息的分析可以得到有关网络的一些信息。由于这些数据经过了网络层和传输层的打包,因此需要根据其附加的帧头对数据包进行分析。

4.4 数据包、TCP、IP的结构

数据包的总体结构:

数据在从应用层到达传输层时,将添加TCP数据段头,或是UDP数据段头。其中UDP数据段头比较简单,由一个8字节的头和数据部分组成,具体格式如下:

而TCP以20个固定字节开始,在固定头后面还可以有一些长度不固定的可选项,下面给出TCP数据段头的格式组成:

对于此TCP数据段头的分析在编程实现中可通过TCPPacket来定义:

  1. #if !defined
  2. (AFX_TCPPACKET_H__8EC6C630_C16F_446F_9A03_E86E99A89BE4__INCLUDED_)
  3. #defineAFX_TCPPACKET_H__8EC6C630_C16F_446F_9A03_E86E99A89BE4__INCLUDED_
  4. #if _MSC_VER > 1000
  5. #pragma once
  6. #endif // _MSC_VER > 1000
  7. class CTCPPacket
  8. {
  9. public:
  10. CTCPPacket();
  11. virtual ~CTCPPacket();
  12. CTCPPacket(unsigned char *buf,int buflen);
  13. private:
  14. int m_nSrcPort;//源端口
  15. int m_nDestPort;//目的端口
  16. unsigned int m_uSeqNum;//顺序号
  17. unsigned int m_uAckNum;//确认号
  18. int m_nHeadLen;//头部长
  19. bool m_bURG;//为1表示使用紧急指针
  20. bool m_bACK;//为1表示确认号合法
  21. bool m_bPSH;//表示带有PUSH标志的数据
  22. bool m_bRST;//用于主机崩溃或其他原因后的复位
  23. bool m_bSYN;//用于建立连接
  24. bool m_bFIN;//用于释放连接
  25. int m_nWindowSize;//窗口大小
  26. int m_nCheckSum;//校验和
  27. int m_nUrgPos;//紧急指针,从当前顺序号到紧急数据位置偏移量
  28. int m_nOptLen;//选项长度
  29. unsigned char *m_pOptions;
  30. int m_nDataLen;
  31. unsigned char *m_pData;
  32. public:
  33. CString GetSrcPort();
  34. CString GetDestPort();
  35. CString GetSeqNum();//顺序号
  36. CString GetAckNum();//确认号
  37. CString GetHeadLen();//头部长
  38. CString GetURG();//为1表示使用紧急指针
  39. CString GetACK();//为1表示确认号合法
  40. CString GetPSH();//表示带有PUSH标志的数据
  41. CString GetRST();//用于主机崩溃或其他原因后的复位
  42. CString GetSYN();//用于建立连接
  43. CString GetFIN();//用于释放连接
  44. CString GetWindowSize();//窗口大小
  45. CString GetCheckSum();//校验和
  46. CString GetUrgPos();//紧急指针,从当前顺序号到紧急数据位置偏移量
  47. CString GetOptLen();//选项长度
  48. CString GetOptions();//选项值
  49. CString GetDataLen();//数据长度
  50. CString GetData();//数据值
  51. private:
  52. CString GetStr(unsigned int nNum,unsigned char * pData = NULL,bool nFlag = true);
  53. CString GetBool(bool nFlag);
  54. };
  55. #endif // !defined(AFX_TCPPACKET_H__8EC6C630_C16F_446F_9A03_E86E99A89BE4__INCLUDED_)

在网络层,还要给TCP数据包添加一个IP数据段头以组成IP数据报。IP数据头以大端点机次序传送,从左到右,版本字段的高位字节先传输。

IP数据段头格式如下:

同样,在实际编程中也要用一个IPPacket来表示此IP数据段头,下面给出此数据结构的定义:

  1. #if !defined(AFX_IPPACKET_H__E7869A50_D11B_487D_807D_657E4C3D2A97__INCLUDED_)
  2. #define AFX_IPPACKET_H__E7869A50_D11B_487D_807D_657E4C3D2A97__INCLUDED_
  3. #if _MSC_VER > 1000
  4. #pragma once
  5. #endif // _MSC_VER > 1000
  6. class CIPPacket
  7. {
  8. public:
  9. CIPPacket();
  10. CIPPacket(const unsigned char* buf,int buflen);
  11. virtual ~CIPPacket();
  12. private:
  13. int m_nVersion; //版本
  14. int m_nHeaderLength; //头部长度
  15. int m_nServiceType; //服务类型 type of service
  16. int m_nPrecedence; //优先级
  17. bool m_bDelay; //延迟
  18. bool m_bThroughtPut; //吞吐量
  19. bool m_bReliability; //可靠性
  20. unsigned int m_uTotalLength; //总长total length
  21. int m_nIdentification; //标识
  22. bool m_bDF; //不要分段
  23. bool m_bMF; //还有进一步的分段
  24. int m_nFragOffSet; //分段偏移fragment offset
  25. int m_nTTL; //生命期time to live
  26. int m_nProtocol; //协议,如TCP,UDP
  27. unsigned int m_nCheckSum; //头部校验和
  28. long m_lSrcIP; //源IP地址
  29. long m_lDestIP; //目的IP地址
  30. int m_nOptLength; //选项长度
  31. unsigned char *m_pOptions; //选项内容
  32. int m_nDataLength; //数据长度
  33. unsigned char *m_pData; //数据内容
  34. public:
  35. CString GetProtocol();
  36. CString GetDestIP();
  37. CString GetSrcIP();
  38. unsigned char* GetTData();
  39. int GetDataLength();
  40. CString GetVersion(); //版本
  41. CString GetHeaderLength(); //头部长度
  42. CString GetServiceType(); //服务类型 type of service
  43. CString GetPrecedence(); //优先级
  44. CString GetDelay(); //延迟
  45. CString GetThroughtPut(); //吞吐量
  46. CString GetReliability(); //可靠性
  47. CString GetTotalLength(); //总长total length
  48. CString GetIdentification(); //标识
  49. CString GetDF(); //不要分段
  50. CString GetMF(); //还有进一步的分段
  51. CString GetFragOffSet(); //分段偏移fragment offset
  52. CString GetTTL(); //生命期time to live
  53. CString GetCheckSum(); //头部校验和
  54. CString GetOptLength(); //选项长度
  55. CString GetOptions(); //选项内容
  56. CString GetDLength(); //数据长度
  57. private:
  58. CString GetInt(int nNum);
  59. CString GetBool(bool nBool);
  60. };
  61. #endif // !defined(AFX_IPPACKET_H__E7869A50_D11B_487D_807D_657E4C3D2A97__INCLUDED_)

第五章 实验过程截图

嗅探器在嗅探之前

网卡配置

嗅探以后

文件导出

第六章 结束语

通过两周的奋斗,终于将我的课程设计终于完成了,我觉得这使得自己的独立应用能力得到了明显的提高。在没有做课程设计以前觉得课程设计只是对这几年来所学知识的单纯总结,但是通过这次做课程设计发现自己的看法有点太片面。课程设计不仅是对前面所学知识的一种检验,而且也是对自己能力的一种提高。通过这次课程设计使我明白了自己原来知识还比较欠缺。自己要学习的东西还太多,以前老是觉得自己什么东西都会,什么东西都懂,有点眼高手低。通过这次课程设计,我才明白学习是一个长期积累的过程,在以后的工作、生活中都应该不断的学习,努力提高自己知识和综合素质。

课程设计结束后,我发现理论和实践之间还是存在一定的差距,要把理论知识灵活运用于实践才是最好的,因此我也希望学校能多给我们提供一些实践的机会在设计的过程中遇到的问题,可以说得是困难重重,由于自己的实践机会稀少,因此这次在设计的过程中,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固等等。经过这次的课程设计我会在以后的时间里努力的学习一些课外的知识不能仅仅局限在课堂上。通过这次设计我在学会独立思考的同时,更懂得了要虚心向同学请教,这样可以达到事半功倍的效果。在具体编程实现系统功能的过程中,我遇到了不少的问题,我曾通过不同渠道向老师、同学、上相关网站、到bbs论坛寻求答案,收到了很好的效果,再者,我希望通过这次的课程设计,能够对我以后的理论联系实际等方面起到积极的促进作用,让我以后拒绝眼高手低的坏毛病,让自己学习的理论应用到实际生活中去,以便能够为社会做出自己应有的贡献。

在此要感谢我们的指导老师对我悉心的指导,感谢老师给我们的帮助和鼓励,正是有了您的帮助,才使得我少走了许多弯路;由于自己在设计的过程中在知识、经验方面都存在着不足,另外,由于学校元旦放假的原因,自己不得不修改了原来的计划,使得时间安排的不是非常合理,致使该课程设计必然会存在一些缺陷和不足。希望可以得到老师和同学们宝贵的建议。

第七章 参考文献

  • 《C/C++程序设计学习辅导》中国水利水电出版社 李婷, 李云峰编著

  • 《C++面向对象程序设计》清华大学出版社 (美) 萨维奇 (Walter Savitch)著

  • 《TCP/IP协议分析与应用》机械工业出版社 杨延双, 张建标, 王全民编著 百度百科:TCP/IP 协议分析、嗅探技术、数据包、C++

  • 《网络信息安全》清华大学出版社 安葳鹏, 刘沛骞主编

  • 《计算机网络安全技术》王群 编著

上传的附件 cloud_download 基于winpcap的网络嗅探器设计与实现.7z ( 1.35mb, 44次下载 )
error_outline 下载需要11点积分

发送私信

难过时,吃一粒糖,告诉自己生活是甜的

10
文章数
13
评论数
最近文章
eject