为什么 pcap_datalink() 总是返回 1(以太网),即使在无线设备上也是如此?
Why is pcap_datalink() always returning 1 (Ethernet), even on wireless device?
我遇到了 pcap_datalink()
总是返回 1
的问题。据我了解,这是 LINKTYPE_ETHERNET
。但是,我使用的设备是无线网卡,就我而言 en0
.
这会阻止我将网卡置于监控模式,并阻止我的 WLAN 过滤器工作。我在 OSX 和 Linux 上都尝试过 运行,结果相同。我也 运行 作为 root。
这是我的代码中导致问题的部分。例如,假设 dev
设置为 en0
(Mac 上的无线设备)。
#include <stdio.h>
#include <pcap.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
pcap_t *pcap_h;
char *dev, errbuf[PCAP_ERRBUF_SIZE];
struct bpf_program fp;
struct pcap_pkthdr header;
const u_char *packet;
if(argc < 2)
{
printf("Usage: %s device\n", argv[0]);
exit(EXIT_FAILURE);
}
dev = argv[1];
if((pcap_h = pcap_create(dev, errbuf)) == NULL)
{
printf("pcap_create() failed: %s\n", errbuf);
exit(EXIT_FAILURE);
}
if(pcap_can_set_rfmon(pcap_h) == 0)
{
printf("Monitor mode can not be set.\n");
}
if(pcap_set_rfmon(pcap_h, 1) != 0)
{
printf("Failed to set monitor mode.\n");
exit(EXIT_FAILURE);
}
if(pcap_activate(pcap_h) != 0)
{
printf("pcap_activate() failed\n");
exit(EXIT_FAILURE);
}
/*
* Compile a filter to sniff 802.11 probe requests
* Filter: type mgt subtype probe-req
*/
if(pcap_compile(pcap_h, &fp, "type mgt subtype probe-req", 0, PCAP_NETMASK_UNKNOWN) == -1)
{
printf("pcap_compile() failed: %s\n", pcap_geterr(pcap_h));
exit(EXIT_FAILURE);
}
/*
* Set the compiled filter
*/
if(pcap_setfilter(pcap_h, &fp) == -1)
{
printf("pcap_setfilter() failed: %s\n", pcap_geterr(pcap_h));
exit(EXIT_FAILURE);
}
pcap_freecode(&fp);
packet = pcap_next(pcap_h, &header);
printf("Header: %d\n", header.len);
pcap_close(pcap_h);
return 0;
}
知道为什么 pcap_datalink()
总是返回 1
吗?
编辑
更新了代码,并在调用 pcap_activate()
之前添加了 pcap_set_rfmon()
。我得到一个错误:
pcap_compile() failed: 802.11 link-layer types supported only on 802.11
你 shure 这就是阻止你将卡置于监控模式并阻止你的 WLAN 过滤器工作的原因,或者你是否调用 pcap_datalink() 作为试图查明问题的检查?
请注意,来自 PCAP-LINKTYPE(7):
For a live capture or ``savefile'', libpcap supplies, as the
return value of the pcap_datalink(3PCAP) routine, a value that
indicates the type of link-layer header at the beginning of the
packets it provides. This is not necessarily the type of link-layer
header that the packets being captured have on the network from
which they're being captured; for example, packets from an IEEE 802.11
network might be provided by libpcap with Ethernet headers that
the network adapter or the network adapter driver generates from the
802.11 headers.
所以我不会将此 LINKTYPE_ETHERNET / DLT_EN10MB return 值作为此处问题的确定指示。
编辑:
此外,pcap_set_rfmon() 应该在 句柄激活之前调用 ,这在您的代码中不可见。
pcap 对于事情应该完成的顺序相当敏感。查看 pcap_can_set_rfmon
和 pcap_set_rfmon
.
的手册页
顺序应该是:
- pcap_create
- pcap_can_set_rfmon
- pcap_set_rfmon(如果到目前为止一切顺利的话)
- 那时,只有那时,pcap_activate
我遇到了 pcap_datalink()
总是返回 1
的问题。据我了解,这是 LINKTYPE_ETHERNET
。但是,我使用的设备是无线网卡,就我而言 en0
.
这会阻止我将网卡置于监控模式,并阻止我的 WLAN 过滤器工作。我在 OSX 和 Linux 上都尝试过 运行,结果相同。我也 运行 作为 root。
这是我的代码中导致问题的部分。例如,假设 dev
设置为 en0
(Mac 上的无线设备)。
#include <stdio.h>
#include <pcap.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
pcap_t *pcap_h;
char *dev, errbuf[PCAP_ERRBUF_SIZE];
struct bpf_program fp;
struct pcap_pkthdr header;
const u_char *packet;
if(argc < 2)
{
printf("Usage: %s device\n", argv[0]);
exit(EXIT_FAILURE);
}
dev = argv[1];
if((pcap_h = pcap_create(dev, errbuf)) == NULL)
{
printf("pcap_create() failed: %s\n", errbuf);
exit(EXIT_FAILURE);
}
if(pcap_can_set_rfmon(pcap_h) == 0)
{
printf("Monitor mode can not be set.\n");
}
if(pcap_set_rfmon(pcap_h, 1) != 0)
{
printf("Failed to set monitor mode.\n");
exit(EXIT_FAILURE);
}
if(pcap_activate(pcap_h) != 0)
{
printf("pcap_activate() failed\n");
exit(EXIT_FAILURE);
}
/*
* Compile a filter to sniff 802.11 probe requests
* Filter: type mgt subtype probe-req
*/
if(pcap_compile(pcap_h, &fp, "type mgt subtype probe-req", 0, PCAP_NETMASK_UNKNOWN) == -1)
{
printf("pcap_compile() failed: %s\n", pcap_geterr(pcap_h));
exit(EXIT_FAILURE);
}
/*
* Set the compiled filter
*/
if(pcap_setfilter(pcap_h, &fp) == -1)
{
printf("pcap_setfilter() failed: %s\n", pcap_geterr(pcap_h));
exit(EXIT_FAILURE);
}
pcap_freecode(&fp);
packet = pcap_next(pcap_h, &header);
printf("Header: %d\n", header.len);
pcap_close(pcap_h);
return 0;
}
知道为什么 pcap_datalink()
总是返回 1
吗?
编辑
更新了代码,并在调用 pcap_activate()
之前添加了 pcap_set_rfmon()
。我得到一个错误:
pcap_compile() failed: 802.11 link-layer types supported only on 802.11
你 shure 这就是阻止你将卡置于监控模式并阻止你的 WLAN 过滤器工作的原因,或者你是否调用 pcap_datalink() 作为试图查明问题的检查?
请注意,来自 PCAP-LINKTYPE(7):
For a live capture or ``savefile'', libpcap supplies, as the return value of the pcap_datalink(3PCAP) routine, a value that indicates the type of link-layer header at the beginning of the packets it provides. This is not necessarily the type of link-layer header that the packets being captured have on the network from which they're being captured; for example, packets from an IEEE 802.11 network might be provided by libpcap with Ethernet headers that the network adapter or the network adapter driver generates from the 802.11 headers.
所以我不会将此 LINKTYPE_ETHERNET / DLT_EN10MB return 值作为此处问题的确定指示。
编辑: 此外,pcap_set_rfmon() 应该在 句柄激活之前调用 ,这在您的代码中不可见。
pcap 对于事情应该完成的顺序相当敏感。查看 pcap_can_set_rfmon
和 pcap_set_rfmon
.
顺序应该是:
- pcap_create
- pcap_can_set_rfmon
- pcap_set_rfmon(如果到目前为止一切顺利的话)
- 那时,只有那时,pcap_activate