如何使用pcap解压NTP UDP数据包

How to unpack NTP UDP packet using pcap

我可以使用

读取 UDP 数据包
void my_callback(u_char *useless, const struct pcap_pkthdr* pkthdr, const u_char* packet) 

我的数据包有 hexa 输出:

08 00 27 E5 B5 3B 52 54 00 12 35 02 08 00 45 00 00 4C 7C E7 00 00 40 11 3C 28 5B BD 59 C6 0A 00 02 0F 00 7B 00 7B 00 38 B7 9D 24 02 03 E8 00 00 04 A8 00 00 07 51 83 BC 03 DC DC C5 CC 47 F1 F1 69 C3 DC C5 CF 37 D2 5F A7 F5 DC C5 CF 38 3C 2D C2 CF DC C5 CF 38 3C 32 0B 9A

我知道,它是 NTP 数据包。

如何提取数据?切割以太网帧等..

感谢您的帮助。

我正在使用 pcap c++​​。

如果您读取 pcap,您会从网络设备获取原始数据包。可能有几个选项:

  • 从以太网设备读取数据包
  • 从vlan设备读取数据包
  • 从其他设备读取数据包

在 pcap 期间使用哪种设备定义了数据包中第一个协议 header。要了解它,您可以查看全局 pcap header.

的 link 层类型字段

一旦你定义了第一个协议 header 你需要打开协议规范并找到:

  • header 的大小(在您的情况下,它看起来像普通的以太网 header - 14 字节 08 00 27 E5 B5 3B 52 54 00 12 35 02 08 00
  • 如何找到封装的数据包类型(在你的情况下,最后 08 00 表示 IP)

找到 IP header (45 00 00 4C 7C E7 00 00 40 11 ...) 后,您可以确定 IP header 长度:

    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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |Version|  IHL  |Type of Service|          Total Length         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |         Identification        |Flags|      Fragment Offset    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Time to Live |    Protocol   |         Header Checksum       |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                       Source Address                          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Destination Address                        |

这里你需要:

  • 国际人道法定义 IP 大小 header。这是 IP header 第一个字节的低 4 位。在你的情况下它是 0x5。这意味着 5 个字或 20 个字节。
  • 协议定义了 IP header 中封装的数据。在你的情况下 0x11 (IPPROTO_UDP)

之后你可以得到 UDP header (8 bytes) 如果你需要它检查端口并根据 NTP 规范解析 NTP header

在您的示例中,NTP header 的总偏移量将为 14+20+8 字节。