PCAP数据包过滤器设置 及 过滤表达式语法

通常我们只对特定网络通信感兴趣。比如我们只打算监听Telnet服务(port 23)以捕获用户名和口令信息。获知对FTP(port 21)或DNS(UDP port 53)数据流感兴趣。可以通过pcap_compile()和pcap_setfilter来设置数据流过滤规则(filter)

函数原型:

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

p:表示pcap会话句柄;

fp:存放编译以后的规则;

str:规则表达式格式的过滤规则(filter),同tcpdump中的filter;

optimize:制定优化选项:0 false, true;

netmask:监听接口的网络掩码;

返回值:-1表示操作失败,其他值表成功。

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

 p:表示pcap的会话句柄;

 fp:表示经过编译后的过滤规则;

 返回值:-1表示操作失败,其他值表成功。

 

示例代码:

#include <pcap.h>
 ...
 pcap_t *handle; 
 char dev[] "rl0"; 
 char errbuf[PCAP_ERRBUF_SIZE]; 
 struct bpf_program filter; 
 char filter_app[] "port 23"; 
 bpf_u_int32 mask; 
 bpf_u_int32 net; 
 pcap_lookupnet(dev, &net, &mask, errbuf);
 handle pcap_open_live(dev, BUFSIZ, 1, 0, errbuf);
 pcap_compile(handle, &filter, filter_app, 0, net);
 pcap_setfilter(handle, &filter); 

上面的代码设备rl0上以混杂模式监听所有发往或源自端口23的数据包。Pcap_lookupnet()函数返回给定接口的IP地址和子网掩码。

 

【语法】

wpcap的过滤器是以已声明的谓词语法为基础的。过滤器是一个ASCII字符串,它包含了一个过滤表达式。pcap_compile()把这个表达式编译成内核级的包过滤器。
这个表达式会选择那些数据包将会被堆存。如果表达式没有给出,那么,网络上所有的包都会被内核过滤引擎所认可。不然,只有那些表达式为'true'的包才会被认可。

这个表达式包含了一个或多个原语。原语通常包含了id(名字或序列),这些id优先于限定词。以下是三种不同的限定词:<

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值