代码之家  ›  专栏  ›  技术社区  ›  ViniciusArruda

设置无线接口,但捕获以太网数据

  •  0
  • ViniciusArruda  · 技术社区  · 11 年前

    我正在使用libpcap制作一个嗅探器,我得到了一些奇怪的行为。 我对网络不太了解,因为我正在制作嗅探器来了解网络是如何真正工作的。

    在运行嗅探器之前,我键入 ifconfig 在终端上,并返回:

    eth0      Link encap:Ethernet  Endereço de HW 44:87:fc:ec:63:08  
              endereço inet6: fe80::4687:fcff:feec:6308/64 Escopo:Link
              UP BROADCASTMULTICAST  MTU:1500  Métrica:1
              RX packets:38398 errors:0 dropped:1 overruns:0 frame:0
              TX packets:28661 errors:0 dropped:0 overruns:0 carrier:2
              colisões:0 txqueuelen:1000 
              RX bytes:24620500 (23.4 MiB)  TX bytes:6922586 (6.6 MiB)
              IRQ:42 
    
    lo        Link encap:Loopback Local  
              inet end.: 127.0.0.1  Masc:255.0.0.0
              endereço inet6: ::1/128 Escopo:Máquina
              UP LOOPBACKRUNNING  MTU:16436  Métrica:1
              RX packets:294 errors:0 dropped:0 overruns:0 frame:0
              TX packets:294 errors:0 dropped:0 overruns:0 carrier:0
              colisões:0 txqueuelen:0 
              RX bytes:18540 (18.1 KiB)  TX bytes:18540 (18.1 KiB)
    
    wlan0     Link encap:Ethernet  Endereço de HW 00:c1:40:67:04:30  
              inet end.: 192.168.0.102  Bcast:192.168.0.255  Masc:255.255.255.0
              endereço inet6: fe80::2c1:40ff:fe67:430/64 Escopo:Link
              UP BROADCASTRUNNING MULTICAST  MTU:1500  Métrica:1
              RX packets:2115 errors:0 dropped:0 overruns:0 frame:0
              TX packets:2033 errors:0 dropped:0 overruns:0 carrier:0
              colisões:0 txqueuelen:1000 
              RX bytes:947310 (925.1 KiB)  TX bytes:571860 (558.4 KiB)
    

    我拔掉了以太网电缆,因此,eth0接口没有ip,如果我在嗅探器上使用它,它将无法工作。

    因此,我将无线网络接口作为参数传递给终端上的程序。

    #./sniffer wlan0
    

    以及一段代码:

    pcap_t* handler = NULL; 
    
    handler = pcap_open_live(argv[1], 65535, 1, 1000, errbuf);
    
    if((datalink_value = pcap_datalink(handler)) == DLT_EN10MB)
        printf("ETHERNET\n");
    else if (datalink_value == DLT_IEEE802_11)
        printf("WIRELESS\n");
    

    输出为 ETHERNET .

    为什么会出现这种情况,我该如何解决?设备将其转换为以太网?或者这是内核行为? 我仍然不知道问题是我的代码,还是我不太了解网络和协议的工作原理。

    我使用的无线设备是:Mini-USB 150Mbps 802.11n/g/b wifi适配器Comfast WU720N

    谢谢

    1 回复  |  直到 11 年前
        1
  •  2
  •   user862787 user862787    11 年前

    在Linux上,您需要在监视器模式下进行捕获,以获取802.11标头。如果适配器未处于监控模式,您将只获得数据帧,而不是管理或控制帧,并且802.11报头将被内核转换为假以太网报头,数据包将与该报头一起提供。

    较新版本的libpcap有一个请求监视模式的API,但在Linux上,只有在libpcap支持libnl的情况下,该API才能正常工作。您可以尝试使用API(使用 pcap_create() ,然后是设置捕获选项的调用,然后是 pcap_activate() ,打开设备;其中一个电话应该是 pcap_set_rfmon() 以设置监视器模式)。如果这不起作用,你必须使用airmon ng来打开监视器模式;看见 this part of the Wireshark Wiki 获取有关如何执行此操作的信息。

    推荐文章