-
-
[原创]时间校对:UDP发NTP协议封包来获取时间(1,NTP协议格式)
-
发表于:
2014-9-24 18:39
10506
-
[原创]时间校对:UDP发NTP协议封包来获取时间(1,NTP协议格式)
网络上很多NTP协议的介绍以及解析.但是真正使用起来还是比较蛋疼的.
我研究半天.折腾出来一个结构
如下:
typedef struct ntptime_t
{
UINT dwHighDateTime;
UINT dwLowDateTime;
}ntptime;
typedef struct _NTPPack
{
UCHAR NtpHead;
//NTP头 11011001
//11:NTP状态,2bit场,11为3,即告警,即等待同步
//011:NTP版本,3ibt长,此处为11即为版本3
//001:Mode,含义:0未定义、001表示主动对等体模式、010表示被动对等体模式、011表示客户模式、100表示服务器模式、101表示广播模式或组播模式、110表示此报文为NTP控制报文、111预留给内部使用。
UCHAR Stratum;
//时间精度,填0或16,正确取值范围为1~16,1精度最高 16即不做参考(填0也一样)
UCHAR Poll;
//轮询时间,即两个ntp报文的间隔,填0x0a即可
UCHAR Precision;
//系统时间精度,填0xfa
ULONG RootDelay;
//本地到主参考时钟源的往返时间。htonl(1<<16)
ULONG RootDispersion;
//系统时钟相对于主参考时钟的最大误差.htonl(1<<16)
ULONG ReferenceId;
//时钟源ID标识,发送方填0即可
ntptime ReferenceTime;
//系统上次同步时间的时间戳,发送方填0即可
ntptime OriginateTime;
//NTP请求报文离开发送端时发送端的本地时间,发送方填0
ntptime ReceiveTime;
//NTP请求报文到达接收端时接收端的本地时间,发送方填0
ntptime TransmitTime;
//应答报文离开应答者时应答者的本地时间。发送方填0
}NTPPack,*PNTPPack;
发包和回包的格式理论上是一致的
上面是标准的NTP报文.但是NTP可以"夹带私货",这个私货是用于数据校验的,因为UDP的不确定性.所以使用附加数据来校验数据是否是我们想要的数据
这个私货的长度是128位,也就是16字节..
我们可以
typedef struct _SendNTPPack
{
NTPPack ntp;
//ULONG Key;
char[16] AddData;//附加数据
}SendNTPPack,PSendNTPPack;
来附加我们的数据
当然.这个也可以用于下载文件.比如在adddata部分填入二进制之类的..
NTP协议貌似有加密版本.这个时候就需要在adddata前面加个ULONG的值来当密钥..(不知道怎么用.)
顺便提一句.如果NTP服务器可控,那么可以使用附加数据部分来穿越大多数防火墙执行远程指令(参考ICMP隧道)
按上面的方法组包.发送到对方服务器的123端口.即可获取一个回复包.
回包我们只要一个TransmitTime就可以了,但是这个64位长度的值可不是那么容易用的..
http://blog.shajincheng.com/post/91.html
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!