#include <stdio.h>
#include <pcap.h>
int main(int argc, char *argv[])
{
char *dev = argv[1];
printf("Device: %s\n", dev);
return(0);
}
用户通过命令行参数传入监听接口。
译注:在实际的项目开发中务必对命令行参数进行判断: 字串7
if (argc < 2) {
printf(“Usage: %s <option>\n”, argv[0]);
exit(1);
}
2、 通过pcap引擎设定监听的网络接口: 字串6
#include <stdio.h>
#include <pcap.h>
int main()
{
char *dev, errbuf[PCAP_ERRBUF_SIZE];
dev = pcap_lookupdev(errbuf);
printf("Device: %s\n", dev);
return(0);
}
在这种情况下,pcap引擎自己设置用来监听的接口。但是errbuf字符串用来做什么呢?大多数的pcap函数允许我们传递这样一个字符串作为其参数。这个字符串参数用来在pcap函数调用失败以后用来设置出错信息。在上面的例子中,如果pcap_lookup函数调用失败,出错信息将被保存在errbuf中。
译注:增加的错误检查的代码如下: 字串8
if (NULL == (dev = pcap_lookupdev(errbuf))) {
字串2
fprintf(stderr, “pcap_lookupdev() error: %s\n”, errbuf);
字串7
exit(-1); 字串6
}
字串7
printf(“Device: %s\n”, dev);
字串3
字串5
Opening the device for sniffing
创建sniff会话的任务非常简单。我们使用pcap_open_live()创建sniff会话。函数原型:
pcap_t *pcap_open_live(char *device, int snaplen, int promisc, int to_ms, char *ebuf) 字串6
device:上节中我们制定的监听设备接口; 字串8
snaplen:制定pcap捕获的最大数目的网络数据包; 字串4
promisc:>0指定device接口工作在混杂模式(promiscous Mode); 字串2
to_ms:制定经过特定时间(ms)后读超时;0表示遇到错误退出,-1指定永不超时; 字串4
ebuf:制定用来存储出错信息的字符串 字串8
pcap_t:返回值为用于监听的pcap会话。 字串2
示例代码: 字串2
#include <pcap.h>
...
pcap_t *handle;
handle = pcap_open_live(somedev, BUFSIZ, 1, 0, errbuf);
上面的代码打开somedev指定的设备并读取(捕获)BUFSIZ字节,同时我们设置接口工作在混杂模式,一直监听到有任何错误发生则退出,并将出错信息保存在errbuf指定的字符串中。
关于混杂模式vs.非混杂模式:通常情况在非混杂模式下仅监听直接发往主机的数据包:发往、源自或通过主机路由的数据包都将被pcap捕获;混杂模式下,所有发送到物理链路上的数据包都将被捕获。在一个共享式的网络环境中,这将导致整个网络的数据流被监听。混合监听模式是可以被检测的:可以通过测试强可靠性来发现网络中是否有主机正在以混合模式监听,另外混杂工作模式仅仅在非交换式的网络中有效,而且在一个高负载的网络环境中,混杂模式将消耗大量的系统资源。
Filter traffic
通常我们只对特定网络通信感兴趣。比如我们只打算监听Telnet服务(port 23)以捕获用户名和口令信息。获知对FTP(port 21)或DNS(UDP port 53)数据流感兴趣。可以通过pcap_compile()和pcap_setfilter来设置数据流过滤规则(filter) 字串9
函数原型:
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;
字串8
optimize:制定优化选项:0 false, 1 true;
netmask:监听接口的网络掩码;
返回值:-1表示操作失败,其他值表成功。
int pcap_setfilter(pcap_t *p, struct bpf_program *fp) 字串1
p:表示pcap的会话句柄; 字串7
fp:表示经过编译后的过滤规则;
返回值:-1表示操作失败,其他值表成功。
示例代码: 字串7
#include <pcap.h>
...
pcap_t *handle; /* Session handle */