最近在研究飞鸽协议。飞鸽的上下线的原理很简单,就是,当第一次上线时,会在局域网内广播一条消息,所有在线的飞鸽用户在收到广播的上线消息后,都要回复一条消息,这样,就完成了新上线用户和已上线用户的用户列表的更新,也就是都有了相互的信息。而下线时,则广播一条下线消息,接收方在收到后,将相应的用户从用户列表中删除。
由于飞鸽版本众多,比如飞秋,同是飞秋团队所写的飞鸽传书等等,经过分析发现,具体的版本中的信息内容有些差异,于是,抓包分析。分析的飞鸽类型软件有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。可以看出命令的定义还是有变化。看来若想自己写出的程序既兼容标准飞鸽又能兼容飞秋,需要对这些做一定处理。