日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

QQ业务及协议分析

發布時間:2024/8/1 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QQ业务及协议分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

摘要:騰訊 QQ 是物聯網巨頭騰訊公司的重要用戶基礎,具備豐富細致的業務功能。本文分析了騰訊 QQ 的業務情況,介紹了 QQ 所使用的的 TCPF 協議格式,并實際抓包分析了 PC 版 QQ 的登錄和通信過程。
關鍵詞:騰訊;QQ;網絡流量分析;即時通訊;

1. 引言

騰訊公司于1998年11月成立,2004年在香港上市。騰訊公司在最近幾年中與百度、阿里巴巴并稱為互聯網三巨頭“BAT”,它上市14年,股價增長627倍(經后復權),在16年市值就突破2萬億港元,目前市值4.4萬億港元。發展至今,騰訊建立起了復雜的業務體系,包括十幾條業務線、上百種產品,并在眾多領域處于領導地位,是深刻改變了中國社會的最偉大、最受人尊敬、最強大的企業之一。
盡管業務眾多,騰訊的根基在于社交媒體,即時通訊軟件 QQ 是它的基礎,高達9億的高粘性龐大用戶流量是騰訊的核心競爭力,為其他產業的發展提供了肥沃土壤。在1999年,騰訊模仿即時通訊軟件 ICQ 開發了Opening ICQ,即 OICQ ,2000年 OICQ 更名為 QQ ,但通訊協議名稱仍然是 OICQ 。騰訊 QQ 的通信一開始使用不加密的通信,現在已經使用密鑰協商后加密消息傳輸。 QQ 的特點在于使用UDP協議來進行聊天消息通信,因為UDP協議資源消耗小,發送速度快,同時使用消息中轉服務器保證可靠傳輸。
本文在第2節中分析騰訊 QQ 的業務情況,在第3節中分析其登錄和聊天協議結構,最后在第4節中通過實際抓包實驗來驗證登錄和消息發送的協議,并在第5節總結了本文內容。

2. 業務分析

2.1 業務應用情況

騰訊 QQ 作為中國大陸用戶量最高的即時通訊軟件,支持在線聊天、視頻通話、點對點斷點續傳文件、共享文件、網絡硬盤、自定義面板、QQ郵箱等多種功能,并可與多種通訊終端相連。
QQ 的業務應用極其廣泛,可以通過它的發展歷史[3]來總結概括。騰訊 QQ 在2003年推出“QQ游戲”,進一步優化了產業營銷策略,同年 QQ 用戶注冊數升到2億。2008年,騰訊推出 DNF 黑鉆業務,開啟會員Q豆增值服務,同年注冊用戶接近8億,同時在線突破4000萬。2013年, QQ 的測試版本推出了“劍魚”全新音視頻引擎,支持高清畫質。2019年,騰訊上線了 QQ 小程序。2020年, QQ 的 PC 版更新了“群課堂”、“群作業”等功能,進一步優化了用戶體驗,解決了廣大教育用戶的緊急需要。
2019年12月, QQ 公開財報]1]數據顯示月活躍賬戶達8.07億,同比增長3.0%;智能終端月活躍賬戶數為6.998億,同比增長2.5%;2020年5月,受疫情影響, QQ 家校群已助力超過1.2億用戶開展線上教育。

2.2 使用方法

騰訊 QQ 的功能非常完備,同時具有清晰易懂的用戶界面,從官網下載安裝包后安裝到本地,即可在引導下完成可能的任何操作。而 QQ 最為方便和吸引人的功能可以參考官網[4]的展示,包括消息管理、信息共享、虛擬交友等功能。

2.3 基本模式

騰訊 QQ 的功能全面而細致,讓用戶能有很好的使用體驗。除去會員、錢包等增值功能和空間、小程序等附加功能,騰訊 QQ 的基本使用模式包括基本功能、單人聊天和 QQ 群聊。

  • 基本功能
    下載、安裝與注冊、登錄,均可根據官網和引導程序快速完成。登錄后,可以添加與查找好友、進行好友管理和好友分組。 QQ 也提供安全與隱私保護等功能。
  • 單人聊天
    QQ 提供消息漫游功能,即可以在不同的設備上同步聊天記錄。聊天窗口可以發送表情和圖片、截圖和錄屏、錄音、撥打語音和視頻電話、發送文件和共享文件等。同時還有遠程控制、消息撤回等高級功能。
  • QQ群聊
    QQ 群讓多人可以同時聊天,方便開啟會議、文件共享、信息通知等。作為群主和管理員, QQ 群主要有權限設置、成員管理、發布通知和發起投票等功能。作為群成員,主要有發送和查看消息與圖片、接受通知、下載和發送文件、匿名聊天等功能。
  • 3. 協議過程

    騰訊 QQ 登錄時使用基于HTTP的TLS安全握手協議,聊天時使用文字聊天協議族(TCPF, Text Chatting Protocol Family),它主要支持與其它QQ客戶端進行文字聊天。TCPF建立在UDP協議之上,UDP數據包中的第一個字符02為這個協議族的標識。TCPF的服務器使用8000號端口,騰訊的QQ客戶端軟件一般從4000號端口開始嘗試使用,但實際上,對客戶端使用的端口號并沒有限制。

    3.1 TCPF 分類

    TCPF包可以被分為5類:

  • 登錄請求包(LIP,LogIn Packet),它是由客戶端向服務器發出登錄請求的數據包。
  • 登錄應答包(LRP,Login Reply Packet),它是由服務器響應客戶端登錄請求的數據包。
  • 注銷請求包(LOP,LogOut Packet),它是由客戶端向服務器發出注銷登錄請求的數據包,服務器對這個包不作應答。
  • 客戶端其它包(CSP,Client Sent Packet),它是由客戶端向服務器發送的其它包。
  • 服務器其它包(SSP,Server Sent Packet),它是由服務器向客戶端發送的其它包。
  • 3.2 TCPF包結構

    這一部分主要參考了PC端QQ協議說明

    所有TCPF包的前7個字節是包頭,包頭可以識別TCPF包的內容。包頭的格式為:

  • 第0字節:TCPF包標識:0x02。
  • 第1-2字節:發送者標識。如果是0x01 0x00,表明是由服務器發送。客戶端的標識與所使用的使用的QQ版本有關,如:版本QQ2013(8550)的標識為0x34 0x33。具體的協議的格式與這個字段所標識的客戶端版本有關。
  • 第3-4字節:命令編號。以QQ2013為例,如果這個字段是0x00 0x59,那么這是一個注銷請求包。如果這個字段是0x08 0x25,而第12位為 0x00,那么這是一個登錄應答包。如果這個字段是0x08 0x25,而第12位為 0x03,那么這是一個登錄請求包。其它的命令代碼表明是其它包,我們通過發送者標識來區分它是CSP還是SSP。
  • 第5-6字節:命令序列號。客戶端和服務器都有各自的當前發送序列號。每初始發出一個指令的時候,使用當前的序列號,然后把當前序列號加一,如果超過0xFFFF,就繞回。如果是響應對方發出的命令,則使用這個命令的序列號。例如,客戶端當前的序列號為0x1110,它向服務發送一個0x0016命令,它使用0x1110這個序列號,服務器收到以后,返回一個序列號為0x1110的0x0016命令響應。下一次,客戶端又發送一個0x0026命令,這一次它使用加一了的序列號0x1111,服務器也響應0x1111序列號的一個0x0026命令響應。如果這是服務器要向客戶端發送0x0017命令,它使用它自己的當前序列號,比如說0x2220,客戶端收到以后,也響應一個序列號為0x2220的0x0017命令應答。我們可以通過序列號來判斷發出的指令是否已經得到了應答,如果沒有,可以重發。服務器對收到的命令的序列號順序沒有要求。服務器也不會一定按照發出的順序給予應答。
  • TCPF包尾:所有的TCPF包都以0x03作為包尾。
  • 3.3 登錄協議

    這部分主要參考SSL/TLS握手過程詳解

    QQ登錄過程使用SSL安全套接層的TLS安全傳輸層協議,SSL/TLS 握手是為了安全地協商出一份對稱加密的秘鑰。SSL/TLS握手過程如下圖所示:

  • Client Hello
    握手第一步是客戶端向服務端發送 Client Hello 消息,這個消息里包含了一個客戶端生成的隨機數 Random1、客戶端支持的加密套件(Support Ciphers)和 SSL Version 等信息。
  • Server Hello
    第二步是服務端向客戶端發送 Server Hello 消息,這個消息會從 Client Hello 傳過來的 Support Ciphers 里確定一份加密套件,這個套件決定了后續加密和生成摘要時具體使用哪些算法,另外還會生成一份隨機數 Random2。至此客戶端和服務端都擁有了兩個隨機數(Random1+ Random2),這兩個隨機數會在后續生成對稱秘鑰時用到。
  • Certificate
    這一步是服務端將自己的證書下發給客戶端,讓客戶端驗證自己的身份,客戶端驗證通過后取出證書中的公鑰。
  • Server Key Exchange
    如果是DH算法,這里發送服務器使用的DH參數。RSA算法不需要這一步。
  • Server Hello Done
    Server Hello Done 通知客戶端 Server Hello 過程結束。
  • Client Key Exchange
    上面客戶端根據服務器傳來的公鑰生成了 PreMaster Key,Client Key Exchange 就是將這個 key 傳給服務端,服務端再用自己的私鑰解出這個 PreMaster Key 得到客戶端生成的 Random3。至此,客戶端和服務端都擁有 Random1 + Random2 + Random3,兩邊再根據同樣的算法就可以生成一份秘鑰,握手結束后的應用層數據都是使用這個秘鑰進行對稱加密。使用三個隨機數是因為 SSL/TLS 握手過程的數據都是明文傳輸的,并且多個隨機數種子來生成秘鑰不容易被暴力破解出來。
  • Change Cipher Spec(Client)
    這一步是客戶端通知服務端后面再發送的消息都會使用前面協商出來的秘鑰加密了,是一條事件消息。
  • Encrypted Handshake Message(Client)
    這一步對應的是 Client Finish 消息,客戶端將前面的握手消息生成摘要再用協商好的秘鑰加密,這是客戶端發出的第一條加密消息。服務端接收后會用秘鑰解密,能解出來說明前面協商出來的秘鑰是一致的。
  • Change Cipher Spec(Server)
    這一步是服務端通知客戶端后面再發送的消息都會使用加密,也是一條事件消息。
  • Encrypted Handshake Message(Server)
    這一步對應的是 Server Finish 消息,服務端也會將握手過程的消息生成摘要再用秘鑰加密,這是服務端發出的第一條加密消息。客戶端接收后會用秘鑰解密,能解出來說明協商的秘鑰是一致的。
  • Application Data
    到這里,雙方已安全地協商出了同一份秘鑰,所有的應用層數據都會用這個秘鑰加密后再通過 TCP 進行可靠傳輸。
  • 4. 流量分析

    本節抓取登錄騰訊QQ的流量數據,根據抓取的網絡流量分析登錄和消息傳輸協議。

    4.1 實驗環境

    • Windows 10 家庭版
    • 騰訊QQ 9.3.3.27011
    • Wireshark Version 2.6.4

    4.2 登錄協議

  • 關閉瀏覽器等其他應用,開啟 Wireshark Capture ,登錄騰訊QQ,等待登錄成功后關閉Capture。
  • 通過win+R快捷鍵打開cmd命令行控制臺,輸入ipconfig,找到當前WLAN下的IP地址為192.168.1.102:
  • 設置顯示過濾規則為“tcp && ip.addr==192.168.1.102”,找到與QQ登錄服務器開始交互的TCP數據包,即編號137的SYN數據包。
  • 這里交互的服務器地址為116.128.163.211查詢發現綁定過qq.com的域名,可以確認是騰訊的服務器地址:

    4) 右鍵數據包,選擇“follow”->“TCP stream”,找到登錄QQ的TCP數據流:

    5) 分析No.137數據包,TCP報文的開頭首先是數據鏈路層(Ethernet)報頭:

    f4:83💿45:ee:6e:目的MAC地址
    be:30:11:91:19:79:本機MAC地址
    0800:IPv4協議
    6) 分析No.137數據包,網絡層(IP)報頭:

    45:0100(Version 4)+0101(報頭長度 20字節)
    00:差異化服務域(differentiated services field)
    00 34:總長度52字節
    f3 be:標識位(62398)
    04 00:標志位,非碎片化
    80:生存周期(128)
    06:協議(TCP)
    2c a3:頭部校驗和
    c0 a8 01 66:源地址192.168.1.102
    74 80a3 d3:目的地址116.128.163.211
    7) 分析No.137數據包,傳輸層控制層(TCP)數據:

    f4 47:源端口62535
    01 bb:目的端口443
    21 45 ed 33:序列號0
    00 00 00 00:確認號0
    80:頭部長度32字節
    02:標識號(SYN)
    ff ff:窗口大小65535
    90 32:校驗和
    00 00:緊急指針
    剩余的是可選字段。
    8) 跟蹤TCP數據流,發現本機向服務器發送[SYN]后,服務器向本機發送[SYN,ACK]報文,本機再次向服務器發送[ACK]報文,至此TCP三次握手完畢,開始正式通訊。

    9) 本機向服務器發送TLS報文,內容是Client Hello,這是一個登陸服務器的握手協議。傳輸層安全(Transport Layer Security,TLS)是為網絡通信提供安全及數據完整性的一種安全協議。TLS與SSL在傳輸層對網絡連接進行加密。
    10) 服務器回復[ACK]并發送Server Hello,Server Hello以分段segment形式發送了好幾個包,包括Certificate 和最后的 Server Key Exchange ,中間穿插本機對每個包的[ACK]應答:

    查看最后一個certificate數據包,即151號報文,Wireshark顯示它由3個TCP分段(147、149、151)組成,而SSL層是TLSv1.2加密的握手協議:

    查看152號報文,交換Server參數,這里使用了Diffie-Hellman算法,需要交換算法參數

    11) 到此,密鑰已協商完畢,客戶端和服務器端互相通知Change Cipher Spec(表示之后使用加密傳輸),并使用Encrypted Handshake Message表示這是協商好密鑰之后第一條加密消息,以驗證交換的密鑰無誤。

    12) 本機在155號報文中交換客戶端密鑰,如下圖所示,并通知服務器

    13) 服務器在156號報文中發送了Session Ticket,以保持一個會話,避免每次通話都要進行密鑰協商:

    14) 本機客戶端通過協商好的密鑰加密了登錄信息,發送Application Data給服務器,服務器回復[ACK]之后也發送加密的Application Data,確認登錄成功。

    TLS加密的應用數據報文如下:

    15) 此時已經登錄完畢,服務器端發送[FIN,ACK]結束會話,客戶端回復[ACK]再發送[FIN,ACK]確認結束,服務器回復[ACK],TCP四次握手結束會話。

    4.3 消息傳輸

  • 登錄 QQ 后開啟Wireshark抓包,發送3條消息后停止抓包。
  • 由于消息是通過 UDP 協議傳輸,設置顯示過濾器為“udp.stream eq 1”,找到OICQ協議及其他消息:
  • 查看第一條OICQ報文,即第22條數據報文,顯示為即時通訊軟件的命令,版本號0x392b,內容為獲取朋友狀態,序列號22075,并顯示了我的QQ號144******:

    根據之前分析的QQ協議格式,可以逐字節分析:
    02:TCPF包識別碼
    39 2b:客戶端版本號
    00 81:命令標識(129)
    56 3b:命令序列號(22075)
    55 ec 71 6f:客戶的QQ號碼(144********)
    后面的5a~d8可能是一些附加數據,加密無法解析,不得而知了。
    03:TCPF包結尾標識符
  • 第二條OICQ報文即第27個數據包,內容為下載朋友群組,序列號22124,分析方法類似。
  • 查看UDP流的所有可顯示字符,發現并沒有明文顯示消息內容,可知QQ的消息是使用了之前交換的密鑰加密的。
  • 參考文獻

    [1] 騰訊QQ,騰訊最新財報:QQ年輕用戶月活躍同比增長13%,Available: https://zhuanlan.zhihu.com/p/59986430
    [2] 騰訊科技,騰訊2020年Q1財報:QQ每日總消息數及使用時長同比雙位數增長,Available:https://tech.qq.com/a/20200513/066084.htm
    [3] 百度百科,QQ,Available:https://baike.baidu.com/item/QQ
    [4] 騰訊QQ,QQ·PC版,Available:https://im.qq.com/pcqq/
    [5] Cisco,NBAR2 Protocol Pack 22.0.0 Chapter: Protocols: Q, R,Available: https://www.cisco.com/c/en/us/td/docs/ios-xml/ios/qos_nbar/prot_lib/config_library/pp2200/nbar-prot-pack2200/nbar-prot-pack2200_chapter_01111.html#wp2970606887

    總結

    以上是生活随笔為你收集整理的QQ业务及协议分析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。