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

时间:2016-02-19 22:12:36

标签: c sockets pcap libpcap 802.11

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

EDIT1

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

#include <stdio.h>
#include <pcap.h>

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;
 }

2 个答案:

答案 0 :(得分:5)

TLD; DR:您从根本上走错了方向。使用libpcap进行数据包捕获对Wi-Fi无效。

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

尽管如此,您还远离此SSID解析。到目前为止,它实际上是你最后的问题。所以现在有血腥的细节。

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

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

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

这些数据包看起来像#34;常规以太网帧&#34;, 没有802.11部分,也没有纯802.11管理数据包,所以如果您的目标是获得围绕您的SSID&#39没有好处,你只是不会看到这些。 唯一可用的用例是你的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将您的界面置于监控模式,请参阅此处的示例说明:

Why is pcap_datalink() always returning 1 (Ethernet), even on wireless device?

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

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

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

现在,&#34;但是&#34;部分:

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

3.2 - 可悲的是,没有&#34; SSID过滤器&#34;来自pcap过滤器的语法,你可以申请,然后去。

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

这是因为根本没有&#34; SSID字段&#34;每个看,它取决于数据包的类型/上下文。尽管如此,pcap过滤器可以帮助您:您可以做的是使用&#34; type mgt subtype beacon&#34;捕获信标。过滤。您可能也对&#34; type mgt subtype probe-resp&#34;感兴趣和&#34; type mgt subtype probe-resp&#34;。然后,您必须手动解析这些:格式是&#34;弹性&#34;。幸运的是,SSID是最早的字段之一,它可以获得几十行C代码。

一旦你做到了,但你还远离它,如果你在解析信标时遇到问题,那么你可能会回到一个更具体的问题。

最终警告:要注意,如果您想要超越SSID并捕获应用数据流量,甚至不考虑加密问题,解析工作从802.11 + radiotap数据包转到3层及以上多汁的部分,嗯...结果不保证。根据我的经验:我的环境非常嘈杂(数十个繁忙的AP和STA),并且大部分时间捕获错过了一些内容:对这样的捕获节目进行了wirehark解剖&#34;确认看不见的段&#34;,TCP序列号有差距和&#34;遵循TCP对话框&#34;在这样的捕获中显示了一些&#34; [NNN从捕获中丢失的字节]&#34;。

答案 1 :(得分:2)

您可以使用exec()system()之类的东西来调用相关的CLI工具/命令并解析输出。你也可以查看libpcap,这可能就是你要找的东西(?)。