注意,您不能像从信标或探测响应中那样仅从探测请求中解析 IE 的原因是,gopacket 本身从未实际分配给结构的Payload
字段Dot11MgmtProbeReq
。参见Dot11MgmtBeacon和Dot11MgmtProbeResp;DecodeFromBytes
_ Dot11MgmtProbeReq没有这样的方法。用以下代码替换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` 来执行此操作)。