最近閑來有事, 分析了一個非常低端(非常低端的意思是說你不應該對她是否能取代你現有的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應用:
用kEmulator運行手機QQ並登錄:
接下來, 如果QQ使用了第一個服務器的話, 那么Wireshark將會顯示以下信息:
沒錯, 你沒有看錯, 協議可以說全部是明文的, 完全就像是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.效果展示
3.完結
文章里面只是簡要介紹了一些協議方面的東西, 細節處理, 以及完全的命令列表(我也不全知道)也沒有完全列出來,若
需要參考, 還請查看下面的源代碼.
參考文章:
手機QQ協議分析 (一)登陸
HTTP/1.1 Request - w3school
未完結的源代碼: http://pan.baidu.com/s/1c0iYYDa
作者:女孩不哭
時間:2014年4月6日
聯系:QQ-191035066
地址:http://www.cnblogs.com/memset