Post

libpcap的使用

libpcap的使用

pcap_findalldevs

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

获取系统中所有的网络设备列表

  • alldevsp参数是一个指向pcap_if_t结构体指针的指针,用于存储获取到的设备列表;
  • errbuf参数是一个指向字符数组的指针,用于存储错误信息

pcap_open_live

1
pcap_t *pcap_open_live(const char *device, int snaplen, int promisc, int to_ms, char *errbuf);

用于打开一个网络设备,并开始捕获数据包

  • device参数是要打开的设备名称;
  • snaplen参数是要捕获的数据包的最大长度;
  • promisc参数表示是否开启混杂模式;
  • to_ms参数表示捕获数据包的超时时间(单位为毫秒);
  • errbuf参数用于存储错误信息

混杂模式

网络接口的一种工作模式。在此模式下,网络接口会接收到经过它的所有数据包,而不仅仅是针对它的目的地址或广播地址的数据包。

pcap_loop

1
int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user);

从网络接口或pcap文件中循环读取数据包并进行处理

  • p是一个指向pcap_t结构体的指针,表示要循环读取数据包的网络接口或pcap文件;
  • cnt表示要读取的数据包数量,如果设置为-1,则表示循环读取直到收到一个错误或pcap_breakloop被调用;
  • callback是一个回调函数,用于处理读取到的数据包;
  • user是一个指向用户数据的指针,可以在回调函数中使用

回调函数callback

1
void callback(u_char *user, const struct pcap_pkthdr *header, const u_char *packet);
  • user:用户自定义数据的指针,与pcap_loop函数中的user参数相同
  • header:指向数据包头部信息的指针,包括数据包的时间戳、数据包长度等信息
  • packet:指向数据包的内容的指针,包括数据包的协议头和数据部分
    1
    2
    3
    4
    5
    
    struct pcap_pkthdr {
      struct timeval ts;  /* time stamp */
      bpf_u_int32 caplen; /* length of portion present */
      bpf_u_int32 len;    /* length of this packet (off wire) */
    };
    

pcap_compile

1
int pcap_compile(pcap_t *p, struct bpf_program *fp, const char *str, int optimize, bpf_u_int32 netmask);

用于将一个字符串类型的抓包过滤规则编译为一个可执行的过滤程序,返回一个指向struct bpf_program结构体的指针。该结构体包含了编译后的过滤程序的信息,如指令集、指令个数等

  • p:指向pcap_t结构体的指针,表示要设置过滤规则的网络接口或pcap文件。
  • fp:指向struct bpf_program结构体的指针,表示编译后的过滤程序的信息。
  • str:字符串类型的抓包过滤规则。
  • optimize:是否优化过滤程序,一般设置为1。
  • netmask:网络掩码,用于指定网络地址的子网掩码。

pcap_setfilter

1
int pcap_setfilter(pcap_t *p, struct bpf_program *fp);

用于将编译后的过滤程序设置到网络接口或pcap文件中,以过滤数据包

  • p:指向pcap_t结构体的指针,表示要设置过滤规则的网络接口或pcap文件。
  • fp:指向struct bpf_program结构体的指针,表示编译后的过滤程序的信息。

过滤规则

过滤规则比较复杂,建议浏览官方的文档说明 pcap-filter - packet filter syntax 简单使用

  • 协议过滤
    • tcp:只捕获 TCP 数据包
    • udp:只捕获 UDP 数据包
    • icmp:只捕获 ICMP 数据包
  • 源/目的IP过滤
    • host 192.168.1.1:只捕获源或目的 IP 地址为 192.168.1.1 的数据包
    • src 192.168.1.1:只捕获源 IP 地址为 192.168.1.1 的数据包
    • dst 192.168.1.1:只捕获目的 IP 地址为 192.168.1.1 的数据包
  • 端口过滤
    • port 80:只捕获目的端口号为 80 的数据包
    • src port 1024:只捕获源端口号为 1024 的数据包
    • dst portrange 1-1023:只捕获目的端口号在 1 到 1023 之间的数据包
  • 数据包大小
    • less 100:只捕获大小小于 100 字节的数据包
    • greater 1000:只捕获大小大于 1000 字节的数据包
This post is licensed under CC BY 4.0 by the author.