2

我尝试发送请求身份 EAPoL 数据包:

func eapol_requestIdentity(handle *pcap.Handle, iface *net.Interface, id uint8) error {
    
        len := uint16(5) // eap1 field length
    
        eap1 := layers.EAP{
            Code: layers.EAPCodeResponse,
            Id:   id,
            Type: layers.EAPTypeIdentity,
            TypeData: []byte{byte(layers.EAPTypeIdentity)}, // bugfix
            Length:   len,
        }
    
        eapol := layers.EAPOL{
            Version: 1,
            Type:    layers.EAPOLTypeEAP,
            Length:  eap1.Length,
        }
    
        eth := layers.Ethernet{
            SrcMAC:       iface.HardwareAddr,
            DstMAC:       net.HardwareAddr{0x01, 0x80, 0xc2, 0x00, 0x00, 0x03},
            EthernetType: layers.EthernetTypeEAPOL,
        }
    
        buf := gopacket.NewSerializeBuffer()
        opts := gopacket.SerializeOptions{
            //FixLengths:       true, // doesn't work
            FixLengths:       false,
            ComputeChecksums: true,
        }
    
        gopacket.SerializeLayers(buf, opts, &eth, &eapol, &eap1)
        log.Printf("send EOPoL : Request Identity %u...", id)
        if err := handle.WritePacketData(buf.Bytes()); err != nil {
            log.Printf("Send err ", err)
            return err
        }
        log.Printf("send packet [OK]")
    
        return nil
    }

我不明白:如果我删除 lineTypeData: [] byte{byte(layers.EAPTypeIdentity)}或 line Type: layers.EAPTypeIdentity,我的应用程序发送了错误的数据包。正常吗?...为什么我必须为数据包中的同一字节设置两次数据?

另外,我尝试将 FixLengths 设置为 true,但是长度字段在发送的数据包中是错误的......

4

1 回答 1

0

我不是很熟悉,EAP但根据RFC,是两个不同的领域:TypeType-Data

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Code      |  Identifier   |            Length             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Type      |  Type-Data ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-

因此,如果您遗漏了一部分数据包,那是“错误的”,这是理所当然的。

至于长度,gopacket 在计算长度时似乎存在错误。根据RFC

Length 字段是两个八位字节,指示 EAP 数据包的长度,包括 Code、Identifier、Length、Type 和 Type-Data 字段

但是什么时候FixLengthstruegopacket只计算TypeType-Data

if opts.FixLengths {
  e.Length = uint16(len(e.TypeData) + 1)
}

+1应该是,+5所以看起来你发现了一个错误。

编辑:看起来您已经填写了错误报告:https ://github.com/google/gopacket/issues/931

于 2022-01-18T17:50:10.783 回答