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

时间:2017-05-16 20:08:46

标签: sockets udp 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 ++。

1 个答案:

答案 0 :(得分:0)

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

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

在pcap期间使用什么类型的设备定义数据包中的第一个协议头。要了解它,您可以查看全局pcap标题的链接层类型字段。

一旦定义了第一个协议头,就需要打开协议规范并找到:

  • 标题的大小(在您的情况下,它看起来像常规的ethenet标题 - 14个字节08 00 27 E5 B5 3B 52 54 00 12 35 02 08 00
  • 如何查找封装的数据包类型(在您的情况下,最后08 00表示IP)

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

    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                        |

您需要:

  • IHL定义IP标头的大小。这是IP报头的第一个字节的低4位。在你的情况下它是0x5。这意味着5个字或20个字节。
  • 协议定义IP头中封装的数据。在你的情况下0x11(IPPROTO_UDP)

之后,如果需要,可以获得UDP头(8字节)检查端口,并根据NTP规范解析NTP头。

在您的示例中,NTP标头的总移位将为14 + 20 + 8字节。