使用golang进行NTP检测,有效负载空无一人

时间:2017-03-15 06:56:33

标签: go network-protocols ntp gopacket

我正在使用golang和gopacket包检测NTP。我正在使用从wireshark下载的pcap。我有以下代码用于打开PCAP并处理它们:

func (d *DPI) readPCAP(pcapFile string) (*pcap.Handle, error) {
    // Open file instead of device
    handle, err := pcap.OpenOffline(pcapFile)
    if err != nil {
        return nil, err
    }
    return handle, nil
}

这是我正在编写的用于执行实际检测的代码

func TestNTP(t *testing.T) {



    dpi := newDPI()
    handle, _ := dpi.readPCAP("data/pcap/NTP_sync.pcap")

    var filter = "udp and port 123"
    dpi.setFilter(handle,filter)
    ntpPackets := 0

    for packet := range dpi.getPacketChan(handle) {
        fmt.Println("stuff: ",packet.ApplicationLayer().Payload())
        if dpi.detectNTP(packet) == 1 {
            ntpPackets++
        } else {
            fmt.Println(" Output : ", dpi.detectNTP(packet))
        }
    }
    fmt.Println(" Total ntp packets ", ntpPackets)


}

ApplicationLayer中的Payload内容空了,我无法弄清楚为什么会发生这种情况。

我打印出ApplicationLayer本身的示例屏幕截图:

https://i.gyazo.com/6257f298a09e7403bbc0be5b8ac84ccc.png

打印Payload时的示例屏幕截图: https://i.gyazo.com/7f4abd449025f5d65160fdbecffa8181.png

可以使用一些帮助来弄清楚我做错了什么。 谢谢!

1 个答案:

答案 0 :(得分:1)

通过golang soure代码阅读,我发现了这个:

// NTP packets do not carry any data payload, so the empty byte slice is retured.
// In Go, a nil slice is functionally identical to an empty slice, so we
// return nil to avoid a heap allocation.
func (d *NTP) Payload() []byte {
    return nil
}

所以,显然它不应该携带有效载荷。我已设法使用图层执行检测。