如何在c 使用pcap执行扫描附近的wifi ap

基本上我想要一个简单的C代码,它说明了在混杂模式下捕获数据包并从中提取出ssid。

EDIT1

我正在编写我编写的代码来执行基本的嗅探。

#include  #include  int main(int argc, char *argv[]){ pcap_t *handle; struct pcap_pkthdr header; const u_char *packet; int i; char *dev, errbuf[PCAP_ERRBUF_SIZE]; // dev = pcap_lookupdev(errbuf); dev = argv[1]; if( dev == NULL ){ fprintf(stderr, "Couldn't find default device\n"); return 0; } printf("Device: %s\n", dev); handle = pcap_open_live( dev , BUFSIZ , 0 , 1000 , errbuf); if( handle == NULL ){ fprintf(stderr , "couldn't open device %s: %s\n" , dev , errbuf); return 0; } else{ packet = pcap_next( handle, &header ); printf( "Grabbed a packet with length %d\n" , header.len ); for( i = 0; i < header.len; i++ ) printf( "Packet's content %s\n" , packet + i ); pcap_close( handle ); } return 0; } 

TLD; DR: 你从根本上走错了方向。 使用libpcap进行数据包捕获对于Wi-Fi来说并不是这样。

  • 由于SSID在802.11管理帧中,因此您希望以监控模式捕获,而不是混杂模式
  • 然后,您需要在管理帧上使用pcapfilter,特别是对于信标和/或探测请求和/或探测响应 。 这就是SSID所在的位置。
  • 然后,只有这样,您才必须对这些特定数据包的解析进行编码。 没有固定的格式(很多可选字段,从使用wireshark查看捕获可以看出),因此没有“一种尺寸适合所有解析”。 但是获得SSID并不难。

不过,你离这个SSID解析还很远。 到目前为止,这实际上是你最后的问题。 所以现在的血腥细节。

关于Wi-Fi上的libpcap有三种可能性:

1 /普通模式 (不混杂,不监视):

您将看到进出接口的数据包。 不到/来自其他AP(接入点)或STA(站点)。

这些数据包看起来像“常规以太网帧”, 没有802.11部分,也没有纯802.11管理数据包,所以如果你的目标是让你身边的SSID不好,你根本就看不到这些。 唯一可用的用例是wlan0是STA或AP本身,并且您希望捕获在运行捕获程序的同一台计算机上运行的网络应用程序之间的流量。

2 /混杂模式。

同样,您需要成为STA或AP,pcap将为您提供常规以太网帧的外观, 而不是802.11管理部分,因此再次对SSID无用。 如果您是STA:与案例1 /普通模式相比,您将看不到多少。 您将看到的更多是来自其他STA的广播(来自第2层/第3层)帧。 例如ARP请求,多播/广播UDP。 但不是这些其他STA的单播流量。 如果您是AP,那么是的,您将看到来自连接的STA的流量(注意:除非您使用Wi-Fi直接https://en.wikipedia.org/wiki/Wi-Fi_Direct ,其中站点直接通信而没有数据包通过AP)。

3 /监控模式。 现在我们正在谈论。

您将使用libpcap API将您的界面置于监控模式,请参阅此处的示例说明:

为什么pcap_datalink()总是返回1(以太网),即使在无线设备上也是如此?

…或者您将事先创建一个监控界面,并在此处启动您的pcap流程。 读:

https://wiki.wireshark.org/CaptureSetup/WLAN#Turning_on_monitor_mode

您将无法连接(无论是STA还是AP) *并且您可以捕获所有内容 (但是…… +看到我的最终警告更低):802.11管理帧,包括信标,探测请求和探测响应,以及您珍贵的SSID。 和所有数据。*如果您有一些没有加密的接入点,那么这些dataframe的TCP / IP将是明确的。

现在,“但”部分:

3.1 – 您将捕获的内容不会是常规的类似以太网的帧。 您将拥有一个radiotap标头(内核添加一些元信息),然后是802.11字段。 这可能是非常繁琐的解析,但如果你只是对SSID感兴趣它可能只是几十行C代码。

3.2 – 可悲的是,你可以应用pcapfilter语法没有“SSIDfilter”,只是去了。

http://www.tcpdump.org/manpages/pcap-filter.7.html

这是因为每次看不到“SSID字段”,它取决于数据包的类型/上下文。 仍然,pcapfilter可以帮助您:您可以做的是使用“ type mgt subtype beacon ”filter捕获信type mgt subtype beacon 。 您可能还对“ type mgt subtype probe-resp ”和“ type mgt subtype probe-resp ”感兴趣。 然后,你将不得不手动解析这些:格式是一种“弹性”。 幸运的是,SSID是最早的字段之一,它是几十行的C代码。

一旦你完成了,但是你仍然远离它,如果你遇到解析信标的问题,那么你可能会回来一个更具体的问题。

最后的警告:请注意,如果你想超越SSID并捕获应用数据流量,甚至抛开加密问题,解析工作从你的802.11 + radiotap数据包转到第3层及以上的多汁部分。 ..结果没有保证。 根据我的经验:我的环境非常嘈杂(数十个繁忙的AP和STA),并且大多数时候捕获错过了一些位:在这样的捕获节目上的wireshark解剖“确认看不见的段”,TCP序列号有间隙并且“跟随TCP对话框“在这样的捕获上显示了一些”[NNN从捕获中丢失的字节]“。

您可以使用类似exec()system()来调用相关的CLI工具/命令并解析输出。 您还可以查看libpcap,这可能是您正在寻找的(?)。

Interesting Posts