Gopacket支持解析beacon和probe响应帧中的信息元素,如下所示:
for _, layer := range packet.Layers() {
if layer.LayerType() == layers.LayerTypeDot11InformationElement {
dot11info, ok := layer.(*layers.Dot11InformationElement)
}
}但是gopacket不支持解析探测请求帧中的信息元素。我只能使用packet.Layer(layers.LayerTypeDot11MgmtProbeReq).(*layers.Dot11MgmtProbeReq)来获取内容和有效负载,信息元素在此内容中。
那么如何解析探测请求帧中的这些信息元素呢?
发布于 2020-01-18 01:18:36
我相信你必须自己写。您已经尝试过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
}
}
}发布于 2020-03-05 17:50:27
需要注意的是,你不能像从信标或探测响应中那样直接从探测请求中解析IE的原因是因为gopacket本身从未真正赋值给Dot11MgmtProbeReq结构的Payload字段。参见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,其中string是该字符串的人类可读名称。这样,任何帧特定的字段都可以在其特定情况下被请求。(您需要编写一个maplayers.Dot11InformationElementIDstring`来完成此操作)。
https://stackoverflow.com/questions/59783521
复制相似问题