Как проанализировать информационный элемент во фрейме запроса зондирования 802.11 с помощью gopacket - PullRequest
0 голосов
/ 17 января 2020

Gopacket поддерживает синтаксический анализ информационных элементов в кадрах ответа маяка и зонда, например:

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

Но gopacket не поддерживает анализ информационных элементов в кадре запроса зонда. Я могу использовать только packet.Layer(layers.LayerTypeDot11MgmtProbeReq).(*layers.Dot11MgmtProbeReq) для получения содержимого и полезной нагрузки, а информационные элементы находятся в этом содержимом.

Итак, как я могу проанализировать эти информационные элементы во фрейме пробного запроса?

Ответы [ 2 ]

0 голосов
/ 05 марта 2020

В порядке, причина того, что вы не можете просто анализировать IE по проверочным запросам, как по маякам или по проверочным ответам, заключается в том, что сам gopacket фактически никогда не присваивается полю Payload структуры Dot11MgmtProbeReq. См. DecodeFromBytes в Dot11MgmtBeacon и Dot11MgmtProbeResp ; Dot11MgmtProbeReq не имеет такого метода. Замена Dot11MgmtProbeReq из gopacket с помощью следующего кода решает эту проблему (хотя это может быть излишним для вас):

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, где строка - это удобочитаемое имя для строки. Таким образом, любые специфичные для фрейма поля c могут быть запрошены в их конкретных c случаях. (Для этого нужно написать карту [layer.Dot11InformationElementID] string`).

0 голосов
/ 17 января 2020

Я считаю, что ты должен написать сам. Вы уже пробовали эту реализацию?

Парсер выглядит следующим образом:

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
        }
    }
}
...