使用Wi-Fi的嵌入式设备上的Python / Scapy性能

时间:2013-08-30 13:52:21

标签: python performance wifi scapy

我正在使用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命令中使用正确的过滤器,我可以消除许多未使用的帧,从而减少处理器负载。

是否有可用于执行此操作的过滤器语句?

2 个答案:

答案 0 :(得分:2)

使用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

答案 1 :(得分:1)

由于解密数据的方式,Scapy非常慢。你可以

  • 在输入上使用BPF过滤器,只有在将它们传递给scapy之前才能获取您要查找的帧。见this module for example。该模块使用libpcap首先从空中或从文件中获取数据,并通过动态更新的BPF过滤器传递数据以防止不需要的流量
  • 在c中编写自己的wifi解析器(这不太难,因为你需要的信息量有限,但有些东西就像prismhead一样)
  • 使用来自wireshark的tshark作为子流程并从那里收集数据

我强烈推荐第三种方法,虽然wiresharek带有一个> 120mb的库,您的嵌入式设备可能无法处理。