打算逐个把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写应用程序的第一步。PCAP提供了pcap_findalldevs()函数来实现这个功能,这个API返回的是一个pcap_if(就是程序中的pcap_if_t)结构的链表,链表的每项内容都含有完整的网卡信息:字段名字和含有名字的描述以及有关驱动的易读信息。 说明一点:我在程序里面用到的是pcap_findalldevs_ex()函数,这个函数需要四个参数,而pcap_findalldevs()函数则只需要后两个参数即可,二者的功能几乎一样。 |