你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:杂志经典 / 网络与通信
使用Winpcap开发网络数据包分析器(八)
 

/*数据包捕获线程*/

UINT do_capture(LPVOID pParam)

{

  char errbuf[PCAP_ERRBUF_SIZE];

  pcap_t *fp;

  int res;

  struct pcap_pkthdr *header;

  const u_char *pkt_data;

  CString str;

  unsigned int i;

  struct packetstru *cur_pack,*new_pack;

  char s[100];

  CStatic *static1,*static2;

  int found;

 

  static1=(CStatic *)AfxGetMainWnd()->GetDlgItem(IDC_STATIC1);

  static2=(CStatic *)AfxGetMainWnd()->GetDlgItem(IDC_STATIC2);

  fp = pcap_open_live(*devicename,65536,1,-1,errbuf);  //打开网络设备

  while(1)

  {

    if(captureflag==0)

         break;

    res = pcap_next_ex( fp, &header, &pkt_data);  //读数据包

       if(res==0)  //超时返回

       {

         Sleep(1);

         continue;

       }

       if(res<0)  //发生错误

       {

         break;

       }

       if(res==1)  //读数据包成功

       {

         //只捕获本网络设备发出或发给本网络设备的TCP包或UDP

         found=0;

          if(pkt_data[0]==macaddress[0]&&pkt_data[1]==macaddress[1]&&

pkt_data[2]==macaddress[2]&&pkt_data[3]==macaddress[3]&&

pkt_data[4]==macaddress[4]&&pkt_data[5]==macaddress[5]||

pkt_data[6]==macaddress[0]&&pkt_data[7]==macaddress[1]&&

pkt_data[8]==macaddress[2]&&pkt_data[9]==macaddress[3]&&

pkt_data[10]==macaddress[4]&&pkt_data[11]==macaddress[5])

         {

              if(pkt_data[12]==0x08&&pkt_data[13]==0x00)

              {

                if(pkt_data[23]==0x06||pkt_data[23]==0x11)

                     found=1;

              }

      if(pkt_data[12]==0x88&&pkt_data[13]==0x64&&

pkt_data[20]==0x00&&pkt_data[21]==0x21)

              {

                if(pkt_data[31]==0x06||pkt_data[31]==0x11)

                     found=1;

              }

         }

         if(found==1)

         {

                //目标MAC为本网卡MAC,则入包计数加1        if(macaddress[0]==pkt_data[0]&&macaddress[1]==pkt_data[1]&&

macaddress[2]==pkt_data[2]&&macaddress[3]==pkt_data[3]&&

macaddress[4]==pkt_data[4]&&macaddress[5]==pkt_data[5])

              {

                incount++;

              }

              //MAC为本网卡MAC,则出包计数加1

if(macaddress[0]==pkt_data[6]&&macaddress[1]==pkt_data[7]&&

macaddress[2]==pkt_data[8]&&macaddress[3]==pkt_data[9]&&

macaddress[4]==pkt_data[10]&&macaddress[5]==pkt_data[11])

              {

                outcount++;

              }

           sprintf(s,"出包:%lu",outcount);

           static1->SetWindowText(s);

           sprintf(s,"入包:%lu",incount);

           static2->SetWindowText(s);

              //找到数据包链表的末尾

           cur_pack=allpacket;

           while(1)

              {

                if(cur_pack->next==NULL)

                  break;

                cur_pack=cur_pack->next;

              }

              //为捕获到的数据包生成新节点,并加至数据包链表末尾

           new_pack=new packetstru;

           new_pack->datalen=header->len;

           for(i=1;i<=header->len;i++)

             new_pack->data[i-1]=pkt_data[i-1];

           new_pack->clearflag=0;

              new_pack->showflag=1;

           new_pack->tick=GetTickCount();

           new_pack->next=NULL;

        cur_pack->next=new_pack;

         }

       }

  }

  pcap_close(fp);  //关闭网络设备

  return 0;

}

使用一个CListCtrl控件显示捕获到的数据包。包括数据包序号、长度、源IP、目标IP、摘要、捕获TICK。使用一个CEdit控件显示捕获到的数据包内容(以16进制表示)。使用另一个CEdit控件显示数据包头解析信息。

捕获到的数据包可存在文件中,也可从文件中取捕获到的数据包。该文件为一文本文件,结构如下:

设备名称:\Device\NPF_{1A922FF5-9D69-40EF-BC72-08784F3B6BD8}

长度:83  时间:12285937

00 30 88 10 87 0d 00 19 db 6d 37 98 88 64 11 00

20 76 00 3f 00 21 45 00 00 3d 48 d3 00 00 80 11

62 1b dc 73 e5 e7 dc 73 f0 f2 08 a0 00 35 00 29

c0 81 70 04 01 00 00 01 00 00 00 00 00 00 03 77

77 77 07 77 69 6e 70 63 61 70 03 6f 72 67 00 00

01 00 01

-----------------------------------------------

以下省去

文件第一行为网络设备名。每个数据包第一行为数据包长度和捕获时间信息,下面是16进制表示的数据包内容,每个数据包以

” -----------------------------------------------“作为结束标志。

程序还提供对捕获到数据包进行查找的功能,可按MAC地址、IP地址、端口号为条件查找符合要求的数据包。

三、           结论

在对数据包结构进行分析的基础上,并且合理使用了Winpcap提供给我们的

函数,开发完成了一个网络数据包分析器。程序功能虽不能和专业的数据包捕获软件,如Sniffer相比,但是一般情况下,也足可以满足需求了。

参考文献

[1]王石.局域网安全与攻防-基于Sniffer Pro实现.电子工业出版社,2007

[2]L.Mamakos.RFC2516. A Method for Transmitting PPP Over Ethernet (PPPoE),1999
  推荐精品文章

·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录
·2023年10月目录
·2023年9月目录 
·2023年8月目录 

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089