libpcap是c语言的一个库,主要是用来网络中以太网的数据包的,这个库一般是需要单独安装的,下载地址:http://sourceforge.net/projects/libpcap/
安装后,查手册的时候man 3 pcap就行了
好了,现在我们就来简单的使用一下吧:)
先介绍几个它的函数:
char *pcap_lookupdev(char *errbuf)
这个函数主要是用来返回一个网络设备名的指针,一般在你的机器上大多情况是eth0(linux下),参数errbuf是存放相关错误消息的.
int pcap_lookupnet(const char *device, bpf_u_int32 *netp,
bpf_u_int32 *maskp, char *errbuf)
这个函数是用来获得指定的网络设备的IP地址和掩码,其中netp和maskp就分别放IP和掩码用的,errbuf是出错消息存放处.
pcap_t *pcap_open_live(const char *device, int snaplen,
int promisc, int to_ms, char *errbuf)
这个函数用于获得数据包捕获描述符字,也就是说从参数device指定打开该设备以获得捕获包描述符字.snaplen 表示数据包捕获时的最大字节数,promisc表示设置网卡模式,设置为混杂模式或者为普通模式.to_ms 表示超时时间,errbuf出错信息存储
int pcap_compile(pcap_t *p, struct bpf_program *fp,
char *str, int optimize, bpf_u_int32 netmask)
该函数用于编译过滤规则,str是指过滤规则,fp就是规则结构,主要是根据str串中的内容来给fp这个结构初始话,optimize用来设置是否对结果进行优化,netmask表示掩码.
int pcap_setfilter(pcap_t *p, struct bpf_program *fp)
该函数用来指定一个过滤规则,fp是前面使用pcap_compile后得到的结果,在程序运行的时候就会按照指定的这个规则来捕获符合要求的数据包,不服和的就丢弃
int pcap_loop(pcap_t *p, int cnt,
pcap_handler callback, u_char *user)
该函数就是用来捕获数据包时用的,当捕获了符合要求的数据包之后就交给回调函数callback来进行下一步处理.其中p就是前面获得的数据包捕获描述符字,cnt表示捕获数据包的个数,-1表示无限,callback就是回调函数,user通常设置为空.
好了,我们来看一个例子吧
#include "pcap.h"
#include "stdio.h"
#include "stdlib.h"
#include "errno.h"
#include "sys/socket.h"
#include "netinet/in.h"
#include "arpa/inet.h"
#include "netinet/if_ether.h"
/* 回调函数 */
void my_callback(u_char *useless,const struct pcap_pkthdr *pkthdr,const u_char *packet)
{
printf("I have got a packet /n");
}
int main(int argc,char *argv[])
{
int i;
char *dev;
char errbuf[PCAP_ERRBUF_SIZE];
pcap_t *descr;
const u_char *packet;
struct pcap_pkthdr hdr;
struct ether_header *eptr;
struct bpf_program fp;
bpf_u_int32 maskp;
bpf_u_int32 netp;
if(argc != 2)
{
fprintf(stdout,"Usage : %s /"filter program/"/n",argv[0]);
return 0;
}
dev = pcap_lookupdev(errbuf);
if (dev == NULL)
{
fprintf(stderr,"%s/n",errbuf);
exit(1);
}
pcap_lookupnet(dev,&netp,&maskp,errbuf);
descr = pcap_open_live(dev,BUFSIZ,1,-1,errbuf);
if (descr == NULL)
{
printf("pcap_open_live():%s/n",errbuf);
exit(1);
}
if (pcap_compile(descr,&fp,argv[1],0,netp) == -1)
{
fprintf(stderr,"Error calling pcap_compile/n");
exit(1);
}
if (pcap_setfilter(descr,&fp) == -1)
{
fprintf(stderr,"Error setting filter/n");
exit(1);
}
pcap_loop(descr,5,my_callback,NULL);
return 0;
}
编译:gcc -o example example.c -lpcap
运行:例如./example "host www.163.com"
或端口./example "port 80"等方式
过滤规则可以在google搜索bpf过滤规则,有时间我再补上吧,嘿嘿
好了,这样就算完成了,就等这捕获数据包吧:)要想写一个复杂的sniffer,那还是仔细的看看这个库吧