QQ2013協議分析(二)TCPF

我們嘗試把QQ的協議進行分類

文字聊天協議族(TCPF, Text Chatting Protocol Family):它主要支持與其它QQ客戶端進行文字聊天。TCPF是建立在UDP協議之上。UDP數據包中的第一個字符02爲這個協議族的標識。TCPF的服務器使用8000號端口,騰訊的QQ客戶端軟件一般從4000號端口開始嘗試使用,但實際上,對客戶端使用的端口號並沒有限制。目前的研究集中在TCPF上。

其它未知可能存在的協議族:

我們觀察到QQ除了與TCPF服務器通信以外,還有與其它的服務器使用UDP進行通信。目前我們觀察到的服務器爲 218.17.217.111 : 8000。客戶端使用與TCPF不同的端口。目前觀察到的從客戶端發出的包以06開頭,而服務器返回的包則以01開頭。目前其具體作用未知。我們注意到一個有趣的現象是,如果選擇離線後重新上線,那麼在發出登錄包之前,這個通訊已經開始。我們暫時把它命名爲數據傳輸協議族(DTPFData Transfer Protocol Family)。最新的研究發現,它傳遞的是QQShow的圖片數據。

語音、視頻聊天、文件傳輸:目前還沒有開始分析,尚未知道是使用UDP還是TCP協議。

下面說說我們關心的TCPF協議

TCPF是建立在UDP協議上的協議族,主要支持文字聊天功能。TCPF是以請求-響應模式工作的。也就是說,客戶端發出一個請求,服務器端會給出一個相應的響應;服務器向客戶端發送信息,客戶端也會給服務器相應的響應。請求和響應通過相同的序列號來進行配對(請求代碼也應該相同)。而且每種請求的發起方都是相同的。

TCPF包結構

對於TCPF包我們又把它分爲5類:
1)、登錄請求包(LIP,LogIn Packet),它是由客戶端向服務器發出登錄請求的數據包。
2)、登錄應答包(LRP,Login Reply Packet),它是由服務器響應客戶端登錄請求的數據包。
3)、註銷請求包(LOP,LogOut Packet),它是由客戶端向服務器發出註銷登錄請求的數據包,服務器對這個包不作應答。
4)、客戶端其它包(CSP,Client Sent Packet),它是由客戶端向服務器發送的其它包。
5)、服務器其它包(SSP,Server Sent Packet),它是由服務器向客戶端發送的其它包。

TCPF包頭:

0)、所有TCPF包的前7個字節是包頭,包頭可以識別TCPF包的內容。包頭的格式爲:
1)、第0字節:TCPF包標識:0x02。
2)、第1-2字節:發送者標識。如果是0x01 0x00,表明是由服務器發送。客戶端的標識與所使用的使用的QQ版本有關,如:版本QQ2003(0808)的標識爲0x0A 0x1D。具體的協議的格式與這個字段所標識的客戶端版本有關。目前我們以這個最新的0A1D版本來討論。
3)、第3-4字節:命令編號。具體的命令編號含義在《QQ協議概述》(Protocol Overview.rtf)中有描述。如果這個字段是0x00 0x01,那麼這是一個註銷請求包。如果這個字段是0x00 0x22,而發送者標識是0x01 0x00,那麼這是一個登錄應答包。如果這個字段是0x00 0x22,而發送者標識是其它(例如0x0A 0x1D),那麼這是一個登錄請求包。其它的命令代碼表明是其它包,我們通過發送者標識來區分它是CSP還是SSP。
4)、第5-6字節:命令序列號。客戶端和服務器都有各自的當前發送序列號。每初始發出一個指令的時候,使用當前的序列號,然後把當前序列號加一,如果超過0xFFFF,就繞回。如果是響應對方發出的命令,則使用這個命令的序列號。例如,客戶端當前的序列號爲0x1110,它向服務發送一個0x0016命令,它使用0x1110這個序列號,服務器收到以後,返回一個序列號爲0x1110的0x0016命令響應。下一次,客戶端又發送一個0x0026命令,這一次它使用加一了的序列號0x1111,服務器也響應0x1111序列號的一個0x0026命令響應。如果這是服務器要向客戶端發送0x0017命令,它使用它自己的當前序列號,比如說0x2220,客戶端收到以後,也響應一個序列號爲0x2220的0x0017命令應答。我們可以通過序列號來判斷髮出的指令是否已經得到了應答,如果沒有,可以重發。服務器對收到的命令的序列號順序沒有要求。服務器也不會一定按照發出的順序給予應答。

TCPF包尾:所有的TCPF包都以0x03作爲包尾。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章