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

使用Scapy从Mac OSX上的数据包获取信号强度

  •  0
  • ShellRox  · 技术社区  · 7 年前

    背景

    我试图从收到的数据包中获取RSSI。我知道它们在Radiotap报头中可用,但不幸的是,我无法嗅到任何包含Radiotap报头的包。

    我确实发现 parsePacket 方法来自 scapy-rssi ,它似乎只过滤出包含带有RSSI的Radiotap头的数据包(如果我没有弄错的话)。

    我在下面的代码中使用了该方法:

    def parsePacket(pkt):
      if pkt.haslayer(scapy.all.Dot11):
        if pkt.addr2 is not None:
          # check available Radiotap fields
          field, val = pkt.getfield_and_val("present")
          names = [field.names[i][0] for i in range(len(field.names)) if (1 << i) & val != 0]
          # check if we measured signal strength
          if "dBm_AntSignal" in names:
            # decode radiotap header
            fmt = "<"
            rssipos = 0
            for name in names:
              # some fields consist of more than one value
              if name == "dBm_AntSignal":
                # correct for little endian format sign
                rssipos = len(fmt)-1
              fmt = fmt + self.radiotap_formats[name]
            # unfortunately not all platforms work equally well and on my arm
            # platform notdecoded was padded with a ton of zeros without
            # indicating more fields in pkt.len and/or padding in pkt.pad
            decoded = struct.unpack(fmt, pkt.notdecoded[:struct.calcsize(fmt)])
            return pkt.addr2, decoded[rssipos]
    
    def packetCallback(pkt):
      parsed = parsePacket(pkt)
      if parsed:
        print(parsed)
    
    sniff("en1", prn=packetCallback)  #en1 is a wlan interface on my OSX
    

    不幸的是,函数没有输出任何内容,因此没有包含Radiotap头的数据包。我试着用 sniff("en1mon", prn=packetCallback) ,但没有任何进展。


    主要问题:

    我还发现,Mac OSX的en1接口不能访问Dot11报头,这是真的吗?如果是这样,那么如何从OSX上的数据包中获取RSSI值呢?

    谢谢您!

    1 回复  |  直到 7 年前
        1
  •  1
  •   Cukic0d    7 年前

    有几件事:

    你可能想用 packet[Radiotap].dBm_AntSignal 直接,当不是无时,它将是一个负值,而不是整个parsePacket的事情。

    最后,在OSX上,您可能需要使用 sniff([...], monitor=True) 确保正确接收原始数据包

    推荐文章