隨筆-22  評論-6  文章-17  trackbacks-0

          原作:bhw98

          前 言

          MSN Messenger 是Microsoft開發(fā)的聊天工具,目前在國內(nèi)擁有很大的用戶群。使用MSN Messenger可以與他人進行文字聊天,語音對話,視頻會議等即時交流,還可以通過此軟件來查看聯(lián)系人是否聯(lián)機等。該軟件的最新版本是6.1。

          1999年,Microsoft向IETF提交了一份"MSN Messenger Service 1.0 Protocol"草案,這是最初版本的MSN Messenger協(xié)議。在以后幾年,該公司不再公開有關(guān)MSN Messenger協(xié)議的升級、修改細節(jié)的官方文檔。但無論是開發(fā)第三方的聊天客戶端軟件(如Gaim, MyIM等),還是做協(xié)議分析,必須對其通信協(xié)議有深入了解。正因為如此,有一些民間人士對這些協(xié)議開展了研究(見本文的"

          當我們還在感嘆"這世界,變化快"的時候,MSN Messenger的協(xié)議已經(jīng)到了第10版,簡稱MSNP10,對應(yīng)于MSN Messenger 6.1。MSN Messenger 6.0則使用MSNP9。現(xiàn)在Microsoft強迫MSN Messenger用戶升級到6.0或6.1版,因為服務(wù)器對MSNP8以下的版本不再支持。本文及后續(xù)文章所描述的MSN Messenger協(xié)議主要針對MSNP9/MSNP10。

          1. 連 接

          MSN Messenger協(xié)議建立在TCP/IP之上。除了文件傳輸和語音聊天是直接的"點對點"通信之外,其它所有的情形全部通過服務(wù)器進行。

          在邏輯上,一共有三種類型的服務(wù)器,各司其職:

        1. 派遣服務(wù)器(Dispatch Server, DS) - 客戶端最初連接的服務(wù)器。負責(zé)給客戶端分配合適的通知服務(wù)器。域名是messenger.hotmail.com,標準服務(wù)端口是1863。完成派遣任務(wù)后,切斷TCP連接。
        2. 通知服務(wù)器(Notification Server, NS) - 客戶端需要一直保持連接的服務(wù)器。很多任務(wù)要在這個會話內(nèi)完成,包括登錄、改變狀態(tài)、獲取用戶列表、修改用戶信息、發(fā)起聊天、接受呼叫、郵件通知、退出等等。服務(wù)端口由派遣服務(wù)器指定,通常也是1863。
        3. 接線服務(wù)器(Switchboard Server, SS) - 客戶端之間聊天使用的中轉(zhuǎn)服務(wù)器。每開一個聊天窗口,客戶端和服務(wù)器就建立一個TCP會話。當客戶端之間需要進行文件傳輸或語音聊天時,發(fā)送系統(tǒng)消息,建立"點對點"會話通道(可能轉(zhuǎn)為使用UDP)。服務(wù)端口通常也是1863。"點對點" 通信使用的端口由客戶端自動協(xié)商決定,如文件傳輸通常使用6891端口。

          2. 命 令

          MSN Messenger命令使用純ASCII碼。對非ASCII碼字符使用URL編碼。命令的語法是

          XXX[<SP>TrID<SP>PARAM1<SP>PARAM2…]<CRLF>

          其中,<SP>是空白字符,<CRLF>是回車換行,XXX是一個3字符的命令串,TrID是一個流水號,PARAMx是參數(shù),[ ]內(nèi)是可選項。最簡單的命令沒有流水號和參數(shù)。為了方便起見,下面討論時用" "代表<SP>,"\r\n"代表<CRLF>,"\x??"代表一個值為0x??字節(jié)。紅色表示由客戶端發(fā)出,藍色表示由服務(wù)器發(fā)出。一個MSN Messenger命令的例子如下:

          USR 18 TWN I example@hotmail.com\r\n

          3. 錯 誤

          無論是由于客戶端發(fā)出的命令無效,參數(shù)無效,還是其他什么原因,服務(wù)器可以返回一個錯誤。格式為

          XXX[<SP>TrID]<CRLF>

          其中,XXX是一個3位數(shù)字的串。如

          ADD 21 AL non_existent@passport.com non_existent@passport.com\r\n205 21\r\n

          上例中,non_existent@passport.com是一個不存在的賬號。

          4. 消 息

          MSN Messenger消息符合MIME 1.0標準,由消息頭與消息體組成。通常使用UTF-8編碼,消息頭中也需要URL編碼格式,消息體則直接用二進制數(shù)據(jù)。

          一個MSN Messenger消息的例子如下:

          MIME-Version: 1.0\r\n
          Content-Type: text/plain; charset=UTF-8\r\n
          X-MMS-IM-Format: FN=%E5%AE%8B%E4%BD%93; EF=; CO=0; CS=86; PF=0\r\n
          \r\n
          bhw98\xE4\xBD\xA0\xE5\xA5\xBD\xEF\xBC\x81

          經(jīng)簡單分析可知,"%E5%AE%8B%E4%BD%93"是"宋體"的UTF-8加URL編碼,而"bhw98\xE4\xBD\xA0\xE5\xA5\xBD\xEF\xBC\x81"是"bhw98你好!"的UTF-8編碼。

          命令一覽

          命令 來源 去向 說明 備注
          ACK SS Client 確認,做出肯定回答。 acknowledgement
          ADD Client NS 發(fā)出添加新聯(lián)系人到列表的請求。 add user
          NS Client 返回添加新聯(lián)系人請求的應(yīng)答。
          ADG Client NS 發(fā)出添加新聯(lián)系人組請求。 add group
          NS Client 返回添加新聯(lián)系人組請求的應(yīng)答。
          ANS Client SS 接受聊天連接請求。 answer
          BLP Client NS 設(shè)置對尚未列入明確允許/禁止的聯(lián)系人列表的保密策略。 block list privacy
          NS Client 返回設(shè)置保密策略請求的應(yīng)答。
          BYE SS Client 通知客戶端結(jié)束會話。 bye
          CAL Client SS 發(fā)出建立聊天連接的請求。 call
          SS Client 返回建立聊天連接請求的應(yīng)答。
          CHG Client NS 發(fā)出改變狀態(tài)的請求。 change state
          NS Client 返回改變狀態(tài)的應(yīng)答。
          CHL NS Client 服務(wù)器發(fā)出驗證要求。 challenge
          SS Client
          CVR Client NS 發(fā)出客戶端的OS、語言、MSN Messenger版本等信息。 client version
          Client SS
          NS Client 返回推薦的MSN Messenger版本、升級軟件需要的下載地址等信息。
          SS Client
          FLN NS Client 通知有聯(lián)系人列表中的用戶下線。 off-line
          GTC Client NS 設(shè)置當有聯(lián)系人列表中的用戶狀態(tài)改變時給出的提示。 greeting to changes?
          NS Client 返回設(shè)置請求的應(yīng)答。
          INF Client NS 詢問服務(wù)器所支持的認證方式。 information?
          Client SS
          NS Client 返回服務(wù)器所支持的認證方式。
          SS Client
          ILN NS Client 當客戶端登錄或添加聯(lián)系人到列表時,通知列表中的聯(lián)系人的狀態(tài)。 initial online state
          IRO SS Client 當有新用戶加入聊天連接時,通知客戶端該連接中的用戶名單。 initial roster information
          JIO SS Client 通知客戶端已經(jīng)同另外的用戶建立了聊天連接。 jion
          LSG Client NS 發(fā)出獲取聯(lián)系人組列表的請求。 list groups
          NS Client 返回獲取聯(lián)系人組列表請求的應(yīng)答。
          LST Client NS 發(fā)出獲取聯(lián)系人列表的請求。 list
          NS Client 返回獲取聯(lián)系人列表請求的應(yīng)答。
          MSG Client SS 發(fā)送消息到其他用戶(聊天對象)。 message
          NS Client 傳遞服務(wù)器(系統(tǒng)) 的消息到客戶端。
          SS Client 傳遞其他用戶(聊天對象)的消息到客戶端。
          NAK SS Client 做出否定回答。 negative acknowledgement
          NLN NS Client 通知客戶端聯(lián)系人上線或改變狀態(tài)。 on-line
          OUT All All 結(jié)束客戶端-服務(wù)器的連接。 out
          PNG Client NS 測試TCP連接狀態(tài)。 ping
          Client SS
          PRP Client NS 發(fā)出設(shè)置個人電話號碼的請求。 personal phone number
          NS Client 返回設(shè)置請求的應(yīng)答
          PNG Client NS 測試TCP連接狀態(tài)。 ping
          Client SS
          QNG NS Client 返回測試TCP連接狀態(tài)的應(yīng)答。 quiz ping?
          SS Client
          QRY Client NS 客戶端回答服務(wù)器的驗證要求。 quiz reply?
          Client SS
          REA Client NS 發(fā)出修改用戶昵稱的請求。 rename nickname
          NS Client 返回修改用戶昵稱請求的應(yīng)答。
          REG Client NS 發(fā)出修改聯(lián)系人組的請求。 rename group
          NS Client 返回修改聯(lián)系人組請求的應(yīng)答。
          REM Client NS 發(fā)出從聯(lián)系人列表中刪除用戶的請求。 rename user
          NS Client 返回刪除用戶請求的應(yīng)答。
          RMG Client NS 發(fā)出刪除聯(lián)系人組的請求。 remove group
          NS Client 返回刪除聯(lián)系人組請求的應(yīng)答。
          RNG NS Client 通知客戶端有人要建立聊天連接。 ring
          SYN Client NS 客戶端-服務(wù)器同步。 synchronization
          NS Client
          URL Client NS 發(fā)出獲取MSN服務(wù)URL的請求。 URL
          NS Client 返回獲取URL請求的應(yīng)答。
          USR All All 聲明、傳遞、鑒別用戶身份。 user
          VER Client DS 協(xié)商MSN Messenger協(xié)議版本。 version
          Client NS
          DS Client
          NS Client
          XFR DS Client 向客戶端分配NS(通知客戶端轉(zhuǎn)向連接指定的NS)。 transfer
          Client NS 發(fā)出分配SS的請求。
          NS Client 返回分配SS請求的應(yīng)答。

          MSN Messenger協(xié)議--錯誤代碼一覽

          代碼 含義 可能的命令 錯誤示例 備注
          200 非法命令 ? ABC 18\r\n
          200 18\r\n
          ?
          201 非法參數(shù) ? CHG 19 FLN 0\r\n
          201 19\r\n
          ADD 20 AL aaa@bbb@ccc aaa@bbb@ccc\r\n
          201 20\r\n
          ?
          205 用戶不存在 ADD ADD 21 AL none@hotmail.com none@hotmail.com\r\n
          205 21\r\n
          ?
          206 缺少域名 ?
          207 已經(jīng)登錄 USR USR 20 TWN I example@hotmail.com\r\n
          207 20\r\n
          USR 21 TWN S 8d30fc782aa25ec9e1293fdda13cab42\r\n
          207 21\r\n
          ?
          208 非法用戶名 CAL CAL 2 @@hotmail.com\r\n
          208 2\r\n
          ?
          209 非法用戶昵稱 REA REA 18 one@hotmail.com kill%20microsoft\r\n
          209 18\r\n
          ?
          210 用戶太多 ADD ADD 23 FL one@hotmail.com one@hotmail.com 0\r\n
          210 23\r\n
          最大150
          215 用戶已在列表中 ADD ADD 36 FL one@hotmail.com one@hotmail.com 2\r\n
          ADD 36 825 FL one@hotmail.com one@hotmail.com 2\r\n
          ADD 37 FL one@hotmail.com one@hotmail.com 2\r\n
          215 37\r\n
          CAL CAL 5 two@hotmail.com\r\n
          CAL 5 RINGING 213697\r\n
          CAL 6 two@hotmail.com\r\n
          215 6\r\n
          216 用戶不在列表中 REM REM 14 FL three@hotmail.com\r\n
          216 14\r\n
          REA REA 48 three@hotmail.com three\r\n
          216 48\r\n
          CAL CAL 2 three@hotmail.com\r\n
          216 2\r\n
          217 用戶不在線 CAL CAL 2 two@hotmail.com\r\n
          217 2\r\n
          218 已在指定模式 BLP BLP 17 BL\r\n
          BLP 17 151 BL\r\n
          BLP 18 BL\r\n
          218 18\r\n
          GTC GTC 19 A\r\n
          GTC 19 152 A\r\n
          GTC 20 A\r\n
          218 20\r\n
          219 用戶已經(jīng)在相反的列表中 ADD ADD 15 AL four@hotmail.com four@hotmail.com\r\n
          ADD 15 AL 56 four@hotmail.com four\r\n
          ADD 16 BL four@hotmail.com four@hotmail.com\r\n
          219 16\r\n
          223 用戶組太多 ADG ADG 28 new%20group 0\r\n
          223 28\r\n
          最大30
          224 非法組號 ADD RMG 24 3\r\n
          RMG 24 11506 3\r\n
          ADD 25 FL five@hotmail.com 3\r\n
          224 25\r\n
          REM RMG 24 3\r\n
          RMG 24 11506 3\r\n
          REM 25 FL five@hotmail.com 3\r\n
          224 25\r\n
          REG RMG 24 3\r\n
          RMG 24 11506 3\r\n
          REG 25 3 New%20Name 0\r\n
          224 25\r\n
          RMG RMG 24 3\r\n
          RMG 24 11506 3\r\n
          RMG 25 3\r\n
          224 25\r\n
          225 用戶不在組中 REM REM 26 FL six@hotmail.com 3\r\n
          225 26\r\n
          229 組名太長 ADG ADG 27 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 0\r\n
          229 27\r\n
          最大60
          230 不能刪除組0 RMG RMG 28 0\r\n
          230 28\r\n
          300缺少必要的參數(shù)???
          302?尚未登錄???
          500服務(wù)器內(nèi)部錯誤???
          540驗證應(yīng)答錯誤???
          600服務(wù)器忙???
          707無法建立連接???
          910服務(wù)器忙???
          911身份驗證失敗???
          ?

          過去的MSN Messenger版本(MSNP8以下),簡單地使用MD5等Hash算法對用戶身份進行認證。MSNP9/MSNP10使用一種TWN(Tweener)認證方式,通過SSL/TLS連接到login.passport.com和loginnet.passport.com等服務(wù)器,借助于HTTP協(xié)議輸入賬號和密碼,認證通過后,才能取得“入場券”。

          真正意義上的身份認證,發(fā)生在客戶端與通知服務(wù)器(NS)之間。客戶端登陸NS時,首先交換版本信息。雙方均支持MSNP8以上版本時,才能進行認證過程。如果客戶端版本較低,不支持TWN,咋辦?服務(wù)器會將你一腳揣出去,信不信?

          好了,廢話少說,現(xiàn)在拿一個成功認證的例子看看。在下面的例子中,賬號是“example@passport.com”,密碼是“password”。

          VER 4 MSNP10 MSNP9 CVR0 \r\n
          VER 4 MSNP9 CVR0 \r\n
          CVR 5 0x0804 winnt 5.0 i386 MSNMSGR 6.1.0203 MSMSGS example@passport.com \r\n
          CVR 5 6.0.0602 6.0.0602 5.0.0527 http://download.microsoft.com/download/d/4/f/d4f560d5-6dc6-4901-b149-a568415561d7/SETUPNT.EXE http://messenger.msn.com/cn \r\n
          USR 6 TWN I example@passport.com \r\n
          USR 6 TWN Slc=1033,id=507,tw=40,fs=1,ru=http%3A%2F%2Fmessenger%2Emsn%2Ecom,ct=1073355862,kpp=1,kv=5,ver=2.1.0173.1, tpf=ed1c2f217a21c191c61251eb8b73bb60 \r\n
          (此時通過SSL進行身份認證,獲得“入場券”)
          USR 7 TWN S t=4m1wWfEupDgUNb53qys5gJdw8OTJEtT82fcuDbS3U672gTymOOs6cgKeafj7WjgZNcufAQggxqHRRXko02DoflZA$$ &p=4QXNnX9rFDDgki9ZqvqPZGDGJa2Mrd5H13Zfl0NNjh4I78qPyfpzmkZPZEe0nxJTkzZSNDYtk!57cVqiYVfO86KgCRYWhi2kudS0M !7bdi82EDA1FYp3WboHD!sCQ17OZh7lPQI7fozrgsSMZwgSzRi2FNTPxf13oDNIfDCKCG!2guDvZKEpk78A$$ \r\n
          USR 7 OK example@passport.com example@passport.com 1 0 \r\n

          第一回合(TrID=4),雙方協(xié)商MSN版本號。客戶端說“我能支持MSNP9和MSNP10”,NS說“行,就MSNP9吧”。

          第二回合(TrID=5),客戶端報告本機信息:OS = Windows 2000 (NT 5.0), 語言 = 簡體中文,MSN Messenger版本 = 6.1.0203, 賬號 = example@passport.com。NS給出了推薦的版本號,能夠使用的最老的版本號,新版本下載地址,官方網(wǎng)站地址等信息。

          第三回合(TrID=6),客戶端要求身份認證(I = Initial),NS則給出所需要的一長串信息(S = Subsequent)。其中tpf相當于challenge,參與Hash運算,能保證每次認證返回的串是不同的。

          第四回合(TrID=7),客戶端出示從認證服務(wù)器得到的“入場券”,NS放行(OK)。

          第三、四回合之間,通過SSL的認證過程如下:

          首先在HTTPS端口443向login.passport.com發(fā)送一個GET請求,將賬號、密碼和NS給定的一長串信息送出

          GET /login2.srf HTTP/1.1 \r\n
          Authorization: Passport1.4 OrgVerb=GET,OrgURL=http%3A%2F%2Fmessenger%2Emsn%2Ecom,sign-in=example%40passport.com,pwd=password, lc=1033,id=507,tw=40,fs=1,ru=http%3A%2F%2Fmessenger%2Emsn%2Ecom,ct=1073355862,kpp=1,kv=5,ver=2.1.0173.1, tpf=ed1c2f217a21c191c61251eb8b73bb60 \r\n
          Host: login.passport.com \r\n \r\n

          根據(jù)情況,會重定向到不同的URL。本例中,重定向到"https://loginnet.passport.com/login2.srf?lc=1033",服務(wù)器應(yīng)答

          HTTP/1.1 302 Found \r\n Server: Microsoft-IIS/5.0 \r\n
          Date: Mon, 22 Dec 2003 21:10:05 GMT \r\n
          PPServer: H: LAWPPLOG5C006 \r\n
          Connection: close \r\n
          Content-Type: text/html \r\n
          Expires: Mon, 22 Jun 2003 21:09:05 GMT \r\n
          Cache-Control: no-cache \r\n
          cachecontrol: no-store \r\n Pragma: no-cache \r\n
          P3P: CP="DSP CUR OTPi IND OTRi ONL FIN" \r\n
          Authentication-Info: Passport1.4 da-status=redir \r\n
          Location: https://loginnet.passport.com/login2.srf?lc=1033 \r\n
          \r\n ... ...

          然后,重新向指定的URL發(fā)出請求,得到如下響應(yīng)

          HTTP/1.1 200 OK \r\n
          Server: Microsoft-IIS/5.0 \r\n
          Date: Mon, 22 Dec 2003 21:10:07 GMT \r\n
          PPServer: H: LAWPPIIS6B061 \r\n
          Connection: close \r\n Content-Type: text/html \r\n
          Expires: Mon, 22 Dec 2003 21:09:07 GMT \r\n
          Cache-Control: no-cache \r\n
          cachecontrol: no-store \r\n
          Pragma: no-cache \r\n
          P3P: CP="DSP CUR OTPi IND OTRi ONL FIN" \r\n
          Set-Cookie: ... ... \r\n
          Authentication-Info: Passport1.4 da-status=success,tname=MSPAuth,tname=MSPProf,tname=MSPSec, from-PP='t=4m1wWfEupDgUNb53qys5gJdw8OTJEtT82fcuDbS3U672gTymOOs6cgKeafj7WjgZNcufAQggxqHRRXko02DoflZA$$ &p=4QXNnX9rFDDgki9ZqvqPZGDGJa2Mrd5H13Zfl0NNjh4I78qPyfpzmkZPZEe0nxJTkzZSNDYtk!57cVqiYVfO86KgCRYWhi2kudS0M !7bdi82EDA1FYp3WboHD!sCQ17OZh7lPQI7fozrgsSMZwgSzRi2FNTPxf13oDNIfDCKCG!2guDvZKEpk78A$$', ru=http://messenger.msn.com \r\n
          Content-Length: 0 \r\n
          \r\n

          開始時直接向loginnet.passport.com發(fā)出正確的請求,也是可以的。不難看出,在服務(wù)器認證成功的返回信息中,Authentication-Info字段的from-PP串值,就是所謂的“入場券”。

          如果認證失敗,服務(wù)器返回401錯誤

          HTTP/1.1 401 Unauthorized \r\n ... ...

          這樣,就無法拿到“入場券”,自然不能在第四回合中輸入合法的串。


        4. 只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 泸西县| 和顺县| 沅陵县| 钟祥市| 于田县| 巴林左旗| 兴文县| 大英县| 定安县| 黄冈市| 松原市| 榆社县| 北京市| 孝感市| 黔东| 金华市| 古交市| 美姑县| 海南省| 吉林省| 房山区| 晋江市| 静宁县| 伊春市| 合作市| 镇江市| 炉霍县| 吕梁市| 普陀区| 平舆县| 陆河县| 南宁市| 高雄县| 珲春市| 昌邑市| 昆山市| 盘山县| 寿阳县| 丰原市| 三原县| 秦安县|