网络安全 频道

手把手教你捕获数据包

2.winpcap的实现方法:-----------------------------------------------------------------------
winpcap驱动包,是我们玩转数据包不可或缺的好东东,winpcap的主要功能在于独立于主机协议(如TCP-IP)而发送和接收原始数据报,主要为我们提供了四大功能:
功能:

1> 捕获原始数据报,包括在共享网络上各主机发送/接收的以及相互之间交换的数据报;

2> 在数据报发往应用程序之前,按照自定义的规则将某些特殊的数据报过滤掉;

3> 在网络上发送原始的数据报;

4> 收集网络通信过程中的统计信息
如果环境允许的话(比如你做的不是木马程序),我还是推荐大家用winpcap来截获数据包,因为它的功能更强大,工作效率更高,唯一的缺点就是在运行用winpcap开发的程序以前,都要在主机上先安装winpcap的driver。
而且一会我们就会发现它比raw socket功能强大的多,而且工作得更为底层,最明显的理由就是raw socket捕获的数据包是没有以太头的,此乃后话。
至于怎么来安装使用,请参考本系列的系列一《手把手教你玩转ARP包中的》,里面有详细的加载winpcap驱动的方法^_^
废话不多说了,让我们转入正题, 具体用winpcap来截获数据包需要做如下的一些工作:
A . 枚举本机网卡的信息(主要是获得网卡的名称)
   其中要用到pcap_findalldevs函数,它是这样定义的

   /*************************************************
int pcap_findalldevs  (  pcap_if_t **    alldevsp, 
                             char *    errbuf
                          ) 
功能:
        枚举系统所有网络设备的信息
参数:  alldevsp:  是一个pcap_if_t结构体的指针,
如果函数pcap_findalldevs函数执行成功,
将获得一个可用网卡的列表,而里面存储的就是第一个元素的指针。
             Errbuf:    存储错误信息的字符串
     返回值: int :   如果返回0 则执行成功,错误返回 -1。
  ************************************************/
   我们利用这个函数来获得网卡名字的完整代码如下:
 
       pcap_if_t* alldevs;
       pcap_if_t* d;
       char errbuf[PCAP_ERRBUF_SIZE];
       pcap_findalldevs(&alldevs,errbuf);  // 获得网络设备指针
       for(d=alldevs;d;d=d->next)          // 枚举网卡然后添加到ComboBox中
       {
d->name; //d->name就是我们需要的网卡名字字符串,按照你自己的需要保存到你的相应变量中去
       }
pcap_freealldevs(alldevs);             // 释放alldev资源

B. 打开相应网卡并设置为混杂模式:
   在此之前肯定要有一段让用户选择网卡、并获得用户选择的网卡的名字的代码,既然上面已经可以获得所有网卡的名字了,这段代码就暂且略过了。
   我们主要是要用到 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. 截获数据包并保存为文件:------------------------------------------------------
     当然,不把数据包保存为文件也可以,不过如果不保存的话,只能在截获到数据包的那一瞬间进行分析,转眼就没了^_^
所以,为了便于日后分析,所以高手以及我个人经常是把数据包保存下来的慢慢分析的。
0
相关文章