QQ客戶端獲得登錄令牌後,會向服務器發送包含登錄信息的登錄請求,要求登錄。該服務將首先檢查客戶端的編號、I地址和版本是否可以登錄到該服務器。如果是,驗證客戶端的登錄信息是否與服務器上存儲的登錄信息相比較。如果匹配,它將向客戶端返回壹個成功的登錄數據包。如果不匹配,它將返回失敗的登錄。因為QQ服務器比較多,可能需要負責不同的QQ版本,IP等。,所以如果客戶端的號碼、IP地址、版本無法登錄到這臺服務器上,服務器會返回重定向包,讓客戶端登錄到另壹臺服務器上。其實整個QQ登錄過程就是這麽簡單的兩步。
在了解了QQ登錄流程後,我們還需要了解人性化的數據包格式,以便分析我們需要的數據內容。QQ登錄過程中的數據包分為三部分:頭部、內容和尾部。頭的格式固定為:0x02客戶端版本命令序列號QQ號,其中0x02是1字節的符號;客戶端版本2字節。用於表示QQ客戶端的版本;2個字節的命令,表示要發送的命令類型,如登錄令牌請求等。序列號是壹個2字節的隨機數,用於在QQ會話中確認響應包是否對應於請求包。QQ客戶端默認每次加1;QQ號碼是壹個4字節的QQ號碼。對於服務器來說,每個字段用不用都無所謂。QQ登錄數據包的結尾固定為0x03。
1.請求登錄令牌包
包的內容是命令的具體信息。對於第壹個發送的請求登錄令牌包,包命令是0x0062,整個請求包如下。
但是服務器返回的包比較復雜,如下圖;
其中,0x18代表登錄令牌的長度。現在QQ默認的登錄令牌長度是0x18。這個令牌在服務器端生成。當然,具體的生成算法我們不得而知。我們要參考QQ客戶端的I-address、port等信息來生成這個版本,因為如果妳把在A機獲得的token用到B機上,妳將無法登錄。如果您更改機器A上的IP,
2.登錄包。
對於我們來說,嗅探QQ密碼,最重要的就是這個登錄包,裏面有QQ密碼的相關信息。登錄包的具體結構如下:
初始密鑰是壹個16字節的隨機數,用來加密自身。這裏最重要的是壹個由密碼密鑰加密的空字符串。
所謂密碼密鑰,就是用QQ密碼經過兩次MD5加密後得到的密文,然後用這個密文作為密鑰加密壹個空字符串。本次加密采用反饋式TEA算法,加密結果放在QQ登錄包中供服務器驗證。因為QQ加密算法使用了特殊的填充機制來驗證用戶的密碼是否正確,這個後面會詳細解釋。QQ登錄包裏還有登錄狀態,登錄順序版本等等壹些未知的內容。
特別是前面的請求登錄令牌包沒有加密,但是這個登錄包除了初始密鑰本身以外的所有部分都要用初始密鑰加密,加密算法也是反饋TEA。
收到此登錄包後,QQ server必須首先用初始密鑰解密登錄包的後面部分。如果解密成功,它將使用存儲在服務器上的秘密信息解密由密碼密鑰加密的空字符串密文。我不確定QQ服務器上存儲的是密碼明文還是密碼密鑰。我猜是密碼鑰匙。因此服務器將使用密碼密鑰解密16位密文。如果用戶提交的密碼正確,就可以成功解密。否則,解密函數將返回null,身份驗證將失敗。當QQ客戶端的密碼被驗證為準確無誤時,將會返回壹個登錄成功數據包。格式如下:
QQ的加密算法
在了解了上面QQ登錄的通信協議後,僅僅破解QQ密碼是不夠的。我們還需要掌握QQ加密算法。如前所述,密碼密鑰是對用戶密碼進行兩次MD5加密的結果,然後將空的結果作為密鑰進行加密。TEA是微小加密算法的縮寫。顧名思義,是壹個比較簡單的小加密算法。它使用16字節的密鑰對壹個8字節的明文進行加密,得到壹個8字節的密文。它還可以從密文中反向解密出明文。具體算法可以在網上搜索和咨詢。
不過QQ用的茶雖然是標準茶,但是QQ用的是自己特殊的填充反饋機制。QQ消息分為多個加密單元。每個加密單元是8個字節。是茶加密的。加密結果將被用作下壹個單元的密鑰。如果明文本身的長度不是8的倍數,它將被填充,使其成為8的倍數。填充時,將在明文的開頭存儲壹個32位的隨機數。在明文的末尾,將填充0,使整個長度是8的倍數。因為會反饋,即使是同樣的明文,因為用的是不同的。
使用這種特殊填充反饋算法的結果是,密文只能用加密它的密鑰來解密。如果使用了不正確的鍵,則無法獲得正確的填充結果。最常見的是解密後得到的填充值不為0,因此判斷解密失敗。