WinPcap SDK可以很方便的帮助程序员设计抓包等程序,官方的WinPcap程序,可以在www.winpcap.org下载,并且可以找到很多的例子和函数以及其语法。
具体的抓包流程:
1.先找到网卡设备,使用的函数是,pcap_findalldevs
2.如果是有多个网卡,就要自己选择有网络数据的那个网卡了,其实也就是写一个循环,让指针地址转到所要侦听的那个网卡设备上即可。
for(d=alldevs,i=0;i<inum-1;d=d->next,++i)
3.找到网卡设备之后,打开网卡设备
pcap_t* pcap_open_live(const char*,int,int,int,char*)
第一个参数,即是要侦听的网卡名字,可以由 d->name获得
第二个参数,即是最大的包的大小,
第三个参数,模式选择,一般是混杂模式:1或者PCAP_OPENFLAGPROMISCUOUS
第四个参数,即为超时时间设置,单位为微秒,若要想设为1秒,则填上1000
第五个参数,是错误信息缓冲区,char* errbuff。
打开网卡,之后返回一个pcap_t *指针的句柄
3.检查数据链路层
pcap_datalink(用pcap_open_live返回的句柄)
4.设置过滤条件,编译过滤条件
int pcap_compile(pcap_t*p, struct bpf_program *fp, char *str,int optimize,bpf_u_int32 netmask)
第一个参数即为,open_live返回的句柄
第二个参数即为,由bpf_program结构体定义的fcode
第三个参数即为,由用户输入的过滤条件,具体的语法在官网(www,winpcap.org)上面有很多的说明和例子
第四个参数即为,优化,一般为1
第五个参数即为,子网掩码,这个很容易获得,在所选择的网卡d的addresses里面就有,d->addresses->netmask,
5.设置过滤器pcap_setfilter函数,pcap_setfilter(open_live返回的句柄,结构体fcode的指针)
6.接下来循环接收信息即可
7.最后不要忘了要释放网卡信息。pcap_freealldevs()