libpcap的简单应用

一、什么是libpcap及pcap的嗅探器程序的总体框架

 libpcap(Packet Capture Library),即数据包捕获函数库。在网络包抓取中libpcap是非常常用的一个库,著名的tcpdump就是用它来实现的。libpcap是一个 与实现无关的访问操作系统所提供的分组捕获函数库,用于访问数据链路层。这个库为不同的平台提供了一致的C函数编程接口,在安装了 libpcap 的平台上,以 libpcap 为接口写的程序、应用,能够自由地跨平台使用。它支持多种操作系统。

基于pcap的嗅探器程序的总体架构,其流程如下:

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

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

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

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

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

二、libpcap的相关函数

  1. int pcap_findalldevs (pcap_if_t **alldevsp, char *errbuf)

    构造一个可打开的网络设备的列表

    -1表示错误,buf中会有错误消息;0表示成功。能被查找到的设备是能被打开的设备。

  2. pcap_lookupdev(errbuf)通过该函数可以让系统自动寻找设备,其中errbuf为错误信息

  3. pcap_t *pcap_open_live(char *device, int snaplen, int promisc, int to_ms, char *ebuf)

    1. 第一个参数为我们设置的设备

    2. 第二个参数为我们的最大抓包长度65535可以满足大多数的应用

    3. 第三个模式为是否选择混杂模式,选择混杂模式可以捕捉所有包,如发向它的,从它发出的,或经它路由的等都会被嗅探器捕捉。

    4. 第四个参数为抓包的超时时间

  4. 过滤器的编译及使用由pcap_compile()与pcap_setfilter()这两个函数完成。在本文中不做使用

  5. 实际的抓包

    1.  u_char *pcap_next(pcap_t *p, struct pcap_pkthdr *h)——捕捉单个包

      1. 第一个参数代表设备句柄

      2. 第二个参数是指向一个包括了当前数据包总体信息(被捕捉时的时间,包的长度,其被指定的部分长度)的结构体的指针(在这里只有一个片断,只作为一个示例)。pcap_next()返回一个u_char指针给被这个结构体描述的包

    2. int pcap_loop(pcap_t * p,int cnt, pcap_handler callback, uchar * user)——捕获数据包,不会响应pcap_open_live()函数设置的超时时间

      1. 第一个参数代表设备句柄

      2. cnt用于设置所捕获数据包的个数

      3. pcap_handler 是与void packet_handler()使用的一个参数,即回调函数的名称;user值一般为NULL

        1. pcap_callback(u_char* argument,const struct pcap_pkthdr* packet_header,const u_char* packet_content)——回调函数,对数据包的处理都在此函数内

          1. packet_content表示的捕获到的数据包的内容

          2. 参数argument是从函数pcap_loop()传递过来的user

          3. 参数pcap_pkthdr 表示捕获到的数据包基本信息,包括时间,长度等信息

    3. 关闭设备pcap_close()、关闭查询的设备pcap_freealldevs()

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值