<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    wadise

    BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
      22 Posts :: 0 Stories :: 6 Comments :: 0 Trackbacks

    MSNP9協(xié)議分析

    MSN Messenger協(xié)議

    原作: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é)議的升級、修改細(xì)節(jié)的官方文檔。但無論是開發(fā)第三方的聊天客戶端軟件(如Gaim, MyIM等),還是做協(xié)議分析,必須對其通信協(xié)議有深入了解。正因為如此,有一些民間人士對這些協(xié)議開展了研究(見本文的"

    當(dāng)我們還在感嘆"這世界,變化快"的時候,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ù)器,各司其職:

  • 派遣服務(wù)器(Dispatch Server, DS) - 客戶端最初連接的服務(wù)器。負(fù)責(zé)給客戶端分配合適的通知服務(wù)器。域名是messenger.hotmail.com,標(biāo)準(zhǔn)服務(wù)端口是1863。完成派遣任務(wù)后,切斷TCP連接。
  • 通知服務(wù)器(Notification Server, NS) - 客戶端需要一直保持連接的服務(wù)器。很多任務(wù)要在這個會話內(nèi)完成,包括登錄、改變狀態(tài)、獲取用戶列表、修改用戶信息、發(fā)起聊天、接受呼叫、郵件通知、退出等等。服務(wù)端口由派遣服務(wù)器指定,通常也是1863。
  • 接線服務(wù)器(Switchboard Server, SS) - 客戶端之間聊天使用的中轉(zhuǎn)服務(wù)器。每開一個聊天窗口,客戶端和服務(wù)器就建立一個TCP會話。當(dāng)客戶端之間需要進行文件傳輸或語音聊天時,發(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\n
    205 21\r\n

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

    4. 消 息

    MSN Messenger消息符合MIME 1.0標(biāo)準(zhǔn),由消息頭與消息體組成。通常使用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 確認(rèn),做出肯定回答。 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è)置當(dāng)有聯(lián)系人列表中的用戶狀態(tài)改變時給出的提示。 greeting to changes?
    NS Client 返回設(shè)置請求的應(yīng)答。
    INF Client NS 詢問服務(wù)器所支持的認(rèn)證方式。 information?
    Client SS
    NS Client 返回服務(wù)器所支持的認(rèn)證方式。
    SS Client
    ILN NS Client 當(dāng)客戶端登錄或添加聯(lián)系人到列表時,通知列表中的聯(lián)系人的狀態(tài)。 initial online state
    IRO SS Client 當(dāng)有新用戶加入聊天連接時,通知客戶端該連接中的用戶名單。 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算法對用戶身份進行認(rèn)證。MSNP9/MSNP10使用一種TWN (Tweener)認(rèn)證方式,通過SSL/TLS連接到login.passport.com和loginnet.passport.com等服務(wù)器,借 助于HTTP協(xié)議輸入賬號和密碼,認(rèn)證通過后,才能取得“入場券”。

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

    好了,廢話少說,現(xiàn)在拿一個成功認(rè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進行身份認(rèn)證,獲得“入場券”)
    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),客戶端要求身份認(rèn)證(I = Initial),NS則給出所需要的一長串信息(S = Subsequent)。其中tpf相當(dāng)于challenge,參與Hash運算,能保證每次認(rèn)證返回的串是不同的。

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

    第三、四回合之間,通過SSL的認(rèn)證過程如下:

    首先在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ù)器認(rèn)證成功的返回信息中,Authentication-Info字段的from-PP串值,就是所謂的“入場券”。

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

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

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


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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 丁香婷婷亚洲六月综合色| av午夜福利一片免费看久久| 午夜在线a亚洲v天堂网2019| 午夜色a大片在线观看免费| 水蜜桃视频在线观看免费| 亚洲AV电影院在线观看| 拔擦拔擦8x华人免费久久| 色www永久免费| 亚洲精品无码久久久久久| 亚洲一区二区三区香蕉| 久久久久久99av无码免费网站| 免费国产在线精品一区| 亚洲成综合人影院在院播放| 真实国产乱子伦精品免费| 综合一区自拍亚洲综合图区| 亚洲视频在线视频| 亚洲国产综合精品中文字幕| 男女超爽刺激视频免费播放| 一级免费黄色毛片| 亚洲熟妇无码八V在线播放| 国产日韩亚洲大尺度高清| 国产精品视频免费一区二区三区| 久久aⅴ免费观看| 免费人成动漫在线播放r18| 亚洲免费在线视频播放| 扒开双腿猛进入爽爽免费视频 | 午夜免费福利在线观看| 国产婷婷成人久久Av免费高清| 亚洲丁香婷婷综合久久| 久久精品国产亚洲av麻豆小说 | 日本亚洲欧洲免费天堂午夜看片女人员| 亚洲卡一卡二卡乱码新区| 亚洲国产精品一区二区第一页 | 99re这里有免费视频精品 | 国产公开免费人成视频| 99久久99这里只有免费费精品| 三级黄色在线免费观看| 全部一级一级毛片免费看| 亚洲AV一区二区三区四区| 亚洲剧场午夜在线观看| 亚洲国产精品久久久久婷婷软件|