如何使用 802.11 headers 与 libpcap
How to use 802.11 headers with libpcap
我正在尝试使用 libpcap 捕获探测请求。
据我了解,探测请求是一个管理框架。我可以用过滤器 type mgt subtype probe-req
.
捕捉这些
但是在pcap_next()
中我需要传入什么结构?我需要通过完整的 802.11 header 结构吗?如果是这样,这些结构是在哪里定义的?如果它们已经在别处定义,我不想创建自己的。
我尝试包含 radiotap.h
并使用 -I
添加 gcc
中的库路径,但我最终遇到 asm/linkage.h
和所有内容的链接错误只是从那里变得凌乱。
我的问题是,标准 header 在哪里定义的?使用 Google 时,关于这方面的信息似乎很少。
顺便说一句,我正在使用 Yosemite。我也有一台 Debian 机器。任一平台的任何答案都足够了。
To my understanding a probe request is a management frame.
是的。
But within pcap_next()
what struct do I need to pass in?
引用 pcap_next 手册页:
const u_char *pcap_next(pcap_t *p, struct pcap_pkthdr *h);
...
pcap_next() returns a pointer to the packet data on success, and
returns NULL if an error occured, or if no packets were read from
a live capture (if, for example, they were discarded because they
didn't pass the packet filter, or if, on platforms that support a
read timeout that starts before any packets arrive, the timeout
expires before any packets arrive, or if the file descriptor for
the capture device is in non-blocking mode and no packets were
available to be read), or if no more packets are available in a
``savefile.'' Unfortunately, there is no way to determine whether
an error occured or not.
所以你需要传入的是:
- 指向
pcap_t
的指针,您通过使用 pcap_create()
、pcap_set_rfmon()
来安排您将在监控模式下捕获,以及 pcap_activate()
;
- 指向
struct pcap_pkthdr
的指针 - 该结构类型在 pcap.h
中声明,因此您需要执行诸如 struct pcap_pkthdr hdr;
之类的操作并将 &hdr
作为第二个参数;
并且您将 收到 作为 return 值,错误时为 NULL(或超时,not 将 NULL 视为某事失败的指示;您真的想在这里使用 pcap_next_ex()
)或指向包含原始数据包数据的缓冲区的指针。
在 pcap_activate()
return 秒后,如果成功,您将需要在 pcap_t *
上调用 pcap_datalink()
以查看原始数据包数据的格式。 如果等于DLT_IEEE802_11_RADIO
,则原始数据包数据以radiotap header开头,并且有一个802.11 header 在收音机之后 header.
My question is though, where are the standard headers defined?
802.11 header 在 IEEE Std 802.11-2012 中定义。你的 OS 是否恰好有一个 C header 用于那些 headers 并且 如果 它有,其中 headers 是, 取决于 OS。您可能没有任何这样的header。
你真的可能想考虑只获取 tcpdump 源并破解它来做你需要的,而不是重新发明它所做的所有解析。
我正在尝试使用 libpcap 捕获探测请求。
据我了解,探测请求是一个管理框架。我可以用过滤器 type mgt subtype probe-req
.
但是在pcap_next()
中我需要传入什么结构?我需要通过完整的 802.11 header 结构吗?如果是这样,这些结构是在哪里定义的?如果它们已经在别处定义,我不想创建自己的。
我尝试包含 radiotap.h
并使用 -I
添加 gcc
中的库路径,但我最终遇到 asm/linkage.h
和所有内容的链接错误只是从那里变得凌乱。
我的问题是,标准 header 在哪里定义的?使用 Google 时,关于这方面的信息似乎很少。
顺便说一句,我正在使用 Yosemite。我也有一台 Debian 机器。任一平台的任何答案都足够了。
To my understanding a probe request is a management frame.
是的。
But within
pcap_next()
what struct do I need to pass in?
引用 pcap_next 手册页:
const u_char *pcap_next(pcap_t *p, struct pcap_pkthdr *h);
...
pcap_next() returns a pointer to the packet data on success, and
returns NULL if an error occured, or if no packets were read from
a live capture (if, for example, they were discarded because they
didn't pass the packet filter, or if, on platforms that support a
read timeout that starts before any packets arrive, the timeout
expires before any packets arrive, or if the file descriptor for
the capture device is in non-blocking mode and no packets were
available to be read), or if no more packets are available in a
``savefile.'' Unfortunately, there is no way to determine whether
an error occured or not.
所以你需要传入的是:
- 指向
pcap_t
的指针,您通过使用pcap_create()
、pcap_set_rfmon()
来安排您将在监控模式下捕获,以及pcap_activate()
; - 指向
struct pcap_pkthdr
的指针 - 该结构类型在pcap.h
中声明,因此您需要执行诸如struct pcap_pkthdr hdr;
之类的操作并将&hdr
作为第二个参数;
并且您将 收到 作为 return 值,错误时为 NULL(或超时,not 将 NULL 视为某事失败的指示;您真的想在这里使用 pcap_next_ex()
)或指向包含原始数据包数据的缓冲区的指针。
在 pcap_activate()
return 秒后,如果成功,您将需要在 pcap_t *
上调用 pcap_datalink()
以查看原始数据包数据的格式。 如果等于DLT_IEEE802_11_RADIO
,则原始数据包数据以radiotap header开头,并且有一个802.11 header 在收音机之后 header.
My question is though, where are the standard headers defined?
802.11 header 在 IEEE Std 802.11-2012 中定义。你的 OS 是否恰好有一个 C header 用于那些 headers 并且 如果 它有,其中 headers 是, 取决于 OS。您可能没有任何这样的header。
你真的可能想考虑只获取 tcpdump 源并破解它来做你需要的,而不是重新发明它所做的所有解析。