基于WinPcap的包截获和分析系统

estrangement

发布日期: 2019-04-26 19:58:32 浏览量: 1961
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

第1章 介绍

1.1 背景

随着计算机网络技术的飞速发展,网络为社会经济做出越来越多的贡献,可以说计算机网络的发展已经成为现代社会进步的一个重要标志。但同时,计算机犯罪、黑客攻击、病毒入侵等恶性事件也频频发生。网络数据包捕获、监听与分析技术是网络安全维护的一个基本技术同时也是网络入侵的核心手段。通过基于网络数据包的截获和协议分析,对网络上传输的数据包进行捕获,可以获取网络上传输的非法信息,对维护网络安全起到重大作用。

本论文依次介绍了网络包截获和分析的研究背景和意义、WinPcap技术介绍及系统开发坏境搭建、系统开发的理论基础、系统的分析与设计、系统的实现方法、系统的测试等。

系统提供了网络数据包的捕获、网络协议分析、包捕获过滤设置等功能模块。最终利用VC++实现了基于WinPcap的包截获和分析系统,该系统可以捕获链路层的数据包如Ethernet II,网络层的数据包如IP、ARP / RARP、ICMP,传输层的数据包如TCP、UDP,应用层的数据包如HTTP、DNS。此外系统可以对网络数据包进行细粒度的分析和原始数据包的再现。

1.2 系统开发的理论依据

由于TCP/IP协议采用分层的结构,这样在传输数据时,在网络数据的发送端是一个封装的过程,而在数据接收端则是分解的过程。

数据封装过程如图 1-1所示。

要发送一个数据包负载给对方,必须使用应用层协议进行封装,例如HTTP协议。它封装了网页内容,此网页的内容就是一个数据负载,加上HTTP首部形成一个HTTP应用层数据部分。然后此HTTP数据部分加上TCP首部封装成TCP传输层部分。同样在网络层,对此TCP数据用IP首部进行封装,形成IP数据部分。最后在链路层。用以太网首部对此IP数据进行封装,形成以太网数据部分。此以太网数据最终发送到网络物理介质进行传送。

当接受数据包的时候,就是一个分解的过程,因为主机接收的是一个原始的链路层数据包,例如以太网帧。根据以太网帧的分解,然后对每层协议进行解析,最后读取所传送的数据内容。此过程恰好和封装过程相反。 如图1-2所示。

接收端接收的数据包是链路层的数据包,如以太帧。此时对以太帧进行解析,判断其数据负载中的协议是什么协议,即网络层协议类型。例如网络层协议是IP,然后根据IP协议的格式进行解析,读取其信息,例如IP源、目的地址,以及IP数据负载内容的协议的类型等。例如通过分析判断上层协议是UDP协议,再根据UDP协议格式读取其首部内容,然后再判断出UDP 的源、目的端口号,再根据端口号或者具体的应用层数据格式判断是什么应用层协议的数据。例如端口号为53则肯定表示是DNS协议类型,然后根据应用层协议格式读取应用层数据负载,而这个内容才是真正的所要获得的有用信息。

1.2.1 Ethernet

在以太网的发展过程中,有很多种帧格式,其中以太网Ⅱ格式应用最为广泛,现在几乎是以太网的标准,它是由RFC894所定义。其帧格式如图1-3所示。

MAC地址(Media Access Control)也称物理地址,它是网卡本身自带的。其中目的MAC地址决定了以太帧的去向,源MAC,它是以太帧的来源。后面两个字节比较重要,它表示以太帧数据的协议类型,如果是0x0800则表示为IPV4协议数据包,0x0806则表示为ARP协议数据包,0x8035则表示RARP数据包,0x8863,0x8864表示PPOE数据包,0x86dd则表示IPV6数据包,我们通过此字段来判断所负载的数据协议类型并交由相应的模块来处理相应的协议数据。

1.2.2 ARP/RARP

ARP/RARP协议是进行IP地址和MAC地址相互转换的协议,网络通信中,链路层使用MAC地址进行实际的数据通信,而在网络层使用IP地址进行机器定位寻址。APR协议把IP地址映射为MAC地址,RARP相反。格式如图1-4所示。

通常情况,一个主机发送数据包时,如果目标主机在同一个网络,则需使用ARP进行查询获得其MAC地址,然后才能把数据包发送到目标主机。如果目标主机不在同一个网络中,那么就需要路由,把他转发出去,把数据包直接发给路由器,其目的MAC即为路由器MAC地址。

1.2.3 IP

IP协议是Internet的核心协议,它工作在网络层,提供了不可靠无连接的数据传送服务。协议格式如图1-5所示。

IP协议使用的数据报传送模式是一种简洁而有效的分组交换方式,为了达到最高的传输效率,它放弃了可靠性保证,而这些可靠性保证需要上层协议(如TCP)的服务。而在IP协议数据报传输服务中,一个比较重要的问题是分片和重组。IP分片是为了适应物理网的最大传输单元MTU而提出的,而IP重组则是为了将已分片的IP数据包根据分片规则重新组合起来。数据报传输的一大特点是随机路由,IP采用TTL来解决。

其中IP的协议字段表示上层协议类型,例如如果为1表示上层协议为ICMP协议,为2则表示为IGMP协议,若为17则表示为UDP协议,若为6则表示TCP协议,等等,我们可以通过此协议字段来进一步处理相应的协议数据。

1.2.4 ICMP

Internet控制信息协议(Internet Control Message Protocol),它提供了很多Internet的信息描述服务,能够检测网络的运行状况,通知协议有用的网络状态信息。ICMP是基于IP协议的,ICMP协议格式如图1-6 所示。

1.2.5 TCP

TCP协议是基于连接的可靠的协议,它负责发收端的协定,然后保持正确可靠的数据传输服务。它是在IP协议上运行的,而IP无连接的协议,所以TCP丰富了IP协议的功能,使它具有可靠的传输服务。TCP协议格式如图1-7所示。

1.2.6 UDP

用户数据报协议UDP是在IP协议上的传输层协议,它提供了无连接的协议服务,它在IP协议基础上提供了端口的功能,这样既可让应用程序进行通信了。UDP协议格式如图1-8所示。

1.2.7 应用层协议

对于应用层上的协议比如DNS我们知道DNS的底层传输层的协议一般为UDP且其端口号为53,所以我们可以根据传输层的UDP报文的端口来判断是否为DNS协议数据。同理我们通过TCP报文所负载的数据,判断是否是HTTP报文。根据HTTP报文格式(即请求、相应报文),我们只需要判断开头是否为”GET”、”POST”、”HTTP/1.1”就可以做到判断TCP所携带的数据是否有HTTP数据。

在此我们可以类推来通过传输层的一些信息判断出一些应用层的协议数据。

综上,我们可以看到不同层次的网络协议,我们只需通过这些协议的报文格式,即它们的约定,来定义相应的协议报文的数据结构,采用这样的数据结构就可以通过一些技术手段来进行下一步的网络数据包的发送和接收。

第2章 系统开发技术简介

2.1 WinPcap技术

2.1.1 WinPcap简介

WinPcap(windows packet capture)是windows平台下一个免费,公共的网络访问系统,开发WinPcap这个项目的目的在于为win32应用程序提供访问网络底层的能力,是用于捕获网络数据包并进行分析的开源库。大多数网络应用程序通过被广泛使用的操作系统元件来访问网络,比如sockets。这是一种简单的实现方式,因为操作系统已经妥善处理了底层具体实现细节(如协议处理,封装数据包等等),并且提供了一个与读写文件类似的,令人熟悉的接口。然而,有些时候,这种“简单的方式”并不能满足任务的需求,因为有些应用程序需要直接访问网络中的数据包。也就是说,那些应用程序需要访问原始数据包,即没有被操作系统利用网络协议处理过的数据包。

WinPcap产生的目的,就是为Win32应用程序提供这种访问方式; WinPcap提供了以下功能 :

  • 捕获原始数据包,无论它是发往某台机器的,还是在其他设备(共享媒介)上进行交换的

  • 在数据包发送给某应用程序前,根据用户指定的规则过滤数据包

  • 将原始数据包通过网络发送出去

  • 收集并统计网络流量信息

以上这些功能需要借助安装在Win32内核中的网络设备驱动程序才能实现,再加上几个动态链接库DLL。

所有这些功能都能通过一个强大的编程接口来表现出来,易于开发,并能在不同的操作系统上使用。这本手册的主要目标是在一些程序范例的帮助下,叙述这些编程接口的使用。 如果您现在就想开始摸索这些功能,您可以直接参考 WinPcap用户手册。

2.1.2 WinPcap结构

WinPcap 主要由三个模块构成,第一个模块NPF(Netgroup Packet Filter),它是一个虚拟设备驱动程序文件。它的功能为过滤数据包,并把这些数据包传给用户态模块,这个过程包括了一些操作系统特有的代码。第二个模块packet.dll为Win32平台提供了一个公共的接口。调用packet.dll的程序可以运行在不同版本的Windows平台上,而无需要重新编译。第三个模块Wpcap.dll是不依赖于操作系统的。它提供了更加高层抽象的函数。

packet.dll直接映射了内核的调用,Wpcap.dll提供了更加友好的、功能更加强大的函数调用。WinPcap的优势是提供了一套标准的抓包接口,与libpcap兼容,便于移植,充分考虑了各种性能和效率的优化。图2-1显示了WinPcap的不同的组件:

首先,捕获系统需要占用操作系统的协议栈,来访问通过网络的原始数据。这就需要有部分内容要运行在操作系统内核中,能直接访问网络接口驱动。这部分内容非常依赖于系统,在我们的解决方案中,它被认为是设备驱动,称为Netgroup Packet Filter(NPF);我们为Windows 95、Windows 98、Windows ME、Windows NT 4、Windows 2000 和 Windows XP提供了不同版本的驱动。这些驱动都提供了相同的基本功能,比如数据捕获和发送,也提供了一些高级功能,比如可编程的过滤系统和一个监听引擎,前者可以被用来获取过滤后的数据流(比如,可以从指定的端口,仅捕获ftp数据流),后者提供了一个强大的,但很简单的方式来获取数据流的统计信息。(比如获取网络流量或者两个主机间交换数据的总大小)。

其次,捕获系统必须输出一个端口,以便用户级应用程序利用内核驱动所提供的特性。WinPcap提供了两个不同的库:packet.dll 和 wpcap.dll第一个提供了低层的API,它可以直接访问驱动的函数,并且依赖于微软操作系统的可编程接口。第二个提供了更多强大的,高层次的,和libpcap(一个知名的Unix捕获库)兼容的捕获原语。这些函数可以在不考虑网络硬件和操作系统的情况下捕获数据。

NPF驱动 — 网络数据包过滤器(Netgroup Packet Filter,NPF)是WinPcap的核心部分,它是WinPcap完成困难工作的组件。它处理网络上传输的数据包,并且对用户级提供可捕获(capture)、发送(injection)和分析性能(analysis capabilities)。

2.1.3 WinPcap编程模式

虽然,WinPcap提供了数据包捕获功能,但是数据包的协议分许还是需要自己实现。由于协议千变万化,在不同的应用中就需要不同的协议分析模块,针对不同的协议我们需要根据相应协议的格式设计出数据结构和其协议分析,这是基于WinPcap应用的关键所在。

在基于WinPcap的应用程序中,有基本的编程模式。通常使用WinPcap来完成数据包的捕获、数据包的发送以及一些简单的网络功能。使用WinPcap捕获数据包和分析网络数据包的基本流程如图2-2所示。

现在具体介绍基于WinPcap开发的编程模型的一些函数:

首先使用函数pcap_findalldevs_ex()来获得主机的网络设备列表。其次打开网络设备捕获数据包的函数为 pcap_open_live() 或pcap_open(),并用函数pcap_dump_open()打开文件,用于保存实时捕获到的网络数据包。

如果想捕获特定的网络数据包,就需要使用过滤规则,过滤规则其实就是一个字符串,WinPcap使用的过滤规则兼容TcpDump的过滤规则。在WinPcap中使用pcap_compile()和pcap_setfilter()来分别编译和设置过滤规则。例如可以设置一个过滤规则字符串“host 192.168.7.3”表示只捕获IP地址为192.168.7.3的所有网络数据包。

最后就是实质的网络数据包捕获函数,可以使用pcap_loop()、pcap_next()、pcap_next_ex()等,pcap_loop()表示捕获多个数据包,可以总是循环捕获数据包,直到出现错误为止,而pcap_next()、pcap_next_ex()表示捕获一个可用数据包就返回,它们各有各的用途,用的最多为pcap_loop(),其中他需要一个函数指针的参数,其必须定义如下形式:typedef void (*pcap_func_t)(unsigned char*, const struct pcap_pkthdr*, const u_char*),在这个函数里有我们需要的网络原始数据包,后面所有的协议分析其实就是对此数据进行分析。

最后基于WinPcap的程序使用pcap_close()来关闭WinPcap句柄,其参数就是在前面由函数pcap_open_live()创建的句柄。

关于WinPcap的编程模型及其实例可以参考WinPcap技术文档。

2.1.4 WinPcap技术的应用

WinPcap可以被用来制作许多类型的网络工具,比如具有分析,解决纷争,安全和监视功能的工具。特别地,一些基于WinPcap的典型应用有:

  • 网络与协议分析器 (network and protocol analyzers)

  • 网络监视器 (network monitors)

  • 网络流量记录器 (traffic loggers)

  • 网络流量发生器 (traffic generators)

  • 用户级网桥及路由 (user-level bridges and routers)

  • 网络入侵检测系统 (network intrusion detection systems (NIDS))

  • 网络扫描器 (network scanners)

  • 安全工具 (security tools);

2.2 系统开发平台及环境搭建

  • 硬件平台

    • 处理器:Pentium II processor 以上
    • 内存:64M以上
    • 硬盘:需要至少4M可用空间
    • 显示器:分辨率1024x768或以上,32位真彩色
    • 外设:鼠标、键盘
  • 软件平台

    • 操作系统: Windows 2000, XP, Vista或Windows 7
    • 开发平台:Microsoft Visual Studio 6.0
    • 开发工具:VC++6.0 Platform SDK for Windows 2003
    • 网络:有网络连接的计算机

开发环境配置

在使用vc++编译基于WinPcap的程序时候,需要加载WinPcap的库函数wpcap.lib。首先下载WinPcap开发版本的压缩版本,可以从官方网站http://www.winpcap.org/ 下载,注意WinPcap官网上有三种WinPcap 文件,分别是WinPcap驱动文件,WinPcap开发包文件以及WinPcap源代码文件。你需要下载WinPcap驱动文件和开发包文件,它们是开发基于WinPcap应用程序必需的。

下载WinPcap压缩包,随便解压到一个目录下,例如我解压的目录是:D:\Program\WpdPack。
Vc++环境下的设置:

1.添加路径

  1. Tools->Options->Directories

看到右边的”Show directories for:”,选择”Include files”,添加WinPcap的include目录即可(即D:\Program\WpdPack\Include)。如图2-3所示:

2.添加lib目录

操作同上,在”Library files” 里面添加WinPcap的库。如图2-4所示:

3.设置工程参数

新建一个工程后,进行下列操作:Project->Settings 选择C/C++;在Preprocessor definition里面添加WPCAP。如图2-5所示:

再选择下面的Link,(即Project->Properties->setting->Link->Category->General),在下边的”Object/library modules”添加”wpcap.lib”和 “ws2_32.lib”。如图2-6所示:

第3章 系统分析与设计

3.1 系统需求分析

  • 支持多种网络接口的包捕获(以太网,令牌环网,ATM…)

  • 及时有效的捕获网络上传送的数据包,高效的处理捕获到得数据包并友好的显示给用户,让用户捕获到他想要的数据

  • 能够保存实时捕获到的网络数据包,供以后系统进一步参考和考证

  • 可以设置过滤规则,减少捕捉的包的容量

  • 可以捕获多种协议的网络数据包,并且软件系统能够提供和用户交流的平台,达到和用户互动的效果,并能够及时改正软件系统的不足之处

  • 良好的图形界面,让用户用起来方便和良好的视觉体验

3.2 包截获与分析的基本过程

系统基本流程概括如下:

  • 选择网络接口,首先获得主机的网络设备列表,然后用户通过列表选择自己需要截获哪个网络接口上的网络数据包

  • 编译、设置过滤规则,用户如果想捕获特定的网络数据包,就需要设置过滤规则,过滤规则其实就是一个字符串,在WinPcap中使用函数pcap_compole()和pcap_setfilter()分别编译和设置过滤规则

  • 开始捕获网络数据包,循环捕获网络数据包

  • 保存捕获到的数据,根据用户要求实时保存截获的网络数据包,方便进一步的考证

  • 处理捕获到的网络数据包,对捕获的网络数据包进行分解处理,从链路层到应用层,层层分解处理

  • 把第5步中层层分解得到的数据包信息显示到软件界面,并且根据用户的一些要求细化所截到数据包信息的显示

本系统的包截获和分析的基本过程简化为图3-1所示。

3.4 系统功能模块设计

此系统主要包括六大模块 如图3-6:

  • 网络包截获模块
    用一个线程来捕获网络数据包和协议分析。此模块主要是完成了网络接口的选择,编译过滤规则并设置过滤规则和网络数据包的实时捕获,并且实时保存截获到的网络数据包(注:此时主要把截获到的网路数据包保存到临时的缓冲文件中temp.pcap)。

  • 网络数据包分析模块
    在这一模块中主要对上一模块中捕获的网络数据包进行协议分析。由于TCP/IP采用分层的结构,这样在传输数据的时候,在网络接收端是分解的过程,而发送端是一个封装的过程。要发送一个数据包,数据包必须进行层层封装,最终形成以太网数据最终发送到网络物理介质上进行传送。当接收数据包是与发送相反。通过封装,分解,并根据报文的协议字段或标识字段进行协议的分析,最终能够分析以太网Ⅱ、IP,ARP/RARP、ICMP、TCP、UDP、HTTP、DNS等协议。

  • 截获的数据包保存、打开模块
    在这个模块中主要完成对实时截获到的网络数据包进行保存,其根据用户需要把文件保存到具体什么位置,然后保存此文件。打开文件模块主要是创建一个文件打开线程,对脱机文件进行网络协议的分析,并把分析结果准确的显示给用户。

  • 过滤规则设置模块
    过滤规则设置模块主要在系统工作前的过滤规则设置,此模块可以记录一些常用的过滤规则名和过滤语句,并且应该能够编辑和删除相应的过滤规则。当用户选定某一常用过滤规则或者填写自己的过滤语句后单击”开始”按钮后,系统能及时反映此过滤规则是否符合过滤语句语法。

  • 网络数据包显示模块
    系统截获网络数据包是为了显示截获的数据,此模块能够高效及时显示所截获的网络数据包,并能够通过列表,树图,编辑框等多种形式显示给用户,让用户更直观的了解捕获到的网络数据包。当用户选择其要查看的网络信息的某条信息时能够对词条信息进行详细显示。

  • 软件界面设计模块
    好的软件系统不仅有较好的功能,并且需要有友好的界面,和不同的界面显示给用户,用户根据自己的喜好可以更改自己的软件界面。

3.4 系统的配置设计

由于系统要用到一些动态链接库和皮肤库,和过滤规则库,因此能够设计好良好的系统配置信息是必须的。此系统将把所有需要的动态链接库和配置文件放在config目录下,而所需要的系统皮肤文件放在skin目录下。系统启动之前必须具备这两个目录下的文件。否则将达不到预期的系统效果。

第4章 系统实现

4.1 模块功能介绍

本系统是基于WinPcap的网络包截获与分析系统。根据课题设计需要实现的功能如下:

  • 网络包截获模块。可以截获经过此主机的网络数据包

  • 网络协议分析。此模块可以对不同层的网络协议的分析

  • 过滤规则设置模块。此模块可以设置常用规则并且可以直接设置规则进行相应的包截获过滤语句的设置

  • 网络数据包显示模块。此模块可以有多种方法层次化的显示所截获的网络数据包,包括列表形式的显示,树形显示,编辑框显示等,让用户直观的获得所截获的网络数据包协议信息

  • 能够实时保存捕获到的网络数据,并且用户可以选择保存到自己想保存的目录下。此外用户可以根据需要打开以前截获到的.pcap文件,实现数据分析和取证

  • 软件界面设计模块,此模块能够满足用户换肤,程序托盘,有一个比较好的图形界面接口呈现给用户

4.2 功能实现方法

在这一小节中,介绍了系统的主要的功能模块和其实现方法的大致描述,详细内容请见本系统的源代码,系统源代码已经做了比较详细的注解。

4.2.1 系统基本要素

此系统无需安装,只要系统必需要素具备即可运行。其中config目录下有filter.ini配置文件及SkinH.dll动态链接库。skin目录下为系统所需的皮肤文件。

系统基本要素如图4-1所示。

4.2.2 系统启动界面

系统启动时动画界面显示启动界面。

实现方法其实比较简单,创建一个兼容的内存DC放置位图,把启动画面分成一个大网格,一个20*20的网格,每个网格内存放分割的位图,并用数组记录已显示过的位图。何时显示哪个小网格中的图片则采用随机数(两个1 – 20的随机数,这样就可以用二维数组来记录是否显示过此位图),所以感觉是动画的。

4.2.3 系统换肤和良好的图形界面

如图4-4 所示这是系统的工作界面。此系统可以根据自己的喜好实现系统皮肤的切换。点击系统右上方的 图标即可实现系统的换肤,如图4-5所示。

实现由美丽的程序界面和换肤的功能其实也不是太复杂。主要借助第三方库,此系统借用的是比较好用的skin#库,下载此库的.dll文件和你喜好的皮肤库。

此系统我们采用程序运行时动态链接的方法加载皮肤库。

  1. /*宏定义函数指针类型 */
  2. typedef int ( WINAPI *SKINH_ATTACHEX)(LPCTSTR strSkinFile,LPCTSTR strPassword);
  3. // 取得SKINH_ATTACHEX函数的地址
  4. SKINH_ATTACHEX pSkinFun=(SKINH_ATTACHEX)::GetProcAddress(LoadLibrary("config\\SkinH.dll"),
  5. "SkinH_AttachEx");

然后在OnInitDialog()中加载相应的皮肤即可。比如pSkinFun(_T(“skin\pixos.she”), NULL)。换肤功能模块就是添加一个按钮和相应的菜单,并处理相应的消息响应即可完成换肤功能。

4.2.4 过滤规则设置模块

在开始捕获数据包前可以根据自己的需要来设置自己想要的数据包过滤语句,单击过滤规则模块如图4-6所示。可以根据自己的需要添加和删除自己的过滤规则,详情可以点击帮助按钮如图4-7 里面有简单的说明用户可以查看帮助,如果还是不明白,可以把鼠标放在”了解更多..”上单击即可进入作者的博客,里面有关过滤语句语法的更深入介绍,用户也可以和作者本人进行互动,反馈系统的不足和你的建议。

实现方法先定义一个关于过滤规则的结构体如下:

  1. typedef struct FILETER_
  2. {
  3. char FilterName[256]; // 过滤规则名称
  4. char FilterValue[256]; // 过滤规则语句表达式
  5. // 重载赋值运算符
  6. const FILETER_ & operator=( const FILETER_ temp )
  7. {
  8. ZeroMemory(FilterName,256);
  9. ZeroMemory(FilterValue,256);
  10. strcpy(FilterValue,temp.FilterValue);
  11. strcpy(FilterName,temp.FilterName);
  12. return *this;
  13. }
  14. }FILETER_DATA ,*PFILETER_DATA;

然后定义一个此结构体类型的向量typedef vector<FILETER_DATA> Filter_Vector。

当用户设置过滤规则时,通过LoadUserFilter()函数加载用户自己的过滤规则库,其中此函数为自己实现的,为从一个我们之前定义的配置文件中读取常用规则并写入到向量Filter_Vector 中,并显示在我们的窗口上。用户可以添加和删除常用规则,此时同时反映在Filter_Vector中,当用户退出过滤规则设置时对话框时系统将同时读取到过滤语句,并且通过我们自定义的SaveUserFilter()把我们的过滤规则存回配置文件.ini中。配置文件的功能主要用到win API GetPrivateProfileString 和WritePrivateProfileString。

帮助模块的功能实现方法比较简单,实现连接到网站的功能主要利用到了Win API ShellExecute函数实现,其它的实现方法不再敷述。

4.2.5 截获的包保存和文件打开模块

此模块能够实时保存捕获到的网络数据,并且用户可以选择保存到自己想保存的目录下。此外用户可以根据需要打开以前截获到的.pcap文件,实现数据分析和取证。

保存文件:首先就是在截获网络数据包时,把截获到的网络数据包实时的保存到临时的缓冲文件temp.pcap中,然后根据用户是否保存文件,若用户选择保存此文件到一个指定的路径下,则系统创建一个CFileDialog文件对话框,获得用户指定的路径及文件名,然后把保存的缓冲临时文件拷贝到用户指定的目录下,这个主要利用函数CopyFile()来实现。这样即可实现文件的保存。

打开文件:它的实现方法主要是创建一个文件读取线程ThreadReadFile(),这个线程中主要函数为DumpFileOperation(),在这个函数中首先创建一个CFileDialog 文件对话框,然后根据用户的选择的文件利用GetFileName()函数获得文件路径及名字,然后就是根据WinPcap的编程模型的一些具体的常见步骤,最后pcap_loop()读取真正的网络数据文件,在这个pcap_loop()函数里我们定义了ProcessProtocolPacketFromDumpFile()这个回调函数。这个回调函数里包括原始的数据包,并且实现了对其的解析。详见下一小节的数据包分析功能模块。

4.2.6 包截获和分析功能模块

系统使用多线程技术,来实现捕获数据包和数据包的显示同步进行,提高系统的性能。

此模块主要实现了网络数据包的截获和分析。过滤规则设置后,单击系统的开始按钮选择所需监听的网卡。如图4-10所示

系统把所截获的信息实时的显示给用户,用户可以根据自己的需要查看相应的协议数据信息。

数据包的捕获主要采用WinPcap编程技术实现的,然后对捕获到的数据包进行各种协议的分析,把分析的网络信息显示在主程序界面中。本模块主要采用多线程技术,创建一个线程用来捕获数据包和协议分析,然后把协议分析结果传送给网络数据包显示模块。

其中文件Protocol.h中主要定义了相关协议的数据结构,文件sniffer.h定义了捕获线程和分析数据包所用到的自定义的原始数据包结构。此功能模块主要的核心功能函数的调用过程如图4-11所示。

在网络数据包协议解析和数据包的信息显示中有一个比较重要的数据结构如下:

  1. //程序内部保存的数据包结构,即原始数据
  2. typedef struct
  3. {
  4. pcap_pkthdr PktHeader; //包头部信息结构指针
  5. u_char* pPktData; //包数据指针
  6. u_int ip_seq; //网络层截获的包Ip序号
  7. u_int tcpOrUdp_seq;//传输层截获的包序号
  8. } RAW_PACKET;

这个RAW_PACKET结构记录了所捕获的网络数据包的原始数据以及它的网络层、传输层的包序号(即在列表框中已经解析的协议),这样当再次解析这个原始数据包时就可以直接调用之前已经解析过的信息,这样可以达到功能复用的效果,提高程序的效率。

下面具体介绍包截获和分析线程的具体实现方法:

首先创建一个包捕获线程:

  1. UINT ThreadPacketCapture(LPVOID pParam);

在这个函数里我们定义一个包捕获函数CapturePacket(),在这个函数里我们按照WinPcap捕获数据包的方法进行编程(详细请见系统源码,在此不再敷述),在CapturePacket()函数中比较实质的网络数据包捕获函数就是pcap_loop()函数,它实现了循环捕获网络数据包。

  1. int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char * user);

这个函数参数p表示WinPcap句柄,cnt表示捕获的个数,负数表示无限捕获,参数callback表示回调函数(注意着个函数很重要,稍后再介绍),user表示传递给回调函数的参数,如果无就无NULL,回调函数我们定义为:

  1. typedef void (*pcap_func_t)(unsigned char* , const struct pcap_pkthdr*, const u_char*)

这样的类型,第一个参数就是从pcap_loop中传进来的用户参数,第二个参数就是捕获到的网络数据包的简单信息,是由WinPcap设定的,有数据结构pcap_pkthdr表示,第三个参数表示捕获到的真正的网络数据包,它存储了网络数据包的原始数据,后面所有的分析其实就是对这个原始数据包进行分析。

在包截获函数CapturePacket()中我们定义一个pcap_handler类型的句柄变量Handler,我们把这个变量赋值为我们自定义的pcap_loop()的回调函数的指针并调用它如下代码所示:

  1. /* 每次捕获到数据包时,libpcap都会自动调用这个回调函数 */
  2. Handler = (pcap_func_t)ProcessProtocolPacket;
  3. /* 开始捕获 */
  4. pcap_loop(PcapHandle, number, Handler, (unsigned char *)PcapFile);

在回调函数ProcessProtocolPacket(unsigned char* user, const struct pcap_pkthdr* h,const unsigned char* packetdata)中我们把截获到的数据包(即此函数第2、3个参数所包含的数据)保存到在堆中申请的内存中(此时用用到自定义的数据结构RAW_PACKET中),此时我们就有了捕获到的这个数据包的简单信息和存放自定义数据结构信息在堆的指针,然后调用ParseEthernet(packetdata, pRawPacket)函数分析截获到的以太帧数据,在函数ParseEthernet()中可以进行IP,ARP等网络层的协议分析,依次类推我们可以根据本层的协议字段来进一步分析传输层、应用层的协议信息。具体请见sniffer.cpp文件中的线程函数和数据包分析函数。

4.2.7 数据包分析结果显示功能模块

本系统采用三种形式把数据显示给用户,首先用户可以根据自己的需要点击Tab页的网络协议按钮,查看各个网络层次的网络协议。相关的指定的协议信息在列表框中分条显示出来。其次用户可以在列表框框中选择自己需要查看的某条网络数据包的详细信息,鼠标单击此条即可查看此条数据包的相对完整信息,即从链路层的网络信息到你所查看的协议层的信息或者全部的链路层包括所负载的网络信息。用户可以单击右键复制你所需要的某一列的信息。最后用户可以单击左下角树图控件的节点查看比较具体协议信息的解析。用户可以鼠标双击树节点,这样可以在右下角的编辑控件中的十六进制字码中查看原始的网络数据包(分别是相应的十六进制和可显示字符),此时的原始数据包在编辑框中被选中,这样方便用户进行网络协议的分析。如图4-12所示。

在分析网络协议信息时要把协议信息实时的显示到程序的界面。我们用自定义消息来实现,一共定义了有关协议显示的9条消息。当捕获到数据包后就对其进行相应的协议分析,然后通过发送自定义的消息通知程序界面模块显示分析后的协议数据。自定义消息如下:

  1. #define WM_MY_MESSAGE_COMMON (WM_USER+100) //显示数据包一些常用的协议消息
  2. #define WM_MY_MESSAGE_ARP (WM_USER+101) //显示ARP/RARP协议信息消息
  3. #define WM_MY_MESSAGE_IP (WM_USER+102) //显示IP协议信息消息
  4. #define WM_MY_MESSAGE_TCP (WM_USER+103) //显示TCP协议信息消息
  5. #define WM_MY_MESSAGE_UDP (WM_USER+104) //显示UDP协议信息消息
  6. #define WM_MY_MESSAGE_ICMP (WM_USER+105) //显示ICMP协议信息消息
  7. #define WM_MY_MESSAGE_ETHERNET (WM_USER+106)//显示以太网信息消息
  8. #define WM_MY_MESSAGE_HTTP (WM_USER+107) //显示HTTP协议信息消息
  9. #define WM_MY_MESSAGE_DNS (WM_USER+108) //显示DNS协议信息消息

这些自定义的消息有自己自定应的函数,比如WM_MY_MESSAGE_ETHERNET对应的消息自定义函数消息映射ON_MESSAGE(WM_MY_MESSAGE_ETHERNET, OnEthernet)可以知道当操作系统捕获到WM_MY_MESSAGE_ETHERNET消息就会调用OnEthernet函数在对应的Tab页(即以太网信息Tab也)中的列表框中显示详细的协议解析信息。其它的协议显示过程和此同理,见图4-11所示详细的解析后的显示函数调用关系。

在协议分析过程中,以太网协议分析是第一步。首先分析以太网协议部分,然后根据以太网中的协议字段再分析其它的协议数据。比如在4.2.6小节中ParseEthernet(packetdata, pRawPacket)函数,首先强制转化指向自定义的数据结构指针的参数pRawPacket, LPARAM lp=(LPARAM)pRawPacket(这样为了PostMessage),此时向系统发送消息,表示截获到以太帧,::PostMessage(g_hWnd, WM_MY_MESSAGE_ETHERNET, 0, lp),其中g_hWnd为系统主界面窗口句柄,他将捕获到的以太消息放入到与主界面线程相联系的消息队列里,用来显示其协议信息。参数lp即是指向堆中的原始网络数据包指针,它在显示函数中会用API SetItemData()添加附加据,即将列表项与存放原始数据包的堆地址指针关联,这样为了方便以后的处理某一列显示在树控件和编辑框中所用。

此外当系统分析到网络层、传输层,在显示函数如OnIp()、OnTcp ()、OnUdp(),中修改pRawPacket所指结构RAW_PACKET中的ip_seq,tcpOrUdp_seq的序号(它们即是这个pRawPacket所指原始数据包中对应的数据包的网络层、传输层在对应Tab中的某一行的序号),这样当再使用这个原始数据包时,可以通过对应协议的Tab页中的列表框直接使用已经解析过的数据包结果,可以提高程序的效率达到复用的效果。

当用户单击列表框的某一行时,系统就处理相应的NM_CLICK消息事件,在处理鼠标单击事件的函数中调用显示数据包信息的函数比如ShowPacketInfo(RAW_PACKET* pRawPacket)、ShowIpInfo(int nItem)、ShowTcpInfo(int nItem)、ShowUdpInfo(int nItem)等来进一步详细的显示包信息。

其中ShowPacketInfo()就是通过我们关联到列表框每一行的原始数据来进行树控件中MAC的显示,以及右下角编辑框中的原始数据的显示,ShowIpInfo()、ShowTcpInfo()、ShowUdpInfo()函数则利用我们定义的RAW_PACKET结构中的ip_seq,tcpOrUdp_seq序号来直接读取列表框中的关于此数据包中网络层或者传输层的协议分析结果,把从列表框中读取的信息显示到左下角的树控件中去,这样做就可以把列表框中某一行的数据包信息更精细的显示到树控件和编辑框中。

4.2.8 界面菜单、按钮、托盘等模块

此模块主要实现程序与用户交互的图形界面的接口安排。在程序的第一级有五个菜单分别对应为文件、捕获、系统设置、查看、帮助。

其中文件菜单项 包括打开文件,保存文件,退出系统3个子菜单。捕获菜单项,包括开始、停止、重新开始3个子菜单项。系统设置菜单项包括过滤规则设置、保存文件2个菜单子项。查看菜单项,包括查看首条、查看最后一条、转到中间位置3个菜单子项。帮助菜单项包括帮助菜单子项。如图4-13所示。

在第一级五个菜单项之后是六个按钮和两个静态框用于实时显示捕获包个数和目前的协议信息。按钮下方就是9个Tab页,Tab页下方就是显示协议信息的列表框。在Tab页的下方是树控件和编辑框,分别直观的显示捕获到的协议信息。可以从图4-12 的图示得到结果。

本系统的界面的尺寸可以随用户的要求改变大小,系统具有托盘功能如图4-14所示。

首先系统建立一个基于对话框的工程,然后在主面板上加上相应的控件和在工程资源里加入菜单、图标等。

实现系统界面改变大小时相应的控件也随着改变大小主要 利用Win API GetClientRect( )、GetWindowRect( )、ScreenToClient( )、SetWindowPos( )等函数来时实现,当然首先要在系统的里添加WM_SIZE消息响应事件。其它的比如按钮,菜单等只要添加相应的事件处理函数即可实现,在此不再敷述。

托盘的实现,自定义函数TrayMyIcon( ),在OnSysCommand( )中判断系统是否最小化SC_MINIMIZE然后调用函数TrayMyIcon( ),在这个函数里主要利用NOTIFYICONDATA任务托盘有关结构,并用API Shell_NotifyIcon( ) 向系统传递消息是否托盘,并且在工程里添加ON_MESSAGE( WM_TRAYICON_MSG,OnTrayCallBackMsg),实现托盘功能的消息映射函数。

第5章 系统测试

5.1 测试环境

5.1.1 系统要求

  • 操作系统: Windows 2000, XP, Vista或Windows 7

  • 处理器:Pentium II processor 以上

  • 内存:64M以上

  • 硬盘:需要至少5M可用空间

  • 显示器:分辨率1024x768或以上,32位真彩色

  • 外设:鼠标、键盘

  • 网络环境:有网络连接的计算机

5.1.2 系统环境配置要求

本系统运行前需要你的计算机操作系统安装WinPcap_4_0_1.exe或者更高版本的WinPcap.,此外本系统所需的config,skin目录下的文件也是必须的。

本系统无需安装,直接运行“网络包截获分析系统.exe”即可。

5.4 测试结果

系统已经经过多次测试,现在选取比较有代表性的测试结果如下。

计算机联网后,打开多个网络接口比如有线网、无线网、虚拟机的网络接口等。分别测试各个网络接口看是否能根据不同的网络接口截获到网络数据包。

打开此系统,点击“开始”按钮,分别选择不同网络接口(左边的图为选择有线网网络接口,右边图为选择无线网网络接口,即为网络接口Ⅰ,Ⅱ),如图5-1所示。

根据用户的指定的网络接口,看是否能够实现指定接口的网络检测,如图5-2,图5-3所示。其分别是网络接口Ⅰ和Ⅱ截获的数据包。

通过以上测试可知系统可以进行不同网络接口的网络数据包截获和分析。

在网络包截获和分析模块中,测试系统是否可捕获数据包并能够进行各个层次的网络协议的分析,并且根据系统分析的结果和系统截获的原始数据包进行对比,测试系统的协议分析模块的有效性。

开始捕获数据包,看是否能捕获的类型协议的数据包,如图5-4所示。

如上图5-4,我们查看是否截获到应用层协议DNS,通过上图可知已经捕获到DNS数据包。现在我们选择截获到的序号为0的DNS数据包。我们通过左下角树形控件可以清楚的知道此系统可以截获到不同层的网络协议数据包。

现在通过系统对所截获的网络数据包的协议分析与截获到的原始网络数据包进行比较,测试系统是否能够准确的对所截获到的网络数据包进行正确的协议分析。

鼠标双击左下角树控件中的MAC节点,可以看到系统分析的结果为:目的MAC :28 6E D4 4F 18 88 ,源MAC:5C AC 4C 3D 43 83,协议类型:08 00 可知为IP协议。这些分析与右下角编辑框中的原始数据包MAC头部一致,其十六进制信息为28 6E D4 4F 18 88 5C AC 4C 3D 43 83 08 00,可知系统关于以太帧头部的协议分析是正确的。

鼠标双击左下角树控件中的UDP节点,可以发现UDP数据包的十六进制数据信息为:D8 B7 00 35 00 2A 88 C6,我们按照UDP报文的协议格式对此进行协议分析,易知,源端口D8 B7转化为十进制的数位55479,目的端口00 35转化为十进制为53,UDP长度字段为00 2A转化为十进制为42,UDP校验和为88 C6,转化为十进制为35014。综合这些对原始数据报文的分析与系统对这些报文的分析结果是一致的,可知对应用层的DNS协议分析也是正确的。

综上我们随机选取的数据报文分析可知,系统包截获和对数据包的网络协议的分析是有效的和完全正确的,并且系统可以及时有效的显示捕获到的网络数据包的协议信息。

过滤规则设置模块测试。首先在这个模块中测试用户是否可以添加自定义的过滤规则,如图5-5所示。

测试当用户在“滤规则名字”编辑框和“过滤语句”编辑框中输入自己常用的过滤规则看系统是否可以保存此规则,用户添加规则单击“确定”按钮后关闭系统,然后再打开过滤规则模块查看常用过滤规则中是否包含用户刚添加过的常用规则。同样可以测试“删除“常用规则,测试也是成功的。

其次测试当用户输入错误语法的过滤语句时,测试系统是否能够提醒用户过滤规则不可用,比如我们在过滤语句中输入过滤语句:arp and tcp,系统会出现如图5-5所示的错误提醒。

通过这一步测试我们可以得知,此系统具有辨别非法过滤语句的功能,能够让用户及时更改过滤语句,而不至于不知道系统截获不到数据包的原因。

最后测试系统是否能够根据用户的过滤语句实现对指定的协议数据包进行捕获和分析,我们打开系统,然后输入我们的测试过滤语句: icmp,最后选择我们指定的网络接口开始捕获网络数据包。如图5-7所示。

测试结果显示,总共截获到11个数据包,而截获到的ICMP数据包也是11个,并且查看别的协议信息发现并没有截获到TCP、UDP等别的协议数据包,所以可以肯定此系统能够过滤到指定的协议的数据包。

测试是否能够保存截获到的网络数据和打开截获到的网络数据文件。

首先启动系统,开始截获网络数据包,单击“保存文件”,检测是否可以保存到指定的路径下。我们选择保存到桌面上的“所截获的数据包”目录下,然后打开此目录查看是否有ppoe.pcap的文件。如图5-8所示。

经过测试发现可以保存截获到的网络数据包。

对于是否能够打开此文件并进行相应的网络协议的分析,在此不再列出,方法和打开文件类似,打开上述捕获到的数据包打开即可。经过测试发现可以打开保存的文件,并能进行相应的协议分析。

测试系统换肤、良好图形用户接口模块。这个模块的测试相对比较简单,通过单击换肤按钮,可以很容易的测试到系统可以根据用户的喜好来改变系统的皮肤,能够提供良好的图形界面接口,此外通过单击程序主界面上的按钮来进行相应功能的测试,在此不再敷述。

上传的附件 cloud_download 基于WinPcap的包截获和分析系统.7z ( 9.18mb, 36次下载 )
error_outline 下载需要13点积分

发送私信

回忆在岁月的痕迹里,沉淀出好看的样子

6
文章数
14
评论数
最近文章
eject