1Libpcap分析文档杨刘2015年2月10日2目录Libpcap分析文档..................................................................................................................................11、Libpcap介绍....................................................................................................................................32、Libpcap的安装.................................................................................................................................43、Libpcap工作原理.............................................................................................................................44、函数功能介绍...................................................................................................................................84.1查找网络设备...........................................................................................................................84.2打开网络设备.........................................................................................................................134.3获取数据包.............................................................................................................................80总结......................................................................................................................................................8331、Libpcap介绍Libpcap是PacketCaptureLibrary的英文缩写,即数据包捕获函数库。该库提供的C函数接口用于捕获及格过指定网络接口的数据包,该接口是被设为混杂模式。大多数网络监控软件都以它为基础,其提供的接口函数实现和封装了与数据包截获相关的过程。Libpcap提供了用户级别的网络数据包捕获接口,并充分考虑到引用程序的可移植性,可以在绝大多数类unix平台下工作。主要功能:数据包捕获:捕获流经网卡的原始数据包自定义数据包发送:构造任何格式的原始数据包流量采集与统计:采集网络中的流量信息规则过滤:提供自带规则过滤功能,按需要选择过滤规则绝大多数的现代操作系统都提供了对底层网络数据包捕获的机制,在捕获机制之上可以建立网络监控(NetworkMonitoring)应用软件。网络监控也常简称为sniffer,其最初的目的在于对网络通信情况进行监控,以对网络的一些异常情况进行调试处理。但随着互连网的快速普及和网络攻击行为的频繁出现,保护网络的运行安全也成为监控软件的另一个重要目的。例如,网络监控在路由器,防火墙、入侵检查等方面使用也很广泛。本文分析了Libpcap在linux下的源代码实现,其中重点是linux的底层包捕获机制。42、Libpcap的安装Libpcap的下载地址:然后切换到下载的目录,解压压缩文件,配置,编译,安装。其命令如下:cd****tarzxvf****./configureMakeMakeinstall配置中如果出现错误,检查是否安装了所有的依赖包bison、m4、GNU、flex以及libpcap-dev。在运行的时候,是需要root权限的。3、Libpcap工作原理作为捕获网络数据包的库,它是一个独立于系统的用户级的API接口,为底层网络检测提供了可移植的框架。从广义的角度上看,一个包捕获机制包含三个主要部分:最底层是针对特定操作系统的包捕获机制,最高层是针对用户程序的接口,第三部分是包过滤机制。不同的操作系统实现的底层包捕获机制可能是不一样的,但从形式上看大同小异。数据包常规的传输路径依次为网卡、设备驱动层、数据链路层、网络层、传输层、应用层。而包捕获机制是在数据链路层增加一个旁路处理,对发送和接收到的数据包做过滤、缓冲等相关处理,最后直接传递5到应用程序。值得注意的是,包捕获机制并不影响操作系统对数据包的网络栈处理。对用户程序而言,包捕获机制提供了一个统一的接口,使用户只需要简单的调用若干函数就能获得所期望的数据包。这样一来,针对特定操作系统的捕获机制对用户透明,使用户程序有比较好的可移植性。包过滤机制是对所捕获到的数据包根据用户的要求进行筛选,最终只把满足过滤条件的数据包传递给用户程序。如图1所示:标题数据包抓取用户层内核层网络接口层上层应用程序上层应用程序调用Libpcap库调用Libpcap库内核缓冲区过滤规则内核缓冲区网络接口网卡驱动网络数据包图1、包捕获机制6Libpcap源代码由20多个C文件构成,但在Linux系统下并不是所有文件都用到。可以通过查看命令make的输出了解实际所用的文件。本文所针对的Libpcap版本号为1.6.2网络类型为常规以太网。Libpcap应用程序从形式上看很简单,其程序框架如图2所示:7查找网络设备打开网络设备获取网络参数编译过滤规则设置过滤器抓取数据关闭网络设备发现可用的网卡,实现的函数为pcap_lookupdev(),如果当前有多个网卡,函数就会返回一个网络设备名的指针列表。利用上一步中的返回值,可以决定使用哪个网卡,通过函数pcap_open_live()打开网卡,返回用于捕捉网络数据包的描述字利用函数pcap_lookupnet(),可以获得指定网络设备的IP地址和子网掩码Lipcap的主要功能就是提供数据包的过滤,函数pcap_compile()来实现在上一步的基础上利用pcap_setfilter()函数来设置函数pcap_loop()和pcap_dispatch()来抓去数据包,也可以利用函数pcap_next()和pcap_next_ex()来完成同样的工作pcap_close()函数关系设备,释放资源图2、程序框架在上面的流程中,通过查找网络设备,打开网络设备,获取网络参数,捕获数据包等操作简单的描述了一个抓包的流程。84、函数功能介绍4.1查找网络设备Libpcap程序的第一步通常是在系统中找到合适的网络设备。网络接口在Linux网络体系中式一个很重要的概念,它是对具体网络硬件设备的一个抽象,在它的下面是具体的网卡驱动程序,而其上则是网络协议层。Linux中最常见的接口设备名eth0和lo。Lo称为回路设备,是一种逻辑意义上的设备,其主要目的是为了调试网络程序之间的通讯功能。Eth0对应实际的物理网卡,在真实网络环境下,数据包的发送和接收都要通过eth0。如果计算机有多个网卡,则还可以有更多的网络接口,如eth1,eth2等等。调用命令ifconfig可以列出当前所有活跃的接口及相关信息,注意对eth0的描述中技有物理网卡的MAC地址,也有网络协议的IP地址。查看文件/proc/net/dev也可以获得接口的信息。Libpcap中检查网络设备中主要使用到的函数如下:char*pcap_lookupdev(char*errbuf)//上面这个函数返回第一个合适的网络接口的字符串指针,如果出错,则errbuf存放出错信息字符串,errbuf至少应该是PCAP_ERRBUF_SIZE个字节长度的char*pcap_lookupdev(errbuf)registerchar*errbuf;{9pcap_if_t*alldevs;/*foroldBSDsystems,includingbsdi3*/#ifndefIF_NAMESIZE#defineIF_NAMESIZEIFNAMSIZ#endifstaticchardevice[IF_NAMESIZE+1];char*ret;if(pcap_findalldevs(&alldevs,errbuf)==-1)return(NULL);if(alldevs==NULL||(alldevs-flags&PCAP_IF_LOOPBACK)){/**Therearenodevicesonthelist,orthefirstdevice*onthelistisaloopbackdevice,whichmeansthere*arenonon-loopbackdevicesonthelist.Thismeans*wecan'treturnanydevice.**XXX-whynotreturnaloopbackdevice?Ifwecan't10*captureonit,itwon'tbeonthelist,andifit's*onthelist,therearen'tanynon-loopbackdevices,*sowhynotjustsupplyitasthedefaultdevice?*/(void)strlcpy(errbuf,nosuitabledevicefound,PCAP_ERRBUF_SIZE);ret=NULL;}else{/**Returnthenameofthefirstdeviceonthelist.*/(void)strlcpy(device,alldevs-name,sizeof(device));ret=device;}pcap_freealldevs(alldevs);return(ret);}pcap_findalldevs_interfaces(alldevsp,errbuf)//获取常规的网络接口11Libpcap调用上面的pcap_lookupdev()函数获得可用网络接口的设备名。首先利用函数pcap_findalldevs_interfaces()查找网络设备接口,其部分源码如下:/**Createasocketfromwhichtofetchthelistofinterfaces,*andfromwhichtofetchIPv4information.*/fd4=socket(AF_INET,SOCK_DGRAM,0);if(fd40){(void)snprintf(errbuf,PCAP_ERRBUF_SIZE,socket:%s,pcap_strerror(errno));return(-1);}//创建socket套接字,为后面的数据传输。/**HowmanyentrieswillSIOCGLIFCONFreturn?*/ifn.lifn_family=AF_UNSPEC;ifn.lifn_flags=0;ifn.lifn_count=0;if(ioctl(fd4,SIOCGLIFNUM,(char*)&ifn)0){(void