180 likes | 481 Views
1.1 libpcap 函数库简介. libpcap 是一种在 linux 开发抓包工具的开发包,可以帮助我们开发出功能强大的网络程序,是开源组织的,在 windows 下叫 winpcap 开发包 libpcap 是一个与实现无关的访问操作系统所提供的分组捕获机制的分组捕获函数库,用于访问数据链路层。在安装了 libpcap 的平台上,以 libpcap 为接口写的程序、应用,能够自由的跨平台使用。
E N D
1.1 libpcap 函数库简介 libpcap是一种在linux开发抓包工具的开发包,可以帮助我们开发出功能强大的网络程序,是开源组织的,在windows下叫winpcap开发包 libpcap是一个与实现无关的访问操作系统所提供的分组捕获机制的分组捕获函数库,用于访问数据链路层。在安装了 libpcap 的平台上,以 libpcap 为接口写的程序、应用,能够自由的跨平台使用。 操作系统所提供的分组捕获机制主要有三种:BPF(Berkeley Packet Filter),DLPI(Data Link Provider Interface),及Linux下的SOCK_PACKET类型套接口。基于 BSD 的系统使用 BPF,基于 SVR4 的系统一般使用DLPI。从文献上看BPF比DLPI性能好很多,而SOCK_PACKET更弱。
1.2 主要接口函数 • 1.2.1 pcap_t *pcap_open_live(char *device, int snaplen,int promisc, int to_ms, char *ebuf) • 功能: 获得用于捕获网络数据包的数据包捕获描述字 • device参数为指定打开的网络设备名。 • snaplen参数定义捕获数据的最大字节数。 • promisc指定是否将网络接口置于混杂模式。 • to_ms参数指定超时时间(毫秒)。 • ebuf参数则仅在pcap_open_live()函数出错返回NULL时用于传递错误消息。
1.2.2 pcap_t *pcap_open_offline(char *fname, char *ebuf) • 功能: 打开以前保存捕获数据包的文件,用于读取。 • fname参数指定打开的文件名。该文件中的数据格式与tcpdump和tcpslice兼容。 • “-”为标准输入。 • ebuf参数则仅在pcap_open_offline()函数出错返回NULL时用于传递错误消息。
1.2.3 pcap_dumper_t *pcap_dump_open(pcap_t *p, char *fname) • 功能: 打开用于保存捕获数据包的文件,用于写入。 • fname参数为“-”时表示标准输出。出错时返回NULL。 • p参数为调用pcap_open_offline()或pcap_open_live()函数后返回的pcap结构指针 • fname参数指定打开的文件名。如果返回NULL,则可调用pcap_geterr()函数获取错误消息。
1.2.4 char *pcap_lookupdev(char *errbuf) • 用于返回可被pcap_open_live()或pcap_lookupnet()函数调用的网络设备名指针。如果函数出错,则返回NULL,同时errbuf中存放相关的错误消息。
1.2.5 int pcap_lookupnet(char *device, bpf_u_int32 *netp,bpf_u_int32 *maskp, char *errbuf) • 功能: 获得指定网络设备的网络号和掩码。 • netp参数和maskp参数都是bpf_u_int32指针。如果函数出错,则返回-1,同时errbuf中存放相关的错误消息。
1.2.6 其他 • int pcap_dispatch(pcap_t *p, int cnt,pcap_handler callback, u_char *user)功能:捕获并处理数据包。 • int pcap_loop(pcap_t *p, int cnt,pcap_handler callback, u_char *user)功能: 基本与pcap_dispatch()函数相同 • void pcap_dump(u_char *user, struct pcap_pkthdr *h,u_char *sp)功能:向调用pcap_dump_open()函数打开的文件输出一个数据包。
int pcap_compile(pcap_t *p, struct bpf_program *fp,char *str, int optimize, bpf_u_int32 netmask)功能:将str参数指定的字符串编译到过滤程序中。 • fp是一个bpf_program结构的指针,在pcap_compile()函数中被赋值。 • optimize参数控制结果代码的优化。 • netmask参数指定本地网络的网络掩码。 • int pcap_setfilter(pcap_t *p, struct bpf_program *fp)功能:指定一个过滤程序。 • fp参数是bpf_program结构指针,通常取自pcap_compile()函数调用。出错时返回-1;成功时返回0。
u_char *pcap_next(pcap_t *p, struct pcap_pkthdr *h)返回指向下一个数据包的u_char指针。 • int pcap_datalink(pcap_t *p)返回数据链路层类型,例如DLT_EN10MB。 • int pcap_snapshot(pcap_t *p)返回pcap_open_live被调用后的snapshot参数值。 • int pcap_is_swapped(pcap_t *p)返回当前系统主机字节与被打开文件的字节顺序是否不同。 • int pcap_major_version(pcap_t *p)返回写入被打开文件所使用的pcap函数的主版本号。 • int pcap_minor_version(pcap_t *p)返回写入被打开文件所使用的pcap函数的辅版本号。
int pcap_stats(pcap_t *p, struct pcap_stat *ps)向pcap_stat结构赋值。成功时返回0。 • FILE *pcap_file(pcap_t *p)返回被打开文件的文件名。 • int pcap_fileno(pcap_t *p)返回被打开文件的文件描述字号码。 • char *pcap_geterr(pcap_t *p)返回最后一个pcap库错误消息。 • void pcap_close(pcap_t *p)关闭p参数相应的文件,并释放资源。 • void pcap_dump_close(pcap_dumper_t *p)关闭相应的被打开文件。
2. libpcap 函数库源码基本架构 • 2.1 打开、读取设备,设置过滤器部分。 • 2.1.1 pcap_read() • 2.1.2 pcap_t * pcap_open_live ( char * device, int snaplen, int promisc, int to_ms, char * errbuf ) • 功能见1.2.1 • 以下为基本格式
/usr/include/pcap.htypedef struct pcap pcap_t;pcap-int.h里定义了struct pcap {}struct pcap{ int fd; int snapshot; int linktype; int tzoff; /* timezone offset */ int offset; /* offset for proper alignment */ struct pcap_sf sf; struct pcap_md md; int bufsize; /* Read buffer */ u_char * buffer; u_char * bp; int cc; u_char * pkt; /* Place holder for pcap_next() */ struct bpf_program fcode; /* Placeholder for filter code if bpf not in kernel. */ char errbuf[PCAP_ERRBUF_SIZE];};
2.1.3 int pcap_setfilter ( pcap_t * p, struct bpf_program * fp ); • 该函数用于设置pcap_compile()解析完毕的过滤规则 • fp参数是bpf_program结构指针,通常取自pcap_compile()函数调用。出错时返回-1;成功时返回0
2.2编译、优化、调试过滤规则表达式部分 • 2.2.1 int pcap_compile ( pcap_t * p, struct bpf_program * fp, char * str, int optimize, bpf_u_int32 netmask ); • 该函数用于解析过滤规则串,填写bpf_program结构。str指向过滤规则串,比如:tcpdump -x -vv -n -t ip proto \\tcp and dst 192.168.8.90 and tcp[13] \& 2 = 2这条过滤规则将捕捉所有携带SYN标志的到192.168.8.90的TCP报文。过滤规则串可以是空串(“”),表示抓取所有过路的报文。 • optimize为1表示对过滤规则进行优化处理。 • netmask指定子网掩码,一般从pcap_lookupnet()调用中获取。返回值小于零表示调用失败。
2.3脱机方式监听部分 • 2.3.1 pcap_open_offline() • 2.3.2 pcap_offline_read () • Libpcap 支持脱机监听。即先将网络上的数据截获下来,存到磁盘上,再以后方便时从磁盘上获取数据来做分析。主要函数为 pcap_open_offline(), pcap_offline_read (),定义在文件 savefile.c 中。
2.4本地网络设置检测部分 • 2.4.1 char * pcap_lookupdev ( char * errbuf );该函数返回一个网络设备接口名,类似libnet_select_device(),对于Linux就是"eth0"一类的名字.失败时返回NULL,errbuf包含了失败原因。errbuf一般定义如下:/usr/include/pcap.h#define PCAP_ERRBUF_SIZE 256char errbuf[ PCAP_ERRBUF_SIZE ]; • 2.4.2 int pcap_lookupnet ( char * device, bpf_u_int32 * netp, bpf_u_int32 * maskp, char * errbuf );该函数用于获取指定网络接口的IP地址、子网掩码。不要被netp的名字所迷惑,它对应的就是IP地址,maskp对应子网掩码。/usr/include/pcap.htypedef u_int bpf_u_int32;显然简单理解成32-bit即可。如果调用失败则返回-1,errbuf包含失败原因。
2.5 主控程序及版本部分 • 2.5.1 pcap_next() • 主控程序所在文件为 pcap.c 。这一文件定义了读数据的对外统一接口 pcap_next(),获取当前错误消息的 pcap_geterr() 等函数。用户无论是用实时还是脱机方式打开设备,都调用 pcap_next() 获取下一个包的数据。 • 版本声明部分为 version.c
linux 下安装libpcap (库)手记 • 一 下载libpcap 库,文件的格式为x.tar.gz • 二 安装 • 1、用 • #tar zxvf x.tat.gz • 命令解压文件到你的当前目录 • 2、进入刚才解开的libpcap目录,执行 • #./configure • 命令,生成Makefile文件 • 3、输入 • #make install • 将生成的库安装到系统默认目录中。此目录为 /usr/lib ,如果需要修改,可以修改文件 Makefile 的 prefix。 • 4、输入 • #make install-incl • 将头文件安装至系统默认目录,/usr/include,修改同上 • 三 使用 • 如果要使用libpcap,一般加入 • #include <pcap.h> • 编译选项: cc .. -lpcap –lsocket ..