首页
社区
课程
招聘
[原创]时间校对:UDP发NTP协议封包来获取时间(1,NTP协议格式)
发表于: 2014-9-24 18:39 10506

[原创]时间校对:UDP发NTP协议封包来获取时间(1,NTP协议格式)

2014-9-24 18:39
10506

网络上很多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


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 3
支持
分享
最新回复 (1)
雪    币: 231
活跃值: (2631)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
不错
2018-1-23 17:19
0
游客
登录 | 注册 方可回帖
返回
//