Python/Scapy在使用WiFi的嵌入式设备上的性能

2024-06-10 19:09:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我用Scapy捕捉Wi-Fi客户端请求帧。我只对MAC和客户的SSID地址感兴趣。我会做如下的事情。在

sniff(iface="mon0", prn=Handler)

def Handler(pkt):
    if pkt.hasLayer(Dot11):
       if pkt.type == 0 and pkt.subtype == 4:
           print pkt.addr2 + " " + pkt.info

我的问题是,我是在一个处理能力有限的嵌入式设备上这样做的。当我运行脚本时,我的处理器利用率上升到接近100%。我认为这是因为Scapy正在嗅探并传递给Python代码的大量帧。我还假设,如果可以在sniff命令中使用正确的过滤器,就可以消除许多未使用的帧,从而减少处理器负载。在

有没有一个过滤器语句可以用来做这件事?在


Tags: 客户端过滤器客户ifmac地址处理器感兴趣
2条回答

由于Scapy解码数据的方式,它的速度非常慢。你可以

  • 在输入端使用一个BPF过滤器,以便在将它们交给scapy之前只获取您要查找的帧。见this module for example。该模块首先使用libpcap从air或文件中获取数据,然后将其通过动态更新的BPF过滤器来阻止不需要的流量
  • 用c语言编写自己的wifi解析器(这并不难,考虑到您需要的信息量有限,但也有类似prismhead的东西)
  • 使用来自wireshark的tshark作为子进程并从那里收集数据

我强烈推荐第三种方法,尽管wiresharek附带了一个大于120mb的库,但您的嵌入式设备可能无法处理。在

有了Scapy,就可以用应用于捕获的BPF Filter进行嗅探。这将在一个比Handler函数低得多的级别上过滤出数据包,并将显著提高性能。在

Scapy documentation中有一个简单的例子。在

# Could also add a subtype to this.
sniff(iface="mon0", prn=Handler, filter="type mgt")

here specifically拼凑而成的过滤器。在

不幸的是,我现在不能测试这个,但是这些信息应该为你提供一个最终解决方案的垫脚石,或者其他人来发布你所需要的东西。我相信你还需要将界面设置为监控模式。在

你也可以找到这个有趣的问题-Accessing 802.11 Wireless Management Frames from Python。在

相关问题 更多 >