Chinaunix首页 | 论坛 | 博客
  • 博客访问: 539582
  • 博文数量: 120
  • 博客积分: 3030
  • 博客等级: 中校
  • 技术积分: 1445
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-05 01:00
文章存档

2011年(1)

2009年(2)

2008年(32)

2007年(33)

2006年(52)

我的朋友

分类: LINUX

2008-12-12 15:48:11

MSN协议分析

一、概要介绍
msn messenger通常使用端口1863进行通信(在实际中用sniff跟踪发现msn通信都是用1863端口进行通信的)。在msn messenger工作中,本机客户端与三种服务器通过协议进行通信和数据交换。(dispatch服务器、notification服务器tchboard服务器)。在本机客户端和各服务器之间主要通过两种形式的进行通信,一种是命令,另一种是消息。
dispatch服务器主要用于初始化连接服务器。用户首先利用地址messenger.hotmail.com 和端口 1863连接dispatch服务器,然后根据再返回的ip地址和端口来连接notification服务器。
notification服务器是msn messenger的主工作区,几乎所有的操作都要与notification服务器进行连接和信息交换,包括用户的状态改变、聊天请求以及来信通知。实际在工作中notification服务器的ip地址和端口固定为64.4.13.195:1863。 command:多数数据是以标准的命令格式发送的。标准的命令格式主要由三部分组成,以命令标识符开始,然后是参数,以换行为结束。参数之间以空格区分。
message:是一种独特的命令方式。它以msg开头,每个消息的第一行的末尾以一个数字来表示消以下部分息的字节数(包括mime头和主体部分)。第二行为mime的头,一般形式为mime-version: 1.0,以换行结束。下一行所代表的是要发送消息的类型,定义的格式为content-type: */*; charset=utf-8,其中*/*代表消息类型,charset=utf-8是完全可选的,与是否使用该参数与定义的消息类型有关。随后mime头以两个换行结束,用于区分消息主体。
transaction id:在客户端向服务器端发送的每个命令和消息中都包含一个transaction id。其位于命令标识符和msg后面,服务器端收到客户端的相应命令和消息后,回应客户端时把对应的transaction id返回给客户端,客户端根据transaction id来判断服务器回应的是哪个请求。每次客户端向服务器发送一次命令或消息后,transaction id自动加1。
二、启动msn
初始化连接
(1) 连接的第一步是连接dispatch服务器。打开一个tcp socket,通过ip地址messenger.hotmail.com和1863端口连接dispatch服务器。
(2) 当连接dispatch服务器成功后,本机客户端向dispatch服务器发送一个ver命令,以msnp7 msnp6 msnp5 msnp4 cvr0(协议版本)作为参数。服务器收到请求后,同样返回ver命令,如果参数为0,表示协商失败。
(3) 本机客户端收到回复后,向服务器发送一个无参数的inf请求,请求一个认证算法。当dispatch服务器收到后返回md5。
(4) 本机客户端根据返回的参数向服务器发送usr命令,其中传入两个参数,第一个为服务器返回的md5,第二个参数为客户申请登陆的电子邮件地址。服务器根据收到的请求返回一个xfr命令,把notification服务器的ip地址和端口作为参数返回给客户端。
(5) 最后客户端根据ip地址和端口去连接notification服务器。以下是客户端和dispatch服务器的实际通信过程。
connect: messenger.hotmail.com 1863
>>> ver 0 msnp7 msnp6 msnp5 msnp4 cvr0
<<< ver 0 msnp7 msnp6 msnp5 msnp4 cvr0
>>> inf 1
<<< inf 1 md5
>>> usr 2 md5 i
<<< xfr 2 ns 64.4.12.132:1863 0
disconnect

连接notification服务器
连接notification服务器成功后,前三步执行的操作与dispatch服务器相同。
(6) 同样本机客户端根据返回的参数向notification服务器发送usr命令,其中传入两个参数,第一个为notification服务器返回的md5,第二个参数为客户登陆的电子邮件地址。服务器收到请求后返回usr ,包含两个参数 md5 s #.#。 #.# 为 md5 hash。
(7) 客户端根据收到的答复后再次发送一个usr,参数为md5 s #。其中#为上次服务器返回的md5 hash的小写16进制。服务器收到后返回usr,参数为ok user@host name 1。user@host为用户登陆的电子邮件地址,name为用户的映射名。
(8) 当用户成功登陆msn后,客户端向服务器发送一个chg请求,请求服务器修改新登陆用户的状态,参数为nln。参数nln表示在线,这是每个用户登陆后需要做的第一步初始化用户状态。以下为notification服务器与客户端之间的通信过程。
connect: 64.4.12.132 1863
>>> ver 3 msnp7 msnp6 msnp5 msnp4 cvr0
<<< ver 3 msnp7 msnp6 msnp5 msnp4 cvr0
>>> inf 4
<<< inf 4 md5
>>> usr 5 md5 i
<<< usr 5 md5 s 1013928519.693957190
>>> usr 6 md5 s 23e54a439a6a17d15025f4c6cbd0f6b5
<<< usr 6 ok my%20screen%20name 1
>>> chg 7 nln
<<< chg 7 nln
continue session . . .


三、语音对话
通信过程
(1) 本机客户端向notification服务器(64.4.13.195:1863)请求两个新tchboard服务器地址,其中一个用于发送请求,另一个用于接受回复。如下面表格所示:

secondary connection port range protocol type direction info
6891-6900 tcp inbound sending
6891-6900 tcp outbound receiving

客户端通过tcp向服务器发送xfr命令,参数为sb。notification服务器收到请求后,同样以xfr命令返回,参数中包tchboard服务器的ip地址和端口以tchboard服务器的登陆序号。如下例所示:
>>> xfr 10 sb
<<< xfr 10 sb 64.4.12.193:1863 cki 16925950.1016955577.17693
(2) 客户端根据返回的ip地址和端口好,通过tcp协议连接两tchboard服务器。
(3) 连接成功后,客户端分别向两tchboard服务器发送usr命令,第一个参数为实际连接的电子邮件地址,第二个参数为第二步骤返回tchboard服务器登陆序号。如果发送成功,tchboard服务器返回usr命令,第一个参数为ok。如下例所示:
>>> usr 1 16925950.1016955577.17693
<<< usr 1 ok mike
(4) 当邀请对方对话时,把对方的注册的电子邮件地址作为参数传递到cal命令中,然后发送tchboard服务器,收到该请求后,服务器返回一个id号。同时服务器又向客户端发送joi命令,把被请求方的电子邮件地址作为第一个参数。如下例所示:
>>> cal 2
<<< cal 2 ringing 11752099
<<< joi name_123
以上步骤都是本机客户端与两tchboard服务器之间同时进行,都执行了以上所有的步骤。
(5) 当客户要进行语音对话时,本机客户端向发送请求tchboard服务器发送一个请求(假设tchboard服务器的ip地址:64.4.12.192,端口:1863)。该请求的格式如下例所示:
msg 4 n 277
mime-version: 1.0
content-type: text/x-msmsgsinvite; charset=utf-8
application-name: 请求服务类型
application-guid: {5d3e02ab-6190-11d3-bbbb-00c04f795683}
session-protocol:sm1
context-data:
requested:sip_a; capabilities: sip_a,sip_v
invitation-command: invite
…………
(6) 服务器64.4.12.192收到该请求后,回复ack,表示确定已收到该请求。
(7) 当被请求方接受你的语音对话邀请后,回复tchboard服务器(假设为ip地址:64.4.12.159,端口:1863)向本机客户端发送回复,其回复格式如下:
msg name_123
mime-version: 1.0
content-type: text/x-msmsgsinvite; charset=utf-8
invitation-command: accept
…………
ip-address:返回被请求方的ip地址
(8) 当本机收到该回复后,向服务器64.4.12.159发送一个消息,其格式如下:
msg 4 a 237
mime-version: 1.0
content-type: text/x-msmsgsinvite; charset=utf-8
invitation-command: accept
…………
ip-address:本机的ip地址和端口
(9) 服务器64.4.12.159收到该消息后,返回一个ack命令,表示确认已收到。
(10) 然后由被请求方根据本机客户端的ip地址和端口进行udp连接,进行数据传递。
四、发送文件
通信过程
(1) 文件操作的通信过程与语音对话前四步相同,但发送文件操作只申请一tchboard服务器(假设ip地址:64.4.12.164,端口:1863)。
(2) 当客户要进行文件发送时,本机客户端向服务器64.4.12.164发送一个请求,其格式如下:
msg 4 n 277
mime-version: 1.0
content-type: text/x-msmsgsinvite; charset=utf-8
application-name: file transfer
application-guid: {5d3e02ab-6190-11d3-bbbb-00c04f795683}
invitation-command: invite
invitation-cookie: 33267
application-file: readme.txt
application-filesize: 60904
(3) 服务器64.4.12.164收到该请求后,等被请求方用户接受该请求后返回给本机客户端一个答复,其格式如下:
msg tim 179
mime-version: 1.0
content-type: text/x-msmsgsinvite; charset=utf-8
invitation-command: accept
invitation-cookie: 33267
launch-application: false
request-data: ip-address:
注意:其中最后一行包含了对本机ip地址和端口号的请求。
(4) 本机收到该回复后,立刻向服务器64.4.12.164发送一个消息,其格式如下:
msg 4 n 238
mime-version: 1.0
content-type: text/x-msmsgsinvite; charset=utf-8
invitation-command: accept
invitation-cookie: 33267
ip-address: 10.44.102.65
port: 6891
authcookie: 93301
launch-application: false
request-data: ip-address:
注意:该消息中包含了本机的ip地址和端口。
(5) 然后由被请求方根据本机客户端的ip地址和端口进行tcp连接,进行文件发送。
五、视频对话
通信过程
视频对话的通信过程与语音对话相同,同样申请两tchboard服务器,最后通过udp进行连接,进行数据传送。
六、发送即时消息
发即时消息
发送即时消息的通信过程与语音对话前四步相同,但只申请一tchboard服务器(假设ip地址:64.4.12.174,端口:1863)。完成上述四步操作,完成对服务器64.4.12.174的连接后,如果本机客户端要向另一个客户端发送即时消息,就会向服务器64.4.12.174发送一个消息,消息中附带要发送的内容,其格式如下:
msg 3 a 157
mime-version: 1.0
content-type: text/plain; charset=utf-8
x-mms-im-format: fn=microsoft%20sans%20serif; ef=i; co=000000; cs=0; pf=22

hello! how are you?
注:最后一行为发送的内容。
收即时消息
如果有一个客户端向你本机发送即时消息,则通过服务器64.4.12.174,即连接本机客户端tchboard服务器发送一个消息,其消息格式如下:
msg mike 157
mime-version: 1.0
content-type: text/plain; charset=utf-8
x-mms-im-format: fn=microsoft%20sans%20serif; ef=i; co=000000; cs=0; pf=22

hello! how are you?
注:第一行msg命令后的参数为对方客户端的电子邮件地址,最后一行为发送内容。
七、启动白板
通信原理
(1)其通信原理与语音对话通信原理前几步骤基本一致,但在第8步的时候有所不同,本机向服务器(64 .4.12.160:1863)发送的消息中并不包括本机的端口号,只返回了一个ip地址,其结构所示如下:
msg 4 a 237
mime-version: 1.0
content-type: text/x-msmsgsinvite; charset=utf-8
invitation-command: accept
…………
ip-address:本机的ip地址
(2)随后服务器64 .4.12.160回复ack。
(3)本机客户端向notification服务器(64.4.13.195:1863)发送一个qry请求,确定是否保持和服务器64.4.13.195的连接。
(4)服务器64.4.13.195返回一个无参数的命令qry,表示确定。
(5)然后由服务器64 .4.12.160发送一个消息,其结构如下所示:
msg name_123
mime-version: 1.0
content-type: text/x-msmsgsinvite; charset=utf-8
invitation-command: context
context-data:10.1.1.211:13374
…………
注:在context-data选项中包含了被请求方的ip地址和端口号
(6) 本机向被请求方进行tcp连接,随后进行数据交换。
八、启用应用程序共享
其通信过程与启用白板相同。
九、发现问题
由于通过上网查找的有关msn文档和资料相对有点早,与现在所用的版本有差别,所以在一些细节方面还是有所不同的,比如在实践中用sniff跟踪数据包发现先行版本的msn在启动的时候并没有进行初始化连接dispatch服务器,而是直接与notification服务器进行连接。notification服务器的ip地址和端口也不是由dispatch服务器返回的,而是已经实际指定了(64.4.13.195:1863)。
十、解决方法
获取ip地址和端口
(1)首先根据notification服务器(64.4.13.195:1863),本机客户端与服务器64.4.13.195:1863之间会建立一条连接。
(2)用户新开一个窗口进行操作时,本机客户端会向服务器64.4.13.195:1863请tchboard服务器的ip地址和端口,然后根据返回tchboard服务器的ip地址和端口建立一条连接。我们可以根据服务器64.4.13.195:1863返回的数据包获取请求tchboard服务器的ip地址和端口。服务器以命令形式返回,其格式如下:xfr 10 sb 64.4.12.193:1863 cki 16925950.1016955577.17693。我们可以根据命令行关键字xfr来截取这个包,然后解tchboard服务器的ip地址和端口。
(3)tchboard服务器与客户端连接成功后,在操作之前本机客户端会tchboard服务器发送一个消息,邀请另一方加入。如果对方接受你的邀请,则会tchboard服务器向你发送一个消息,接受你的邀请。在消息中会有一个关键字ip-address,其可能会包含着对方的ip地址和端口或只有ip地址。如果包含端口号则用“:”区分。如果在选项ip-address中没有包含端口,则需查找另一个关键字port,其可能存在端口号(发送文件返回的消息中存在这个关键字,其余的操作中好象没有发现)。
(4)当本机客户端收tchboard服务器的回复后,再次回复一个消息。其中同样可能包含着本机的ip地址和端口,因此需要向上述步骤3一样进行分析,获取本机的ip地址和端口。启用白板功能例外,本机客户端返回的ip地址和端口存放在消息的context-data选项中。最后由本机和被邀请方之间建立一条连接。在msn通信过程中所有的消息都是由msg开头的。截获数据包后先分析第一行是否以msg开头,然后再从消息中查找关键字ip-address、port和context-data,从中获取要建立连接的ip地址和端口。
区分建立的连接是tcp还是udp
在msn中只有语音对话和视频对话的连接是udp的。首先客户端会向服务器发送一个操作请求数据包,包中存在一项数据指明了请求的操作类型,其关键字以application-name开头,随后为相关数据以ascii 码表示。语音对话和视频对话ascii 码相同,都为3a 20 e8 af ad e9 9f b3 e5 af b9 e8 af 9d 0d 0a,其中3a 20为冒号和空格,0d 0a为回车和换行。只要截取这段数据就能获取请求的操作类型。application-name只存在一次,只有第一次发请求操作时包含这项,以后就这项数据就不存在了。服务器返回ip地址和端口时为了便于区分到底是哪个操作请求需要建立的连接,因此在数据包中还存在一项为invitation-cookie,其内容为一串随机生成的数字。在服务器返回的数据包中都把这项数据返回给客户端,因此客户端可以根据返回的id区分具体是哪个操作请求的ip地址和端口。根据application-name和invitation-cookie,我们就可以区分随后建立的连接是哪个操作请求的以及建立的连接是tcp还是udp。
注:此外其它操作类型对应的ascii 码分别为:
文件传输:3a 20 e6 96 87 e4 bc a0 e8 be 93 0d 0a
启用白板:3a 20 e7 99 bd e6 9d bf 0d 0a
寻求远程协助:3a 20 e8 bf 9c e7 a8 8b e5 8d 8f e5 8a a9 0d 0a
启用应用程序共享:3a 20 e5 ba 94 e7 94 a8 e7 a8 8b e5 ba 8f e5 85 b1 e4 ba ab 0d 0a
此外发送消息没有该项数据内容。
阅读(1566) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~