Обнаружение NTP с использованием golang, полезные данные появляются пустыми
Я работаю над обнаружением NTP с помощью golang и пакета gopacket. Я использую PCAP, который я скачал с Wireshark. У меня есть следующий код для открытия 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)
}
Содержание Payload в ApplicationLayer выходит пустым, и я не могу понять, почему это происходит.
Пример снимка экрана, когда я распечатываю сам ApplicationLayer:
https://i.gyazo.com/6257f298a09e7403bbc0be5b8ac84ccc.png
Пример снимка экрана, когда я распечатываю полезную нагрузку: https://i.gyazo.com/7f4abd449025f5d65160fdbecffa8181.png
Могу воспользоваться какой-то помощью, чтобы выяснить, что я делаю неправильно. Спасибо!
1 ответ
Читая кодекс Голанга, я наткнулся на это:
// 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
}
Таким образом, очевидно, что он не должен нести полезную нагрузку. Мне удалось выполнить обнаружение с использованием слоев.