基于Winpcap网络数据包的捕获与存储技术研究

时间:2023-04-25 20:24:02 公文范文 来源:网友投稿

摘要:利用Winpcap网络开发包使应用程序绕过协议栈捕获并传送网络数据包,实现了数据包的循环捕获。基于Windows平台,用VC++6.0实现界面设计,并运用ADO技术与数据库连接,实现了数据包实时分析和数据的存储功能。

关键词:Winpcap;数据包;协议分析;数据库

中图分类号:TP391 文献标识码:A 文章编号文章编号:16727800(2014)001012503

作者简介作者简介:李星(1987-),男,西南交通大学电气工程学院硕士研究生,研究方向为微机保护与综合自动化。

0 引言

随着计算机网络的迅速发展,人们迫切希望网络上的信息不被泄露、更改和破坏,网络服务不被中断。网络数据包捕获和分析技术是网络安全维护的基础技术和核心手段,因此,深入研究网络数据包的捕获和分析技术尤为必要。本文提出了一种可行的捕获网络数据包的设计流程,并实现了对捕获的数据包的实时分析和存储功能。

1 基于Winpcap数据包的捕获技术

1.1 网络通信模型及常规通信编程方法

计算机网络通信采用OSI七层模型标准,只要遵循这个标准就可以和位于世界任何地方、同样也遵循OSI标准的其它任何系统进行连接。但实际上完全符合各层协议的商用产品很少,随着Internet在全世界的飞速发展,TCP/IP已经成为事实上的国际标准,它们的对比参考模型如图1所示。

图1 OSI模型与TCP/IP参考模型

对Windows系统,数据包捕获用到的主要方法有原始套接字、调用NDIS库函数、使用他人编写的中间层驱动、使用第三方组织提供的捕获组件或者库(如Winpcap)共4种。本文采用第4种,具体介绍如下:

1.2 Winpcap技术简介

Winpcap是UNIX下的libpcap移植到Windows下的产物,它是一个开源项目。Winpcap工作于驱动(Driver)层,所以能以很高的效率进行网络操作。Winpcap提供了以下强大功能[1]:

①获取网卡列表及信息;

②捕获原始的数据包;

③设置filter,只捕获自己感兴趣的数据包;

④方便地把捕获的数据包输出到文件和从文件输入;

⑤发送原始的数据包;

⑥统计网络流量。

本文使用MFC应用程序的界面设计编写程序,核心开发主要使用Winpcap完成。Winpcap的组成部分如图2所示,使用其提供的函数主要完成网络数据包的捕获等功能。

图2 Winpcap的组成部分

Winpcap为Win32应用程序提供访问网络底层的能力,底层是基于WINPCAP包进行开发。主要用到的函数包括[2]:

(1) int pcap_findalldevs();用于返回所找到的适配器列表。

(2) pcap_t * pcap_open();用于打开一个网络接口进行数据包捕获。

(3) void pcap_dump();用于将包内容输出到由pcap_dump_open()打开的文件中。

(4) int pcap_compile();用于将过滤规则字符串编译成一个BPF内核过滤程序。

(5) int pcap_setfilter();功能是设置BPF过滤规则。

(6) int pcap_datalink();功能是获取数据链路层类型,如10M以太网、SLIP、 IEEE802.3等。

1.3 数据捕获原理

以太网(Ethernet)是一种总线型网络,具有共享介质的特征,当网络适配器设置为监听模式(混杂模式,Promiscuous)时,由于采用以太网广播信道争用的方式,使得监听系统与正常通道的网络能够并联连接,并可以捕获任何一个在同一冲突域上传输的数据包,运用这一原理就能监听所需要的信息。

1.4 原始数据包捕获的实现

捕获流程按先后顺序如下:

① 捕获设备可用的接口列表;

② 选择接口并将其设为混杂模式捕捉;

③ 将捕捉的数据包保存进数据库以便读取和分析;

④ 读取数据库保存的数据包并进行分析;

⑤ 释放接口。

本软件建立在Winpcap结构的第三层模块Winpcap.dll之上,并用VC++6.0多线程技术实现。主线程用于查找和显示网络设备、设置过滤器、分析数据包。子线程用于打开选择网络接口、捕获数据包并实时存入数据库中。

1.5 体系结构设计总框架

Winpcap提供了数据包的捕获功能,在不同的应用中需要设计不同的协议分析模块。针对不同的协议,设计相应的协议分析功能,是基于Winpcap应用的关键所在。本文使用Winpcap捕获和分析网络数据包的框架如图3所示。

图3 网络数据包捕获和分析框架

2 具体设计与实现过程

2.1 Winpcap安装与配置

由于本程序采用Winpcap抓取数据包,所以需要Winpcap软件包以及相应开发包的支持。主要配置包括头文件目录和库文件目录,增加与Winpcap有关的预处理定义、pcap.h头文件以及添加静态链接库,然后编译并测试代码。本程序采用的开发环境是Winpcap4.1.3以及对应的开发包[3]。

2.2 初始化

这部分主要做的工作就是VC、MFC框架以及相关控件的初始化,包括列名称、列宽度等相关属性,网络设备信息包括设备的唯一识别名称及其可读的描述内容,然后将其显示在一个下拉列表中供用户选择。

2.3 ADO技术及连接数据库

2.3.1 ADO技术简介

ADO是一组由微软提供的COM组件,基于面向对象思想的编程接口。它建立在COM体系结构之上,其所有接口都是自动化接口,因此在C++、VisualBasic、Delphi等支持COM的开发语言中通过接口都可以访问到ADO。ADO对象模型非常精炼,由3个主要对象Connection、Command、Recordset和几个辅助对象组成。

2.3.2 连接数据库代码设计

首先,使用ADO前必须在工程的StdAfx.h头文件里直接引用符号#import,以此引入ADO库文件,使编译器能正确编译;其次,定义ADO连接、命令、记录集指针,这些指针为整个应用程序所共享。如在对话框头文件中定义:_ConnectionPtr m_pConnection; _CommandPtr m_pCommand;_RecordsetPtr m_pRecordset;再次,需要初始化OLE/COM库环境。在MFC应用程序里,一个比较好的方法是在应用程序主类的InitInstance成员函数里初始化OLE/COM库环境。通常在ADO操作中语句要常用try....catch()来捕获错误信息,此时通过链接字符串与相应的数据库连接[4]。代码如下:

AfxOleInit();

m_pConnection.CreateInstance(_uuidof(Connection));

try

{

m_pConnection->Open("driver={SQL Server};

Server=LENOVO-PC;

Database=网络数据包;UID="";PWD=""","","",adModeUnknown);

AfxMessageBox("数据库已连接成功!");

}

catch(_com_error e)

{

AfxMessageBox("数据库连接失败!");

return FALSE;

}

最后,通过引用类中的theApp获取库连接指针,同样采用try...catch()来捕获错误信息。程序代码如下:

m_pRecordset.CreateInstance(_uuidof(Recordset));

try

{

m_pRecordset->Open("select*fromIP",theApp.m_pConnection.

GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);

}

catch(_com_error *e)

{

AfxMessageBox(e->ErrorMessage());

}

至此,与ADO相关的代码都已经添加完成。

2.4 功能相关的代码设计及程序编写

2.4.1 程序开发流程

本程序具体流程:主程序→数据包捕获子线程函数ThreadProc→数据包实时显示以及实时存入SQL数据库。在多线程应用中,子线程函数ThreadProc主要用来抓取数据包,代码设计如下:

DWORD WINAPI CMy812Dlg::ThreadProc1(LPVOID lpParameter)

{

CMy812Dlg * m_dlg=(CMy812Dlg *)lpParameter;

struct pcap_pkthdr *header;//捕获数据包的头

const u_char *pkt_data; //指向常量的指针

int res=-1; //pcap_next_ex的返回值

m_dlg->SetDlgItemText(IDC_STATIC_TIP,"线程开始捕获数据...");

while((res=pcap_next_ex(adhandle,&header,&pkt_data))>=0)//抓取有效包

{

if(res==0)//超时

continue;

m_dlg->SaveData(header,pkt_data);//处理捕获的数据包

}

pcap_close(adhandle);

return 0;

}

具体流程如图4和图5所示。

2.4.2 软件运行结果

本软件需确保安装在本机上的Winpcap安装包,运行结果如图6所示。

3 结语

本文利用VC++6.0开发工具和Winpcap开发包,

实现了监听局域网内所有主机的数据包,并分析了每个包的协议、源/目的IP地址、数据包长度等,可检测网络入侵亦可学习网络协议知识,但分析还不够完善,有待进一步提高。

参考文献参考文献:

[1] 吕雪峰.网络分析技术揭秘[M].北京:机械工业出版社,2012.

[2] 王月辉.基于Winpcap的网络数据包捕获和分析系统的研究与实现[D].沈阳:沈阳工业大学,2007.

[3] 黄培花.基于Winpcap的网络数据包捕获系统设计与实现[J].滨州学院学报,2012,28(6).

[4] 万为清.VC++6.0通过ADO连接数据库的通用方法研究[J].电脑编程技术与维护,2010(16).

责任编辑(责任编辑:孙 娟)

推荐访问:捕获 技术研究 数据包 网络 Winpcap