这一篇开始主要介绍MSN登录部分的协议分析,总体来说,登陆这一块是整个MSNP协议的一大块,也是比较复杂的一部分。整个登录的过程主要包括:连接服务器,身份验证,获取用户信息和联系人列表,把联系人列表发送给服务器,发送个人信息和状态,上线通知。我也打算按照登录的顺序去进行介绍。

这里我主要关注的是如何成功的登录,但是因为大多数都是抓包,也没有权威的官方资料参考,所以不能保证完全正确和详细,有些也不能给出合理的解释,但还是尽可能的介绍登录中会出现的各种情况,以及登录中用到的命令。

在使用命令之前,我们需要注意的时,普通命令后面都带有/r/n结尾。而palyload命令是根据数据长度找到结尾。我们在发送时必须注意这一点,如果发送的数据没有结尾标识,服务器会断开连接。另外发送的命令都需要以UTF8格式发送。

 

 

一 连接服务器

 

登录最终的目的是登录到NS服务器,与之建立连接并进行交互。一直到用户退出或注销时,才断开与服务器的连接。在登录到NS服务器之前,我们需要先连接到DS服务,并获得NS服务器的地址。

 

1 连接到DS服务器

 

DS服务器的地址是:messenger.hotmail.com ,端口号是1863在通过Socke连接之前需要对这个域名进行解析,而且解析的IP是不固定的,所以不建议使用固定的IP去连接DS服务器。以下是MSN Live 2009登录时和DS服务器之间的交互数据。

>>>VER 1 MSNP18 MSNP17 CVR0/r/n

<<<VER 1 MSNP18/r/n

>>>CVR 2 0x0804 winnt 5.1 i386 MSNMSGR 14.0.8089.0726 msmsgs test@live.cn/r/n

>>>USR 3 SSO I test@live.cn/r/n

<<<CVR 2 14.0.8089 14.0.8089 14.0.8089 http://msgruser.dlservice.microsoft.com/download/0/9/7/0974F7CD-D082-46FE-922D-806670345793/zh-chs/wlsetup-cvr.exe http://download.live.com/?sku=messenger/r/n

<<<XFR 3 NS 207.46.124.241:1863 U D/r/n

 

VER命令

这是和DS服务器发送的第一条消息,他是告诉服务器客户端支持的MSNP版本。MSNP版本功能在上一篇文章有所介绍,发送的版本号可以是多个版本。发送的版本号是区分大小写的。最后一个参数是CVR0,他实际是(CVQ, VER) 的命令集合,用来设置客户端版本,使得客户端能够升级。但具体作用不详,不发送也是可以的。最后要注意的是最后一个参数结尾要带上”/r/n”。服务器在接受到命令后,会从我们发送的协议版本中选一个他支持的最高本版,如果我们发送的协议版本他不支持,就返回一个0。目前最新的协议支持到了MSNP21。

 

CVR命令

这是是CVR命令的格式CVR trid lcid osName osVersion processorType clientName clientVersion [brandId] [userHandle]。聪从名字就能看出每个参数的作用。 lcid是地区编码,0x804表示的是中国。 clientVersion我们可以根据MSNP对应的官方版本来确定; brandID官方客户端是msmsgs ,最后一个就是登陆用户的账号。服务器会返回给你版本信息,最新的MSN下载地址,这些可以无视,我们又不是用MS的客户端。哈

继续阅读

近一个多月一直在做手机上一个MSN客户端的项目,目前项目也接近尾声。对于MSN的一套协议,有了一个大概的了解。之所以说是大概的了解,是因为文档基本没有,网络上大部分都是比较老的协议。唯一具有参考价值的是一个C#版的开源MSN和一份微软MSNP13的命令文档。更多的还是我们自己抓包进行分析,加上项目紧,没有时间对协议进行深入的分析。基本上是抓到什么用什么,用什么抓什么。呵呵。加之网络上基本上找不到完整的MSPN18协议的介绍,所以就打算写这一个系列,介绍自己了解到的一些东西。

在开始这一系列之前要感谢项目组的同事们,因为很多协议命令需要他们来给我讲解的。哈哈

 

 

一 MSNP

 

 

MSNP是MSN Protocol的缩写。对于聊天软件来说,实际就是用户和用户,用户和服务器之间的数据传输。协议就是数据传输的规则。在使用MSN时,为什么对方上线我们能知道,为什么对方更改头像我们能知道。因为他在进行这些操作时发送了一些数据通知服务器,而服务器接收到这些数据时,广播给他的好友,然后我们就接受到他上线的消息了。

所以微软定义了一套MSN使用的协议,也就是MSNP。MSNP的版本,目前最新的版本已经是MSNP21了,使用在最新的MSN 2011上。而目前使用的最多的客户端还是MSN 2009,他是基于MSNP18协议的。微软的服务器对以前的版本是兼容的,但是微软建议使用MSN8.1以上的版本,而MSN8.1是基于MSNP15协议开发的。

MSNP版本 对应MSN版本 更新概述
MSNP9 MSN Messenger 6.0 协议大多数的改都是了支持MSNC1(也成传输)。使用MSNP9接Messenger 服于MSNP8相差不大
MSNP11   版本协议引入了非常多的改,最重要的做出口令,以及如何排同的、已访问的、已改的和新增的列表。
MSNP12 MSN Messenger 7.5 协议没有太多功能改,除了系人型的概念,使MSNP12比MSNP11更能兼容MSNP13等高版本协议
MSNP13 Windows Live Messenger 8.0 协议基于MSNP12,但系人列表的方式与MSNP12不兼容。 MSNP13在普通服器上工作,地址:messenger.hotmail.com:1863。注意:如果需要做Yahoo!互操作性测试,需要支持MSNP14!MSNP13也引入的对离线消息的完全兼容(上一个版本的client不行)。
MSNP14 Windows Live Messenger 8.0.0792 协议主要改是与Yahoo!的互操作性。
MSNP15 Windows Live Messenger 8.1 协议基于MSNP14,但使用了不同的验证方式RPS(Relying Party Suite)/SSO。TWN(”Tweener”)验证方式用MSNP14及以下版本,RPS方式将使用在MSNP15及以上版本。也就是经历了最始的MD5方式,MSNP8以上的TWN方式后,新的MSN验证方式又出来了。    微软计划为新的验证机制增加更多的属性以支持用的漫游。也就是,用户显示的片,以及以后的【个人状消息】,无里登都是一的。    此外,位置的支持已添加到【个人状消息】功能中。尽管后来功能已从Windows Live Messenger 8.1 的客除。重要明:所有使用09607671-1C32-421F-A6A6-CBFAA51AB5F4用程序id的SOAP求都将返回500错误。因为该 id是来自于旧的beta客端且被微屏蔽了。应该使用来自Windows Live Messenger 8.5的id:CFE80F9D-180F-4399-82AB-413F33A1FA11 ,或者其它有效的SOAP求id。
MSNP16 Windows Live Messenger Beta 2009 14.0 该版本协议主要引入了多点登录机制(MPOP),允许一个用户在不同地点同时登录
MSNP18 Windows Live 2009 (final) 增加MSN群的支持。登录时增加了发送机器的GUID
MSNP19-21 Windows Live 2011 这个版本变动极大,完全改变了通信方式,不在使用SwitchBroad。使用的命令也有大量改

以上是对MSNP9到最新的MSNP21协议变化的一个介绍,这里并不打算详细介绍其中的变化,只需要简单的了解。对于MSNP19-21变动比较大。目前还不了解。

关于MSNP协议:http://www.hypothetic.org/docs/msn/general/overview.php 这里介绍的很详细,虽然协议版本比较老,但是大部分还是使用的,一开始觉得这个比较老,没有太大用处,最后还是老老实实的读了一遍,才发现有不少收获。

继续阅读