手把手教你捕获数据包(下)【数据包的游戏系列之二】

原创 2004年06月23日 21:14:00

B. 打开相应网卡并设置为混杂模式:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

   在此之前肯定要有一段让用户选择网卡、并获得用户选择的网卡的名字的代码,既然上面已经可以获得所有网卡的名字了,这段代码就暂且略过了。

   我们主要是要用到 pcap_open_live 函数,不过这个函数winpcap的开发小组已经建议用pcap_open 函数来代替,不过因为我的代码里面用的就是pcap_open_live,所以也不便于修改了,不过pcap_open_live使用起来也是没有任何问题的,下面是pcap_open_live的函数声明:

 /*************************************************

pcap_t* pcap_open_live  (  char *    device, 

                             int    snaplen, 

  int    promisc, 

  int    to_ms, 

  char *    ebuf

 )  

     功能:

           根据网卡名字打开网卡,并设置为混杂模式,然后返回其句柄

     参数:

           Device  : 就是前前面我们获得的网卡的名字;

           Snaplen :  我们从每个数据包里取得数据的长度,比如设置为100,则每次我们只是获得每个数据包 100 个长度的数据,没有什么特殊需求的话就把它设置为65535最大值就可以了;

           Promisc:这个参数就是设置是否把网卡设置为“混杂模式”,设置为 1 即可;

           to_ms :   超时时间,毫秒,一般设置为 1000即可。

     返回值:

           pcap_t :  类似于一个网卡“句柄”之类的,不过当然不是,这个参数是后面截获数据要用到的。

******************************************************************************/

虽然看起来比较复杂,不过用起来还是非常简单的,其实 1 行就OK了:

    pcap_t* adhandle;

       char errbuf[PCAP_ERRBUF_SIZE];

// 打开网卡,并且设置为混杂模式

// pCardName是前面传来的网卡名字参数

adhandle = pcap_open_live(pCardName,65535,1,1000,errbuf);

 

C. 截获数据包并保存为文件:------------------------------------------------------

     当然,不把数据包保存为文件也可以,不过如果不保存的话,只能在截获到数据包的那一瞬间进行分析,转眼就没了^_^

所以,为了便于日后分析,所以高手以及我个人经常是把数据包保存下来的慢慢分析的。

但是注意网络流量,在流量非常大的时候注意硬盘空间呵呵,常常几秒中就有好几兆是很正常的事情。

下面首先来详细讲解一下,这个步骤中需要用到的winpcap函数:

/**************************************************************

pcap_dumper_t* pcap_dump_open  (  pcap_t *    p, 

                                      const char *    fname

 )

功能:

      建立或者打开存储数据包内容的文件,并返回其句柄

参数:

       pcap_t *    p     :前面打开的网卡句柄;

      const char * fname :要保存的文件名字   

返回值:

       pcap_dumper_t* 保存文件的描述句柄,具体细节我们不用关心

***************************************************************/

/***************************************************************

int pcap_next_ex          (  pcap_t *    p, 

                              struct pcap_pkthdr **    pkt_header, 

  u_char **    pkt_data

 )  

功能:

      从网卡或者数据包文件中读取数据内容

参数:

      pcap_t *    p:    网卡句柄

      struct pcap_pkthdr ** pkt_header: 并非是数据包的指针,只是与数据包捕获驱动有关的一个Header

      u_char ** pkt_data:指向数据包内容的指针 ,包括了协议头  

返回值:

          1 : 如果成功读取数据包

          0 pcap_open_live()设定的超时时间之内没有读取到内容

          -1: 出现错误

          -2: 读文件时读到了末尾

***************************************************************/

/***************************************************************

void pcap_dump  (  u_char *    user, 

                       const struct pcap_pkthdr *    h, 

  const u_char *    sp

 )   

功能:

      将数据包内容依次写入pcap_dump_open()指定的文件中

参数:

      u_char * user   :  网卡句柄

      const struct pcap_pkthdr * h: 并非是数据包的指针,只是与数据包捕获驱动有关的一个Header

      const u_char * sp 数据包内容指针    

返回值:

          Void

****************************************************************/

 下面给出一段完整的捕获数据包的代码,是在线程中写的,为了程序清晰,我去掉了错误处理代码以及线程退出的代码,完整代码可下载文后的示例源码,老规矩,重要的步骤用粗体字标出。

我们实际在捕获数据包的时候也最好是把代码放到另外的线程中。

/*********************************************************

*   进程:

*                   这个是程序的核心部分,完成数据包的截获

*     参数:

*                   pParam: 用户选择的用来捕获数据的网卡的名字

*********************************************************/

UINT CaptureThread(LPVOID pParam)

{

       const char* pCardName=(char*)pParam;          // 转换参数,获得网卡名字                       

 

       pcap_t* adhandle;

       char errbuf[PCAP_ERRBUF_SIZE];             

       // 打开网卡,并且设置为混杂模式

 adhandle=pcap_open_live(pCardName,65535,1,1000,errbuf)      {

 

       pcap_dumper_t* dumpfile;

// 建立存储截获数据包的文件

       dumpfile=pcap_dump_open(adhandle, "Packet.dat");   

 

       int re;

       pcap_pkthdr* header;      // Header

       u_char* pkt_data;         // 数据包内容指针

// 从网卡或者文件中不停读取数据包信息

       while((re=pcap_next_ex(adhandle,&header,(const u_char**)&pkt_data))>=0)

      {

          // 将捕获的数据包存入文件

              pcap_dump((unsigned char*)dumpfile,header,pkt_data);     

       }

       return 0;

}  

将个线程加入到程序里面启动以后。。。等等,如何来启动这个线程就不用我说了吧,类似这样的代码就可以

::AfxBeginThread(CaptureThread,chNIC);     // chNIC是网卡的名字,char* 类型

启动线程一段时间以后(几秒中就有效果了),可以看到数据包已经被成功的截获下来,并存储到程序目录下的Packet.dat文件中。

=====================================================

至此,数据包的截获方法就讲完了,大家看了这篇文章,其实你就一定也明白了,无论是raw socket的方法还是winpcap的方法,其实都很简单的,真的没有什么东西,只是会让不明白原理的人看起来很神秘而已,isn’t it?

呵呵,不过也不要高兴的太早,这个保存下来的数据包文件,你可以试着用UltraEdit打开这个文件看看,是不是大部分都是乱码?基本上没有什么可读性,这是因为:

此时捕获到的数据包并不仅仅是单纯的数据信息,而是包含有 IP头、 TCP头等信息头的最原始的数据信息,这些信息保留了它在网络传输时的原貌。通过对这些在低层传输的原始信息的分析可以得到有关网络的一些信息。由于这些数据经过了网络层和传输层的打包,因此需要根据其附加的帧头对数据包进行分析。

呵呵,所以我们要走的路还很长,这只是刚刚入门而已^_^

请期待本系列的下一部拙作

《手把手教你分析数据包》

本文的源码也将在下一文中一起发布

 

                                                                                                                 --------  Made In DLUT | DIP

                                                                                                                   --------  Finished at <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />2004-06-23

IP数据包长度问题总结

首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层。    其中以太网(Ethernet)的数据帧在链路层    IP包在网络层    TCP或UDP包在传输层    TCP...
  • sz_liao
  • sz_liao
  • 2015年03月04日 11:20
  • 1861

wireshark捕获指定ip地址数据包

显示过滤:wireshark过滤经过指定ip的数据包 显示过滤可以完整的复现测试时的网络环境,但会产生较大的捕获文件和内存占用。 ip.addr ==192.168.1.1 //显示所有目标或源地...
  • baidu_18607183
  • baidu_18607183
  • 2016年06月06日 11:24
  • 6278

手把手教你捕获数据包(上)【数据包的游戏系列之二】

手把手教你捕获数据包(上)【数据包的游戏系列之二】     经常看到论坛有人问起关于数据包的截获、分析等问题,幸好本人也对此略有所知,也写过很多的 sniffer ,所以就想写一系列的文章来详细深入的...
  • yuntongsf
  • yuntongsf
  • 2009年11月18日 15:42
  • 396

手把手教你捕获数据包(上)【数据包的游戏系列之二】

前   言      经常看到论坛有人问起关于数据包的截获、分析等问题,幸好本人也对此略有所知,也写过很多的sniffer,所以就想写一系列的文章来详细深入的探讨关于数据包的知识。 我希望通过这一系...
  • PiggyXP
  • PiggyXP
  • 2004年06月23日 21:10
  • 16963

捕获IP数据包的Java类Jpcap

Jpcap是为JAVA编写的类包,提供很多类和接口,能够获得IP数据包。  *Description   Jpcap is a Java class package which enables to ...
  • arui319
  • arui319
  • 2005年06月02日 20:36
  • 5391

IP数据包长度问题总结

这篇文章总结的不错,转自:http://hi.baidu.com/to_wait/blog/item/3e855931a5a51717eac4af22.html 首先要看TCP/IP协议,涉...
  • lizzywu
  • lizzywu
  • 2014年07月18日 16:33
  • 1162

手把手教你玩转ARP包(一)【数据包的游戏系列之一】

前   言          首先要感谢网络安全资深专家卢湖川博士以及VC网络版的limin朋友提供的资料以及帮助^_^经常看到论坛有人问起关于数据包的截获、分析等问题,幸好本人也对此略有所知,所以就...
  • PiggyXP
  • PiggyXP
  • 2004年05月31日 11:40
  • 19970

手把手教你捕获数据包

 一.捕获数据包的实现原理:在通常情况下,网络通信的套接字程序只能响应与自己硬件地址相匹配的或是以广播形式发出的数据帧,对于其他形式的数据帧比如已到达网络接口但却不是发给此地址的数据帧,网络接口在验证...
  • wxdvc
  • wxdvc
  • 2009年02月22日 17:21
  • 401

C++捕获IP包 监控IP包流量

计网课设 ,捕获所有流经本机网卡的IP包,并监控流量,c++&QT,内容保存在文件里,写的比较简单,有时间会加上对IP包的解析。 要求:编程监控网络,捕获一段时间内网络上的 IP 数据包,按 IP ...
  • carlylll
  • carlylll
  • 2017年11月13日 14:09
  • 788

IP包流量分析程序

使用套接字编程实现捕获一段时间内以本机为源地址或目的地址的IP数据包(不包括以广播形式发出的数据包),统计IP数据包的信息,列出本机与其他主机之间不同协议类型IP数据包的数量 及流量。以源地址  目的...
  • zhangxiaofangtongxue
  • zhangxiaofangtongxue
  • 2015年07月23日 22:33
  • 1672
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:手把手教你捕获数据包(下)【数据包的游戏系列之二】
举报原因:
原因补充:

(最多只允许输入30个字)