winpcap使用入门

来源:互联网 发布:算法的配套网站 编辑:程序博客网 时间:2024/04/26 22:25

我自己安装也遇到下面文章中遇到的问题,遂解决之。
来自:http://hi.baidu.com/honeyhacker/blog/item/8cf961965f3a2e6054fb96c3.html
*********************

        打算逐个把snort的源码重新来一遍,第一个问题就是抓包。以前用java或者python抓包的时候,直接导入三方库,非常方便。可是利用c的时候,比较麻烦。首先得安装winpcap安装程序,然后解压winpcap开发包(这两个不是一个东西,一个安装后供一些sniffer软件使用,一个供程序员自己开发sniffer之类的软件)。接着有下面两个步骤:1. 将解压的winpcap开发包里面的include和lib分别添加到vc的环境变量中(工具->选项->目录),2. 添加dll到vc开发环境中(具体的说就是将Packet.lib wpcap.lib添加到工程-设置-连接-对象/库模块里面)。另外网上有人说需要在工程-设置-C++的与处理器定义里面添加"WPCAP",但是我测试后发觉可以添加也可以不添加。

         但是,依照上面设置好了之后,编译开发包自带的程序的时候报错了,错误主要在两个方面:一个是pcap-stdinc.h文件的79行:typedef _W64 unsigned int   uintptr_t; ;另外一个是pcap文件夹下的pcap.h文件的287行:pcap_t *pcap_hopen_offline(intptr_t, char *);。前面一个错误我估摸着是我自己的机器不支持64位,所以直接将该行代码屏蔽掉;后面一个错误有点莫名其妙,出错提示是:identifier intptr_t,网上搜了很久都没有找到其解决方法,然后我直接将该行屏蔽掉,居然ok了!

         在#include"pcap.h"之前,首先得#define HAVE_REMOTE,否则会出错,我猜测原因可能是重复预定义吧。

           测试:从网上找了段代码,获取网卡列表:

#define HAVE_REMOTE

#include "pcap.h"

void main()
{
pcap_if_t *alldevs;
    pcap_if_t *d;
    int i=0;
    char errbuf[PCAP_ERRBUF_SIZE];
   
    /* 获取本地机器设备列表 */
    if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL /* auth is not needed */, &alldevs, errbuf) == -1)
    {
        fprintf(stderr,"Error in pcap_findalldevs_ex: %s/n", errbuf);
        exit(1);
    }
   
    /* 打印列表 */
    for(d= alldevs; d != NULL; d= d->next)
    {
        printf("%d. %s", ++i, d->name);
        if (d->description)
            printf(" (%s)/n", d->description);
        else
            printf(" (No deion available)/n");
    }
   
    if (i == 0)
    {
        printf("/nNo interfaces found! Make sure WinPcap is installed./n");
        return;
    }

    /* 不再需要设备列表了,释放它 */
    pcap_freealldevs(alldevs);

}

通常,获取网卡列表是用PCAP写应用程序的第一步。PCAP提供了pcap_findalldevs()函数来实现这个功能,这个API返回的是一个pcap_if(就是程序中的pcap_if_t)结构的链表,链表的每项内容都含有完整的网卡信息:字段名字和含有名字的描述以及有关驱动的易读信息。

说明一点:我在程序里面用到的是pcap_findalldevs_ex()函数,这个函数需要四个参数,而pcap_findalldevs()函数则只需要后两个参数即可,二者的功能几乎一样。

原创粉丝点击