论文无忧网提供:计算机毕业论文范文|计算机毕业设计|计算机毕业论文
栏目导航 ASP Java Web .NET VB6.0 JAVA VC VF DELPHI PB 计算机网络 计算机科学与技术 PHP 安卓APP 其他 C# 代写论文
当前位置: > 计算机 > 计算机科学与技术 >

局域网抓包软件(论文+程序)

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

------分隔线----------------------------
联系方式