4.1 功能概述 通过前面的叙述可以知道,这款软件具有的功能,那就是:能够分别捕获局域网中的TCP协议类型数据,UDP协议类型数据和从某一特定的IP地址发送出来的TCP协议类型数据和UDP协议数据类型。并且,将这些捕获出来的数据包的基本信息存入到数据库中,提供给网络管理员使用和进一步的分析。 copyright paper51.com 系统流程图如下图: copyright paper51.com
paper51.com 图10 系统流程图 内容来自www.paper51.com
本系统包括三个基本模块,分别是数据包捕获模块,数据分析模块和数据库模块。其中数据包捕获模块的功能是:利用Winpcap控件,通过网卡设备从网络中捕获数据包;数据分析模块的功能是:主要实现数据的解析,从网络适配器中捕获到的数据的为原始数据(raw data),这些原始数据为二进制格式,必须转化为能比较好明白的格式,这就要求将这些原始数据能按照网络数据传输的具体格式来保存,主要为了能较好的读懂相关的信息,以便使用者分析;数据库模块的功能是:经过前两个模块处理后的数据,现在已经转化成了对我们有用的信息了,而这些信息不可能一直让他存放在内存中,那么就需要在数据库中建立相应的表,把这些信息存贮在这些数据库表的相应列名中,以便使用者处理、使用。 http://www.paper51.com
4.2 系统功能模块的设计 http://www.paper51.com
4.2.1 数据包捕获模块 内容来自www.paper51.com 数据包捕获模块主要用Winpcap软件实现,模块的设计思想遵循Winpcap捕获数据包的流程,流程分三步:查找设备,打开设备和捕获数据的函数。利用WinPcap结构提供的wpcap.dll来开发实现数据包捕获程序。流程图如下: copyright paper51.com http://www.paper51.com 图11数据捕获模块流程图 http://www.paper51.com 这里给出其主要过程: http://www.paper51.com
先确定要在其上进行监测的网络适配器,得到现有的网络适配器的列表和他们的描述,从而获得该NIC的相关信息。 内容来自论文无忧网 www.paper51.com if(pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL,&alldevs,errbuf) == -1) copyright paper51.com { paper51.com MessageBox("查找设备出错","提示"); 内容来自www.paper51.com return; 内容来自论文无忧网 www.paper51.com } http://www.paper51.com
接下来打开所获得的网络适配器,其中pcap_open函数的参数1为上面获得的NIC名称,参数2定义了网络监测程序所捕捉的最大字节数。参数3指示是否将网络适配器设为混杂模式,PCAP_OPENFLAG_PROMISCUOUS表示工作方式为混杂模式。参数4为捕获时间限制,单位为毫秒。参数5为错误信息缓存。该函数负责按照用户指定参数和其它系统默认值初始化WinPcap,并返回会话句柄 http://www.paper51.com //打开设备 paper51.com adhandle= pcap_open(d->name, 内容来自论文无忧网 www.paper51.com 65536, 内容来自www.paper51.com PCAP_OPENFLAG_PROMISCUOUS, paper51.com 1000, 内容来自论文无忧网 www.paper51.com NULL, 内容来自论文无忧网 www.paper51.com errbuf); paper51.com 当网卡已打“打开”并且具体配置好后,就可以进入捕获了。考虑到系统资料的占用等问题,利用了线程来解决此问题,捕获数据是新建一个线程,来实现数据的捕获,再在线程中处理数据的解析和特征码的提取,其中CreateThread函数的参数1为指向SECURITY_ATTRIBUTES结构体的指针,参数2指定线程堆栈大小,参数3指定线程执行函数名称,参数4表示给新线程的参数,参数5为线程指定的更多控制参数,参数6为新线ID。代码如下 内容来自论文无忧网 www.paper51.com //这里创建一个线程来处理数据 内容来自www.paper51.com LPDWORDThID=NULL; http://www.paper51.com m_handle=CreateThread(NULL,0,ThreadProc,this,0,ThID); 内容来自论文无忧网 www.paper51.com if(m_handle==NULL) copyright paper51.com
{ paper51.com
return; 内容来自论文无忧网 www.paper51.com
} http://www.paper51.com //线程处理函数 copyright paper51.com DWORD WINAPIThreadProc( LPVOID lpParameter ) 内容来自www.paper51.com
{ paper51.com
CLjDlg * m_dlg =(CLjDlg *)lpParameter; 内容来自论文无忧网 www.paper51.com structpcap_pkthdr *header; //捕获数据包的头 内容来自论文无忧网 www.paper51.com const u_char*pkt_data; //指向常量的指针 内容来自www.paper51.com int res; //pcap_next_ex的返回值 内容来自论文无忧网 www.paper51.com m_dlg->SetDlgItemText(IDC_STATIC_TIP,"线程开始捕获数据."); http://www.paper51.com while((res=pcap_next_ex(m_dlg->adhandle,&header,&pkt_data))>=0) http://www.paper51.com { copyright paper51.com if(res==0)//超时 内容来自www.paper51.com continue; copyright paper51.com //处理捕获的数据包 http://www.paper51.com m_dlg->SaveDate(header,pkt_data); copyright paper51.com } http://www.paper51.com return 1; copyright paper51.com } paper51.com 4.2.2 数据分析模块实现 内容来自论文无忧网 www.paper51.com 数据分析模块的设计思想是将Winpcap捕获到的数据对应网络数据包的格式进行初始化,取得具体的值。通过相关的转换函数得到相关的信息,具体的函数原型如下:(相关格式见第二章) paper51.com void SaveDate(structpcap_pkthdr * header , const u_char * pkt_data); paper51.com 将网络中捕获的数据包进行格式化 内容来自www.paper51.com 数据分析模块的主要实现数据的解析。从网络适配器中捕获数据的为原始数据(raw data),这些原始数据为二进制格式,必须转化为能比较好明白的格式,这就要求将这些原始数据能按照网络数据传输的具体格式来保存,主要为了能较好的读懂相关的信息,以便使用者分析。 http://www.paper51.com 其流程图如下: paper51.com
http://www.paper51.com 图12数据包分析流程图 内容来自www.paper51.com
数据分析模块实现时,本系统提取的数据包中主要的一些信息,如IP数据包中的IP地址,端口信息等。具体代码下: 内容来自论文无忧网 www.paper51.com
//数据包分析和保存 内容来自论文无忧网 www.paper51.com ipheader* ih; 内容来自论文无忧网 www.paper51.com tcp* tcph; copyright paper51.com udp* udph; http://www.paper51.com CString temp; 内容来自论文无忧网 www.paper51.com int chang; copyright paper51.com
//时间 copyright paper51.com struct tm *ltime; paper51.com
ltime=localtime(&header->ts.tv_sec); 内容来自论文无忧网 www.paper51.com strftime(timestr,sizeof(timestr),"%H:%M:%S",ltime); http://www.paper51.com //IP 内容来自www.paper51.com
ih=(ipheader*)(pkt_data+14);//ip头 内容来自论文无忧网 www.paper51.com intiplen=(ih->ver_ihl & 0xf)*4; 内容来自www.paper51.com
itoa(iplen,IPLength,10); http://www.paper51.com sprintf(IPDateLength,"%d",header->len);//IP数据包长度 内容来自www.paper51.com sprintf(TTL,"%d",ih->ttl);//生存时间 http://www.paper51.com sprintf(SIP,"%d.%d.%d.%d",ih->saddr.byte1,ih->saddr.byte2,ih->saddr.byte3,ih->saddr.byte4); paper51.com sprintf(DIP,"%d.%d.%d.%d",ih->daddr.byte1,ih->daddr.byte2,ih->daddr.byte3,ih->daddr.byte4); 内容来自www.paper51.com u_shortu_sport,u_dport; 内容来自www.paper51.com if(ih->proto== 6 ) //这里是TCP数据包 copyright paper51.com { copyright paper51.com strcpy(proto,"TCP");//协议类型 paper51.com
tcph=(tcp*)((u_char*)ih+ iplen); 内容来自论文无忧网 www.paper51.com u_sport= ntohs(tcph->sport); //源端口 paper51.com u_dport= ntohs(tcph->dport); //目的端口 paper51.com // sprintf(Sport,"%d",tcph->sport);//源端口 http://www.paper51.com // sprintf(Dport,"%d",tcph->dport);//目的端口 http://www.paper51.com chang= (tcph->other ^ 0x0fff) / 1024; copyright paper51.com sprintf(tcp_hLength,"%d",chang);//TCP首部长度 copyright paper51.com sprintf(date,"%X",tcph->content);//TCP数据 内容来自www.paper51.com } paper51.com elseif(ih->proto == 17) //这里是UDP数据包 copyright paper51.com
{ copyright paper51.com strcpy(proto,"UDP"); 内容来自论文无忧网 www.paper51.com udph=(udp*)((u_char*)ih+ iplen); paper51.com u_sport= ntohs(udph->sport); //源端口 paper51.com u_dport= ntohs(udph->dport); //目的端口 内容来自论文无忧网 www.paper51.com // sprintf(Sport,"%d",udph->sport);//源端口 内容来自www.paper51.com // sprintf(Dport,"%d",udph->dport);//目的端口 copyright paper51.com sprintf(udplength,"%d",udph->len);//TCP首部长度 copyright paper51.com sprintf(date,"%X",udph->content);//TCP数据 内容来自www.paper51.com } paper51.com
sprintf(Sport,"%d",u_sport);//源端口 copyright paper51.com sprintf(Dport,"%d",u_dport);//目的端口 paper51.com AccessWrite(ih->proto); copyright paper51.com } 内容来自论文无忧网 www.paper51.com 4.2.3 数据库模块的实现 内容来自www.paper51.com 1.把捕获到的数据包写入数据库中的操作: http://www.paper51.com
相关数据信息捕获分析完毕后,接下来就是对数据的保存。本系统使用的是ado数据库连接方式,ado是Microsoft开发的一个连接数据库方式,由于本系统的使用平台,开发环境都为Microsoft的软件,所以本系统使用ado方式。连接数据库代码如下: paper51.com try paper51.com { copyright paper51.com m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=lj.mdb","","",adModeUnknown);///连接数据库 内容来自www.paper51.com } paper51.com catch(_com_errore)///捕捉异常 内容来自论文无忧网 www.paper51.com { 内容来自论文无忧网 www.paper51.com AfxMessageBox("数据库连接失败,确认数据库lj.mdb是否在当前路径下!"); http://www.paper51.com
returnFALSE; copyright paper51.com } http://www.paper51.com returnTRUE; 内容来自论文无忧网 www.paper51.com 数据包信息写入数据库代码如下: 内容来自论文无忧网 www.paper51.com AccessWrite(int Type) http://www.paper51.com { copyright paper51.com …… paper51.com if(m_bOneIP) //指定IP地址模式 内容来自www.paper51.com { copyright paper51.com m_pRecordset.CreateInstance(__uuidof(Recordset)); 内容来自www.paper51.com m_pRecordset->Open("SELECT* FROM 目标IP",m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText); 内容来自www.paper51.com try 内容来自www.paper51.com { 内容来自论文无忧网 www.paper51.com m_pRecordset->AddNew(); copyright paper51.com
m_pRecordset->PutCollect("时间",_variant_t(timestr)); http://www.paper51.com m_pRecordset->PutCollect("IP首部长度",_variant_t(IPLength)); 内容来自论文无忧网 www.paper51.com m_pRecordset->PutCollect("IP数据包长度",_variant_t(IPDateLength)); paper51.com m_pRecordset->PutCollect("生存时间",_variant_t(TTL)); http://www.paper51.com m_pRecordset->PutCollect("协议类型",_variant_t(proto)); 内容来自www.paper51.com
m_pRecordset->PutCollect("源IP地址",_variant_t(SIP)); 内容来自www.paper51.com m_pRecordset->PutCollect("目的IP地址",_variant_t(DIP)); copyright paper51.com m_pRecordset->PutCollect("源端口",_variant_t(Sport)); paper51.com m_pRecordset->PutCollect("目的端口",_variant_t(Dport)); 内容来自论文无忧网 www.paper51.com } 内容来自论文无忧网 www.paper51.com …… copyright paper51.com
m_pRecordset->Update(); 内容来自www.paper51.com } 内容来自论文无忧网 www.paper51.com catch(_com_error*e) paper51.com { http://www.paper51.com AfxMessageBox(e->ErrorMessage()); 内容来自www.paper51.com
} 内容来自论文无忧网 www.paper51.com return; paper51.com } 内容来自论文无忧网 www.paper51.com } paper51.com |