我试图使用libpcap捕获探测请求。
据我所知,探测请求是一个管理框架。我可以使用过滤器type mgt subtype probe-req
来捕获这些内容。
但是在pcap_next()
内我需要传递什么结构?我是否需要传递完整的802.11标头结构?如果是这样,这些结构在哪里定义?如果他们已经在其他地方定义过,我不想创建自己的。
我已尝试添加radiotap.h
并在gcc
中添加-I
库的路径,但我最终得到了asm/linkage.h
的链接错误,所有内容都得到了那里凌乱。
我的问题是,标准标题定义在哪里?在使用Google时,似乎很少有相关信息。
我顺便使用Yosemite。我也有一台Debian机器。任何平台的任何答案都足够了。
答案 0 :(得分:0)
据我所知,探测请求是一个管理框架。
是
但是在
pcap_next()
内我需要传递哪种结构?
引用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
传递为第二个论点; 你将接收,作为返回值,错误时为NULL(或超时,所以不将NULL视为某事失败的指示;你我真的想在这里使用pcap_next_ex()
或指向包含原始数据包数据的缓冲区。
pcap_activate()
返回后,如果成功,则需要在pcap_datalink()
上调用pcap_t *
以查看原始数据包数据的格式。 如果它等于DLT_IEEE802_11_RADIO
,则原始数据包数据以radiotap标头开头,并且有一个802.11标头跟随radiotap标题。
我的问题是,标准标题定义在哪里?
802.11标头在IEEE Std 802.11-2012中定义。您的操作系统是否恰好具有这些标头的C标头,而 if 它的标头位于哪里,取决于操作系统。你可能没有拥有任何这样的标题。
你真的可能想要考虑只是抓住tcpdump源并将其破解以做你需要的事情,而不是重新发明它所做的所有解析。