当前位置:  编程语言>c/c++

libpcap工作原理及抓包主要函数介绍

 
    发布时间:2013-9-12  


    本文导语:  libpcap(Packet Capture Library),即数据包捕获函数库,是Unix/Linux平台下的网络数据包捕获函数库。它是一个独立于系统的用户层包捕获的API接口,为底层网络监测提供了一个可移植的框架。一、libpcap工作原理 l...

   接口 iis7站长之家Packet Capture Library),即数据包捕获函数库,是Unix/Linux平台下的网络数据包捕获函数库。它是一个独立于系统的用户层包捕获的API接口,为底层网络监测提供了一个可移植的框架

一、libpcap工作原理

   libpcap主要由两部份组成:网络分接头(Network Tap)和数据过滤器(Packet Filter)。网络分接头从网络设备驱动程序中收集数据拷贝,过滤器决定是否接收该数据包。Libpcap利用BSD Packet Filter(BPF)算法网卡接收到的链路层数据包进行过滤。BPF算法的基本思想是在有BPF监听的网络中,网卡驱动将接收到的数据包复制一份交给BPF过滤器,过滤器根据用户定义的规则决定是否接收此数据包以及需要拷贝该数据包的那些内容,然后将过滤后的数据给与过滤器相关联的上层应用程序。

libpcap的包捕获机制就是在数据链路层加一个旁路处理。当一个数据包到达网络接口时,libpcap首先利用已经创建的Socket从链路层驱动程序中获得该数据包的拷贝,再通过Tap函数将数据包发给BPF过滤器。BPF过滤器根据用户已经定义好的过滤规则对数据包进行逐一匹配,匹配成功则放入内核缓冲区,并传递给用户缓冲区,匹配失败则直接丢弃。如果没有设置过滤规则,所有数据包都将放入内核缓冲区,并传递给用户层缓冲区。

二、libpcap的抓包函数介绍

pcap_lookupdev()函数用于查找网络设备,返回可被pcap_open_live()函数调用的网络设备名指针

pcap_open_live()函数用于打开网络设备,并且返回用于捕获网络数据包的数据包捕获描述字。对于此网络设备的操作都要基于此网络设备描述字。

pcap_lookupnet()函数获得指定网络设备的网络号和掩码。

pcap_compile()函数用于将用户制定的过滤策略编译到过滤程序中。

pcap_setfilter()函数用于设置过滤器。

pcap_loop()函数pcap_dispatch()函数用于捕获数据包,捕获后还可以进行处理,此外pcap_next()和pcap_next_ex()两个函数也可以用来捕获数据包。

pcap_close()函数用于关闭网络设备,释放资源


  其实pcap的应用程序格式很简单,总的来说可以可以分为以下5部分:

1.我们从决定用哪一个接口进行嗅探开始。在Linux中,这可能是eth0,而在BSD系统中则可能是xl1等等。我们也可以用一个字符串来定义这个设备,或者采用pcap提供的接口名来工作。

2.初始化pcap。在这里我们要告诉pcap对什么设备进行嗅探。假如愿意的话,我们还可以嗅探多个设备。怎样区分它们呢?使用 文件句柄。就像打开一个文件进行读写一样,必须命名我们的探“会话”,以此使它们各自区别开来。

3.假如我们只想嗅探特定的传输(如TCP/IP包,发往端口23的包等等),我们必须创建一个规则集合,编译并且使用它。这个过程分为三个相互紧密关联的阶段。规则集合被置于一个字符串内,并且被转换成能被pcap读的格式(因此编译它)。编译实际上就是在我们的程序里调用一个不被外部程序使用的函数。接下来我们要告诉 pcap使用它来过滤出我们想要的那一个会话。

4.最后,我们告诉pcap进入它的主体执行循环。在这个阶段内pcap一直工作到它接收了所有我们想要的包为止。每当它收到一个包就调用另一个已经定义好的函数,这个函数可以做我们想要的任何工作,它可以剖析所部获的包并给用户打印出结果,它可以将结果保存为一个文件,或者什么也不作。

5.在嗅探到所需的数据后,我们要关闭会话并结束。


三、代码示例


/*
http://www. 发布
文件名:test.c
*/
#include "stdlib.h"
#include "stdio.h"
#include "pcap.h"
/* callback function that is passed to pcap_loop(..) and called each time
* a packet is recieved                                                    */
void my_callback(u_char *useless,const struct pcap_pkthdr* pkthdr,const u_char*
        packet)
{
    static int count = 1;
    fprintf(stdout,"%d, ",count);
    if(count == 4)
        fprintf(stdout,"Come on baby sayyy you love me!!! ");
    if(count == 7)
        fprintf(stdout,"Tiiimmmeesss!! ");
    fflush(stdout);
    count++;
}
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;     /* pcap.h */
    struct ether_header *eptr;  /* net/ethernet.h */
    if(argc != 2){ fprintf(stdout,"Usage: %s numpacketsn",argv[0]);return 0;}
    /* grab a device to peak into... */
    dev = pcap_lookupdev(errbuf);
    if(dev == NULL)
    { printf("%sn",errbuf); exit(1); }
    /* open device for reading */
    descr = pcap_open_live(dev,BUFSIZ,0,-1,errbuf);
    if(descr == NULL)
    { printf("pcap_open_live(): %sn",errbuf); exit(1); }
    /* allright here we call pcap_loop(..) and pass in our callback function */
    /* int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user)*/
    pcap_loop(descr,atoi(argv[1]),my_callback,NULL);
    fprintf(stdout,"nDone processing packets... wheew!n");
    return 0;
}


编译命令: gcc -o pcap_1 pcap_1.c -lpcap

注意: 编译时一定要加上-lpcap

实例代码在centos 5.4上测试通过。


  • 本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载,整理或搜集自网络.欢迎任何形式的转载,转载请注明出处.
    转载请注明:文章转载自:[169IT-IT技术资讯]
    本文标题:libpcap工作原理及抓包主要函数介绍
相关文章推荐:
  • 使用libpcap读取tcpdump抓取的文件并解析c代码实例
  • libpcap --- No rule to make target `pcap-@V_PCAP@.o', needed by `libpcap.a`
  • 如何利用libpcap和Python嗅探数据包
  • (菜鸟飞飞)tcpdump和libpcap有啥区别?
  • 使用libpcap实现抓包程序的步骤及代码示例
  • HELP! Libpcap与iptables之间的区别!
  • c语言基于libpcap实现一个抓包程序过程
  • 求助libpcap 和 libnids 编程问题
  • 请教菜鸟问题 libpcap达人路过看看
  • libpcap和libnotify
  • libpcap编译问题
  • libpcap怎么设置过滤规则!我怎么老是抓到自己的包
  • libpcap
  • libpcap中的pcap_parse()定义
  • 关于用Libpcap过滤报文
  • 关于libpcap的Documention问题!
  • 高手请指教:libpcap的pcap_pkthdr结构
  • libpcap的安装
  • Linux/ubuntu系统平台下安装Libpcap问题
  • 关于libpcap的使用问题
  • libpcap安装


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3