如何使用 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.

所以你需要传入的是:

  1. 指向 pcap_t 的指针,您通过使用 pcap_create()pcap_set_rfmon() 来安排您将在监控模式下捕获,以及 pcap_activate() ;
  2. 指向 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 源并破解它来做你需要的,而不是重新发明它所做的所有解析。