【问题标题】:How to parse information element in 802.11 probe request frame with gopacket如何使用 gopacket 解析 802.11 探测请求帧中的信息元素
【发布时间】:2020-05-04 02:46:05
【问题描述】:

Gopacket 支持解析信标和探测响应帧中的信息元素,如下所示:

for _, layer := range packet.Layers() {
    if layer.LayerType() == layers.LayerTypeDot11InformationElement {
        dot11info, ok := layer.(*layers.Dot11InformationElement)
        }
}

但是 gopacket 不支持解析探测请求帧中的信息元素。 我只能用packet.Layer(layers.LayerTypeDot11MgmtProbeReq).(*layers.Dot11MgmtProbeReq) 获取Contents和Payload,信息元素在这个Contents中。

那么如何解析探测请求帧中的这些信息元素呢?

【问题讨论】:

    标签: go wifi gopacket


    【解决方案1】:

    我相信你必须自己写。您是否已经尝试过this 实现?

    解析器如下:

    func (pr *capturedRequest) decodeProbeRequestLayer(probeLayer *layers.Dot11MgmtProbeReq) {
        var body []byte
        body = probeLayer.LayerContents()
        for i := uint64(0); i < uint64(len(body)); {
            id := layers.Dot11InformationElementID(body[i])
            i++
            switch id {
            case layers.Dot11InformationElementIDSSID:
                elemLen := uint64(body[i])
                i++
                if elemLen > 0 {
                    pr.SSID = string(body[i : i+elemLen])
                    i += elemLen
                }
                break
            case layers.Dot11InformationElementIDVendor:
                pr.VendorSpecific = body[i+1:]
                return
            default:
                elemLen := uint64(body[i])
                i += 1 + elemLen
                break
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      请注意,您不能像从信标或探测响应中那样仅从探测请求中解析 IE 的原因是,gopacket 本身实际上从未分配给 Dot11MgmtProbeReq 结构的 Payload 字段。参见Dot11MgmtBeaconDot11MgmtProbeResp 中的DecodeFromBytesDot11MgmtProbeReq 没有这种方法。将 gopacket 中的 Dot11MgmtProbeReq 替换为以下代码可解决此问题(尽管这对您来说可能有点过头了):

      type Dot11MgmtProbeReq struct {
          Dot11Mgmt
      }
      
      func decodeDot11MgmtProbeReq(data []byte, p gopacket.PacketBuilder) error {
          d := &Dot11MgmtProbeReq{}
          return decodingLayerDecoder(d, data, p)
      }
      
      func (m *Dot11MgmtProbeReq) LayerType() gopacket.LayerType  { return LayerTypeDot11MgmtProbeReq }
      func (m *Dot11MgmtProbeReq) CanDecode() gopacket.LayerClass { return LayerTypeDot11MgmtProbeReq }
      func (m *Dot11MgmtProbeReq) NextLayerType() gopacket.LayerType {
          return LayerTypeDot11InformationElement
      }
      func (m *Dot11MgmtProbeReq) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
          m.Payload = data
          return m.Dot11Mgmt.DecodeFromBytes(data, df)
      }
      

      一般来说,提取 IE 的一种直接方法是设置一个核心函数,将 IE 列表从当前帧传递到一个函数,该函数将所有相关元素解码为 map[string][]byte,其中字符串是人类可读的字符串的名称。这样,可以在特定情况下请求任何特定于帧的字段。 (您需要编写一个 map[layers.Dot11InformationElementID]string` 来执行此操作)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-06
        • 1970-01-01
        • 1970-01-01
        • 2017-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多