飞鸽协议分析之上下线报文分析

来源:互联网 发布:unity3d ulua 教程 编辑:程序博客网 时间:2024/05/21 14:00

     最近在研究飞鸽协议。飞鸽的上下线的原理很简单,就是,当第一次上线时,会在局域网内广播一条消息,所有在线的飞鸽用户在收到广播的上线消息后,都要回复一条消息,这样,就完成了新上线用户和已上线用户的用户列表的更新,也就是都有了相互的信息。而下线时,则广播一条下线消息,接收方在收到后,将相应的用户从用户列表中删除。

     由于飞鸽版本众多,比如飞秋,同是飞秋团队所写的飞鸽传书等等,经过分析发现,具体的版本中的信息内容有些差异,于是,抓包分析。分析的飞鸽类型软件有3种:飞秋,还有飞秋版飞鸽,还有就是标准飞鸽协议版本的飞鸽。

     先对标准飞鸽协议进行说明。(飞鸽协议发送消息使用UDP协议,传输文件使用TCP协议)

标准飞鸽协议的格式是:
Ver(1): PacketNo:SenderName:SenderHost:CommandNo:AdditionalSection

每部分分别对应为:版本号(现在是1):数据包编号:发送主机:命令:附加数据

其中:

数据包编号,一般是取毫秒数。利用这个数据,可以唯一的区别每个数据包;

SenderName指的是发送者的昵称

发送主机,指的是发送主机的主机名;

命令,指的是飞鸽协议中定义的一系列命令,具体见下文;

 附加数据,指的是对应不同的具体命令,需要提供的数据。

 

举一个标准飞鸽报文例子。

1:100:shirouzu:jupiter:32:Hello

表示 shirouzu用户发送了 Hello 这条消息(32对应为IPMSG_SEND_MSG这个命令,具体需要看源码中的宏定义)。

 

下面进行抓包分析

1、飞秋上线报文抓取


     运行飞秋后,飞秋第一次上线时,发送了2个UDP广播报文,也就是地址为255.255.255.255的UDP数据包:

                                                                                                                                 1_lbt4

0030 5f 30 23 31 33 31 23 38  43 41 3938 32 39 32 41   _0#131#8 CA98292A

0040 30 31 36 23 33 33 33 38  23 30 2330 3a 31 33 32   016#3338 #0#0:132

0050 38 39 31 32 33 33 30 3a  63 63 663a 53 75 44 61   8912330: ccf:SuDa

0060 2d 32 30 31 31 30 35 30  31 47 593a 30 3a 00      -2011050 1GY:0:.

 分析:这个报文无用命令字0,表示不作任何操作。

 

                                                                                                                                 1_lbt4

0030 5f 30 23 31 33 31 23 38  43 41 3938 32 39 32 41   _0#131#8 CA98292A

0040 30 31 36 23 33 33 33 38  23 30 2330 3a 31 33 32   016#3338 #0#0:132

0050 38 39 31 32 33 33 31 3a  63 63 663a 53 75 44 61   8912331: ccf:SuDa

0060 2d 32 30 31 31 30 35 30  31 47 593a 36 32 39 31   -2011050 1GY:6291

0070 34 35 37 3a b3 c2 b3 cb  b7 bd 0043 53 49 49 cd   457:.... ...CSII.

0080 f8 d2 f8 00                                       ....   

分析: 这个是飞秋的上线报文。

 

2、使用飞秋版的飞鸽上线报文抓取

飞秋版飞鸽上线时也发送2个UDP广播报文:

                                                                                                                            1:1328

0030 39 31 32 38 37 39 3a 63  63 66 3a53 75 44 61 2d   912879:c cf:SuDa-

0040 32 30 31 31 30 35 30 31  47 59 3a30 3a 00         20110501 GY:0:.

 分析:跟飞秋一样,这个报文什么都不作。

 

                                                                                                                           1:1328

0030 39 31 32 38 38 30 3a 63  63 66 3a53 75 44 61 2d   912880:c cf:SuDa-

0040 32 30 31 31 30 35 30 31  47 59 3a36 32 39 31 34   20110501 GY:62914

0050 35 37 3a 63 63 66 00 00                                                 57:ccf.. 

 分析:上线报文,跟飞秋上线报文的区别就在于第一部分,也就是协议版本部分

 

 3、飞秋版飞鸽点击刷新后报文抓取

点刷新时,先发的2个包:

                                                                                                                             1:1328

0030 39 31 30 37 30 31 3a 44  45 4c 4c3a 44 45 4c 4c   910701:D ELL:DELL

0040 2d 50 43 3a 30 3a 00                                                     -PC:0:.   

 分析:这个报文什么都不作。

                                                                                                                               1:1328

0030 39 31 30 37 30 32 3a 44  45 4c 4c3a 44 45 4c 4c   910702:D ELL:DELL

0040 2d 50 43 3a 36 32 39 31  34 35 373a 44 45 4c 4c   -PC:6291 457:DELL

0050 00 00                                                                                   ..  

 分析:可以看出,点击刷新,其实就是重新发送了上线信息。


在同一个局域网的飞鸽,收到上线信息后,回复报文:

                                                                                                                              1:1328

0030 39 31 32 38 38 36 3a 63  63 66 3a53 75 44 61 2d   912886:c cf:SuDa-

0040 32 30 31 31 30 35 30 31  47 59 3a36 32 39 31 34   20110501 GY:62914

0050 35 39 3a 63 63 66 00 00                                                 59:ccf..   

 分析:这是一个上线报文的回复报文。

 

4、标准协议版本飞鸽上线报文抓取

标准飞鸽协议的飞鸽上线报文

                                                                                                                           1:1769

0030 39 34 33 38 31 33 3a 63  63 66 3a53 75 44 61 2d   943813:c cf:SuDa-

0040 32 30 31 31 30 35 30 31  47 59 3a31 3a 63 63 66   20110501 GY:1:ccf

0050 00                                                                                        .               

分析:可以看到,没有发送不做任何操作的报文,只发送了上线报文。 


 5、飞秋下线时的下线报文抓取

飞秋下线时发送的报文data部分:

                                                                                                                                1_lbt4

0030 5f 30 23 31 32 38 23 30  38 30 3032 37 41 43 46   _0#128#0 80027ACF

0040 34 30 36 23 30 23 30 23  30 23 322e 35 61 3a 31   406#0#0# 0#2.5a:1

0050 33 32 38 39 34 33 39 34  33 3a 6368 65 6e 3a 43   32894394 3:chen:C

0060 43 46 3a 36 32 39 31 34  35 38 3ab3 c2 b3 cb b7   CF:62914 58:.....

0070 bd 00 63 73 69 69 cd f8  d2 f800                                  ..csii.. ...

 分析:下线报文

 


综合分析

 

    飞秋兼容飞鸽协议,但飞秋在飞鸽协议的基础上做了一些改动,由于只测试分析了上下线的数据包,目前发现的改动有:

1、飞秋通过修改版本号部分进行了一些功能定制。从上述的抓包文件中可以看到飞秋数据包的版本信息比较长。
   分析飞鸽协议知道,飞鸽协议是由英文标点符号的冒号,进行分割的。


从上述的数据包中取出一个飞秋的协议字符串进行分析:

1_lbt4_0#131#8CA98292A016#3338 #0#0:1328912331: ccf:SuDa-2011050 1GY:6291 457:.... ...CSII.....

其中1_lbt4_0#131#8 CA98292A016#3338 #0#0就是飞秋的版本信息,可以看出和标准飞鸽的完全不同,至于其具体含义,现在我还没有研究,如果有知道的,可以说下哈。。

 

2、飞秋的命令跟飞鸽协议不太相同。

从上面数据包中进行分析,可以看出,飞秋在命令的定义上与标准飞鸽协议的定义也有不同在公布的IpMessage的C++源代码的头文件中,我们可以找到各个飞鸽的命令的定义,其中上下线的命令定义为

#define IPMSG_BR_ENTRY                        0x00000001UL         //上线

#define IPMSG_BR_EXIT                   0x00000002UL         //下线

#define IPMSG_ANSENTRY                        0x00000003UL         //通告在线

针对飞秋的协议,可以看到飞秋中上线的命令改为了6291457,转换为十六进制就是0x00600001,同样地飞秋的下线命令转化为十六进制为0x00600002,通告在线的命令字转化为十六进制是0x00600003。可以看出命令的定义还是有变化。看来若想自己写出的程序既兼容标准飞鸽又能兼容飞秋,需要对这些做一定处理。


http://blog.csdn.net/ccf0703/article/details/7254667