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

luckone

发布日期: 2019-05-17 11:24:52 浏览量: 1615
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

前言

1,基于WinPcap的网络包截获和分析系统
2,需要安装winpcap包,WinPcap中文技术文档 http://www.ferrisxu.com/WinPcap/html/main.html
3,配置winpcap编程环境(VC6.0 或者VS2008)可参见 开发文档或者 google “vc++ winpcap配置”
4,程序使用的皮肤库为 skin#

可执行程序Npcas.exe在Release 目录下(程序运行在windows平台下),使用程序前需要安装winpcap。

摘要

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

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

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

1 系统分析与设计

1.1 系统需求分析

  • 支持多种网络接口的包捕获(以太网,令牌环网,ATM…);
  • 及时有效的捕获网络上传送的数据包,高效的处理捕获到得数据包并友好的显示给用户,让用户捕获到他想要的数据;
  • 能够保存实时捕获到的网络数据包,供以后系统进一步参考和考证;
  • 可以设置过滤规则,减少捕捉的包的容量;
  • 可以捕获多种协议的网络数据包,并且软件系统能够提供和用户交流的平台,达到和用户互动的效果,并能够及时改正软件系统的不足之处;
  • 良好的图形界面,让用户用起来方便和良好的视觉体验;

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

系统基本流程概括如下:

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

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

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

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

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

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

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

1.3 系统功能模块设计

​ 此系统主要包括六大模块,如图:

网络包截获模块:

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

网络数据包分析模块:

​ 在这一模块中主要对上一模块中捕获的网络数据包进行协议分析。由于TCP/IP采用分层的结构,这样在传输数据的时候,在网络接收端是分解的过程,而发送端是一个封装的过程。

要发送一个数据包,数据包必须进行层层封装,最终形成以太网数据最终发送到网络物理介质上进行传送。当接收数据包是与发送相反。通过封装,分解,并根据报文的协议字段或标识字段进行协议的分析,最终能够分析以太网Ⅱ、IP,ARP/RARP、ICMP、TCP、UDP、HTTP、DNS等协议。

截获的数据包保存、打开模块:

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

过滤规则设置模块:

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

网络数据包显示模块:

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

软件界面设计模块:

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

1.4 系统的配置设计

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

2 系统实现

2.1 模块功能介绍

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

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

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

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

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

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

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

2.2 功能实现方法

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

2.2.1 系统基本要素

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

系统基本要素如图所示。

2.2.2 系统启动界面

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

实现方法:

方法其实比较简单,创建一个兼容的内存DC放置位图,把启动画面分成一个大网格,一个20*20的网格,每个网格内存放分割的位图,并用数组记录已显示过的位图。何时显示哪个小网格中的图片则采用随机数(两个1 – 20

的随机数,这样就可以用二维数组来记录是否显示过此位图),所以感觉是动画的。

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

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

实现方法:

实现由美丽的程序界面和换肤的功能其实也不是太复杂。主要借助第三方库,此系统借用的是比较好用的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");

2.2.4 过滤规则设置模块

在开始捕获数据包前可以根据自己的需要来设置自己想要的数据包过滤语句,单击过滤规则模块如下图所示。可以根据自己的需要添加和删除自己的过滤规则。

实现方法:

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

  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函数实现,其它的实现方法不再敷述。

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

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

效果如下图所示。

实现方法:

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

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

2.2.6 包截获和分析功能模块

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

此模块主要实现了网络数据包的截获和分析。过滤规则设置后,单击系统的开始按钮选择所需监听的网卡。如下图所示,系统把所截获的信息实时的显示给用户,用户可以根据自己的需要查看相应的协议数据信息。

实现方法:

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

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

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

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

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

首先创建一个包捕获线程:UINT ThreadPacketCapture(LPVOID pParam);

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

这个函数参数p表示WinPcap句柄,cnt表示捕获的个数,负数表示无限捕获,参数callback表示回调函数(注意着个函数很重要,稍后再介绍),user表示传递给回调函数的参数,如果无就无NULL,回调函数我们定义为typedefvoid (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页的网络协议按钮,查看各个网络层次的网络协议。相关的指定的协议信息在列表框中分条显示出来。其次用户可以在列表框框中选择自己需要查看的某条网络数据包的详细信息,鼠标单击此条即可查看此条数据包的相对完整信息,即从链路层的网络信息到你所查看的协议层的信息或者全部的链路层包括所负载的网络信息。用户可以单击右键复制你所需要的某一列的信息。最后用户可以单击左下角树图控件的节点查看比较具体协议信息的解析。用户可以鼠标双击树节点,这样可以在右下角的编辑控件中的十六进制字码中查看原始的网络数据包(分别是相应的十六进制和可显示字符),此时的原始数据包在编辑框中被选中,这样方便用户进行网络协议的分析。如下图所示。

实现方法:

在分析网络协议信息时要把协议信息实时的显示到程序的界面。我们用自定义消息来实现,一共定义了有关协议显示的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也)中的列表框中显示详细的协议解析信息。其它的协议显示过程和此同理。

在协议分析过程中,以太网协议分析是第一步。首先分析以太网协议部分,然后根据以太网中的协议字段再分析其它的协议数据。比如在2.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(intnItem)等来进一步详细的显示包信息。

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

参考文献:

http://www.ferrisxu.com/WinPcap/html/main.html

[1] The WinPcap Team .WinPcap中文技术文档. Torino:CACETechnologies,Translated By CoffeeCat Studio 2007.7

[2] 郭军. 网络管理(第3版).北京:北京邮电大学出版社,2008.3

[3] 武孟军、等. Visual C++开发基于SNMP网络管理软件(第2版)..北京:人民邮电出版社,

2009.4

[4] 王艳平. Windows 网络与通信程序设计.北京:人民邮电出版社,2009.4

[5] 侯俊杰. win32多线程编程.武汉. 华中科技大学出版社,2002.1

[6] 辛长安.VisualC++权威剖析—MFC原理、机制与开发实例.清华大学出版社, 2008-4-25

[7] 胡滨.基于Windows平台的底层数据包截获技术[J].计算机工程与设计.2005(11):179-180,223

[8] 谢希仁.计算机网络(第五版).北京:电子工业出版社,2008.1

上传的附件 cloud_download 基于WinPcap的网络包截获和分析系统.zip ( 10.82mb, 65次下载 )
error_outline 下载需要10点积分

发送私信

生活变得再糟糕,也不妨碍你变得更好

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