2

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

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

4

2 回答 2

3

使用 Scapy,可以使用应用于捕获的BPF 过滤器进行嗅探。Handler这将在比您的函数执行的级别低得多的级别过滤数据包,并且应该会显着提高性能。

Scapy 文档中有一个简单的示例。

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

过滤器专门从这里拼凑而成。

不幸的是,我现在无法对此进行测试,但是此信息应该为您提供最终解决方案的垫脚石,或者其他人可以准确地发布您需要的内容。我相信您还需要将界面设置为监控模式。

您可能还会发现这个感兴趣的问题 - Accessing 802.11 Wireless Management Frames from Python

于 2013-08-30T17:00:51.943 回答
2

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

  • 在输入上使用 BPF 过滤器仅获取您正在寻找的帧,然后再将它们交给 scapy。例如,请参阅此模块。该模块首先使用 libpcap 从空中或文件中获取数据,并将其传递给动态更新的 BPF 过滤器以阻止不需要的流量
  • 用 c 编写你自己的 wifi 解析器(这并不难,考虑到你需要的信息量有限,不过有像 prismhead 这样的东西)
  • 使用wireshark中的tshark作为子进程并从那里收集数据

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

于 2013-08-30T16:59:18.713 回答