分享一個最近研究的手機QQ3.0的協議(版本1.4)


    最近閑來有事, 分析了一個非常低端(非常低端的意思是說你不應該對她是否能取代你現有的QQ客戶端作任何可能的奢望,她只是一個實驗性的東西)的手機QQ的協議, 是手機QQ3.0,
     所用到的TCP/HTTP通信協議版本是1.4, 也不知道是哪一年release的了, 至少有七八年的歷久了吧, 反正就是: 功能非常弱!

    主要的分析原因是想學學網絡方面的編程經驗(這是我第2次弄socket編程 :-) ), 以及學學怎么抓包分析.

主要用到的工具軟件

        手機QQ3.0: http://www.ruan8.com/soft_5872.html

        kEmulator(Java模擬器):http://gamevina.us/kemulator-vh/

        Wireshark(協議分析):http://www.wireshark.org/download.html

        Java Decompiler(Java查看(和諧)工具):http://jd.benow.ca/

 

分析流程簡要介紹

1.獲取服務器信息

     網上分析這個版本手機QQ的用戶不在少數, 我也了解到這個版本比較容易分析, 協議簡單, 所以...

     首先, 打開這個網址:http://conf.3g.qq.com/newConf/kjava/aubin2.jsp

(注意使用unicode編碼查看, 否則可能亂碼) 然后你就會看到類似下面的東西:

SERERCONFIG_NUM=5& SERVERCONFIG_TYPE=KQQTCP,KQQTCP,KQQHTTP,KQQHTTP,KQQHTTP& SERVERCONFIG_URL=socket://58.60.12.177:14000,socket: //211.136.236.88:14000,http://tqq.tencent.com:8000,http: //mconn.tencent.com:14000,http: //kconn.tencent.com:21001&UPDATAECONFIG_NUM=1& UPDATECONFIG_VERSION=2.4.2&UPDATECONFIG_MUST=N& UPDATECONFIG_URL=http://mq.3g.qq.com/g/s?aid=mqq& UPDATECONFIG_HELPTXT=請升級到2.4.3版QQ2005(Java 版)&SMSSERVICE_NUM=2&SMSSERVICE_NAME=24小時在線,關注好友& SMSSERVICE_ADDRESS=10661700,1066170056& SMSSERVICE_TEXT=HQ,SQKJ%2c||QQNO||&SMSSERVICE_HELPTXT=不用手機上網,通過短信就能登陸QQ,累積在線時間真是方便,讓你QQ等級不停增長!%0a當前操作需要通過短信操作完成,選擇取定將發送一條短信,請根據收到的短信提示完成操作!, 關注此QQ好友,好友一上QQ馬上就會有短信通知你手機!隨時隨地和TA在QQ上“偶遇”,資費10元/月。%0a當前操作需要通過短信操作完成,選擇確定將發送一條短信,請根據收到的短信提示完成操作。

其中:

        SERERCONFIG_NUM表示目前可以使用的服務器的個數
        SERVERCONFIG_TYPE表示服務器類型:KQQTCP表示TCP服務器,KQQHTTP表示HTTP服務器
        SERVERCONFIG_URL:服務器地址
        ......(不重要)

注意:各值以逗號分隔; 鍵值對間使用&符號連接.

至於手機QQ要使用哪個服務器, 現在還不知道, 反正是其中一個, 過濾試一下就知道了.

2.過濾通信協議

先打開Wireshark進行網絡封包過濾: 選擇一張活動網卡, 然后start.

開始過濾

應該馬上就可以看到,  wireshark已經顯示了很多數據包... 數據太多, 不便查看, 於是過濾顯示一下,

以QQ的第一個tcp服務器為例: 在Wireshark的Filter Expression里面輸入過濾表達式, 並點擊Apply應用:

 Apply Filter Expr

用kEmulator運行手機QQ並登錄:

QQLoginProcess

接下來, 如果QQ使用了第一個服務器的話, 那么Wireshark將會顯示以下信息:

LoginFilter

沒錯, 你沒有看錯, 協議可以說全部是明文的, 完全就像是HTTP那樣的...

比如VER=1.4代表版本號為1.4, CMD=Login表示命令為登錄, UIN=***表示QQ...............

3.協議分析

    好了, QQ和服務器的所有通信都是基於這種HTTP的鍵值對方式, 下面列出一些常見的鍵值對:

VER=1.4 表示當前使用的協議版本, 不過服務器返回的版本可能有所不一致
CON=1 這個不知道是什么意思, 通過查看QQ的代碼可見其貌似是固定值1
CMD=*** 當前的命令, 有Login, Logout, Query_Stat2等等.
SEQ=*** 當前命令的序列號, 以此來標識不同的命令序號, 每下一次發送時, 在上一次的基礎上加1
UIN=*** 當前登錄的QQ號, 不變

 

命令的規定:
                   每個命令以\r\n結束, 這就意味着命令字段中不能再出現其它的\r\n, 還有,要把\n換成%0D,\r換成%0D
                   每條命令都使用UTF-8編碼, 同時命令中出現的逗號,&等要轉換url編碼, 不然要誤解釋命令.

1.    登錄命令: VER=1.4&CON=1&CMD=Login&SEQ={seq}&UIN={qq}&PS={ps}&M5=1&LG=0&LC={lc}&GD={gd}&CKE=\r\n
       服務器響應:VER=1.1&CMD=Login&SEQ={seq}&UIN=2933278370&RES=0&RS=0&HI=60&LI=300&SG=***&SSG=207390864\r\n
                   SEQ序號應該和你發送時一樣, 不然就是錯的.
                   RES=0代表服務器成功響應
                   RS=0代表登錄成功,其它均為失敗; 若失敗:則有相應的RA字段標識錯誤信息, 比如Password Error!

                  如果有SID或者COMP字段, 記得保存起來, 因為后面的某些搞不懂的命令還要用它們. 其它的比如什么HI和LI就不知道是什么東西了.
                  如果出現了VC字段, 則說明需要驗證碼信息, 我測試了很久, 一直沒遇到, 暫時不說這個...

2.取得所有QQ好友及其基本信息
            命令:VER=1.4&CON=1&CMD=SimpleInfo2&SEQ={seq}&UIN={qq}&SID={sid}&XP={xp}&UN=0&TO=0\r\n
            回復:VER=1.1&CMD=SIMPLEINFO2&SEQ={seq}&&UIN={qq}&RES=0&NP=65535&SN=0&UN=&FC=&NK=\r\n
                       XP是前面根據login命令計算出來的, 具體可以看我后面的代碼.
                      RES=0同樣代表服務器正確響應.
                      NP=65535表示當前返回了所有的好友信息, 如不是, 需要多次查詢, 你應該沒有那么多好友吧?
                      SN表示當前返回的好友基礎信息的個數, (注:我全沒有寫出來)
                      UN表示好友QQ號, 以逗號分隔(我沒列出)
                      FC表示頭像ID
                      NK表示昵稱, 以逗號分隔

3.取得好友狀態
             命令:VER=1.4&CON=1&CMD=Query_Stat2&SEQ={seq}&UIN={qq}&SID=&XP={xp}&CM=2&UN=0\r\n
            回復:VER=1.1&CMD=QUERY_STAT2&SEQ={seq}&UIN={qq}&RES=0&FN=1&SN=2&ST=10,30&UN=..\r\n
                        FN是不是finish的意思? 不知道.
                        SN返回信息的個數
                        ST狀態:10-在線,20-離線,30-離開,40-隱身
                        UN:QQ號, 與狀態一一對應

4.發送消息給好友
            命令:VER=1.4&CON=1&CMD=CLTMSG&SEQ={seq}&UIN={qq}&SID={sid]&XP={xp}&UN={qq2}&MG={mg}\r\n
            回復:VER=1.1&CMD=CLTMSG&SEQ={seq}&UIN={qq}&RES=0
                            UN代表好友的QQ
                            MG表示消息, 必須是部分url編碼的
5. .............
還有幾條命令, 比如加好友, 刪除好友, 我就不寫了 , 加上有些也沒做測試.

4.模擬登錄

1. 可以先用GET方式獲取到服務器IP信息

GET  /newConf/kjava/aubin2.jsp HTTP/1.1
Accept: text/html, application/xhtml+xml,*/*
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/6.0)
Accept-Encoding: utf8
Host: conf.3g.qq.com
Connection: Keep-Alive
[blankline]

2. 然后建立socket並連接到服務器

3.向服務器發送命令

4.處理服務器返回

5...............

5.效果展示

result

 

3.完結

            文章里面只是簡要介紹了一些協議方面的東西, 細節處理, 以及完全的命令列表(我也不全知道)也沒有完全列出來,若
需要參考, 還請查看下面的源代碼.

            參考文章:
                                 手機QQ協議分析 (一)登陸
                                 HTTP/1.1 Request - w3school

            未完結的源代碼: http://pan.baidu.com/s/1c0iYYDa

作者:女孩不哭
時間:2014年4月6日
聯系:QQ-191035066
地址:http://www.cnblogs.com/memset


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM