首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用gopacket解析802.11探测请求帧中信息元素

如何用gopacket解析802.11探测请求帧中信息元素
EN

Stack Overflow用户
提问于 2020-01-17 16:20:46
回答 2查看 368关注 0票数 2

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

代码语言:javascript
复制
for _, layer := range packet.Layers() {
    if layer.LayerType() == layers.LayerTypeDot11InformationElement {
        dot11info, ok := layer.(*layers.Dot11InformationElement)
        }
}

但是gopacket不支持解析探测请求帧中的信息元素。我只能使用packet.Layer(layers.LayerTypeDot11MgmtProbeReq).(*layers.Dot11MgmtProbeReq)来获取内容和有效负载,信息元素在此内容中。

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

EN

回答 2

Stack Overflow用户

发布于 2020-01-18 01:18:36

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

解析器如下所示:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2020-03-05 17:50:27

需要注意的是,你不能像从信标或探测响应中那样直接从探测请求中解析IE的原因是因为gopacket本身从未真正赋值给Dot11MgmtProbeReq结构的Payload字段。参见Dot11MgmtBeaconDot11MgmtProbeResp中的DecodeFromBytesDot11MgmtProbeReq没有这样的方法。将gopacket中的Dot11MgmtProbeReq替换为以下代码可以修复此问题(尽管这对您来说可能有些夸张):

代码语言:javascript
复制
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`来完成此操作)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59783521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档