天天看點

QQ2012 Beta3->QQ2013 Beta1聊天協定剖析

<a target="_blank" href="http://www.cnhonkerarmy.com/forum.php?mod=viewthread&amp;tid=153514">http://www.cnhonkerarmy.com/forum.php?mod=viewthread&amp;tid=153514</a>

背景

QQ,一個通信工具,号稱擁有N億,現在注冊QQ已經是10位數了,如果QQ注冊的号碼是不斷遞增的話,那麼QQ應該已經被注冊了至少10億次。在中國,隻要你是經常上網的網民,手中必須得有一個QQ号,當然你也可以沒有,但你的朋友、同學、親戚、同僚全都有,大家都通過QQ進行溝通,你不用,要溝通多不友善啊。

作為一個通信工具,必定涉及到網絡通信協定。由于騰訊基于QQ這個産品承載了很多業務,要将協定全部分析完全就需要相當大的工作量了,而且沒有這個必要。今天就拿QQ中最基本的聊天協定進行分析一下。

協定

QQ協定首選的傳輸層協定是UDP,如果UDP不可用,那麼會再嘗試使用TCP進行傳輸。UDP使用的端口是8000(0x1F40),TCP使用的端口是443(0x1BB)。

QQ協定中每個通信包都有一個協定頭部,如圖:

使用結構體可以這樣表示:

typedef struct _QQ_DATA_HEAD

{

uchar ucFlag;

ushort usVer;

ushort usCmd;

ushort usSeq;

uint  uiSender;

} QQ_DATA_HEAD, *PQQ_DATA_HEAD;

在進行協定還原的時候,我們最關心的就是協定頭部的指令字,需要根據不同的指令字,來進行相應的處理,獲得密鑰解密聊天内容。

登入過程

這裡我們通過分析QQ密鑰交換過程來分析QQ的登入過程,這個過程很重要,最後得到的SessionKey将作為後面聊天記錄解密的密鑰。這裡隻列出關鍵的項,這些指令在QQ2012 Beta3以前的版本中也存在,但指令編号和解密資料存放的位置都有很大變化:

指令字      含義

Login verify(0x2608)

C-&gt;S向伺服器發送登陸請求,需要使用密碼進

行運算解密的封包中包含對第2步的解密密鑰。

Login verify reply(0x2608)

S-&gt;C伺服器傳回的封包,使用第1步獲得的密

鑰進行解密,可以獲得解密第3步的密鑰。

Login session(0x2808)

S-&gt;C伺服器傳回的封包,使用第2步獲得的密

鑰進行解密,可以獲得SessionKey,這個

SessionKey就是後面用來解密聊天記錄所使用

的密鑰。

相當重要!擷取SessionKey首先得解密該封包。但是要解密該封包,必須先知道登入QQ使用者的密碼,而使用者密碼隻有使用者自己知道(也許TX也知道),第三方一般情況下是不知道的。資料傳輸過程中使用的加密算法是TEA算法。

說到QQ密碼獲得,大概有這麼幾種方式:1、通過鍵盤記錄記錄使用者輸入(需要編寫驅動);2、使用dll注入,hook關鍵函數,截獲使用者輸入的密碼;3、獲得本地儲存的密碼hash,進行暴力破解(需要使用者記住密碼的情況)。這裡不多說了。

  LoginVerify封包經過兩次加密的:

LoginVerifyUdppacket = Key2 + Tea(Key2, Tea(Key1, PlainUdpPacket))

Key1 = MD5(MD5(Password)+QQ)

可以看出Key2是包含在包裡的,我們可以先使用Key2解密獲得封包1,再使用Key1解密獲得明碼的封包,明碼的封包中我們獲得了login_verify_key。這裡的Key1是QQ使用者密碼的QQ号碼經過兩次MD5獲得的。

這個封包是發送封包1後伺服器傳回的封包,使用login_verify_key解密該封包,可以得到login_verify_reply_key。

這個封包是伺服器發回來的,2和3中間還有一些封包,都不是獲得SessionKey所必需的,不做說明了。使用login_verify_key可以解密這個封包,獲得session_key。

回想一下:要獲得session_key,密碼才是關鍵,有了密碼才能解密LoginVerify封包,然後解密後續的封包。其步驟為:

Password-&gt;verify_key-&gt;verify_replay_key-&gt;session_key。

聊天記錄解密

使用上面的session_key即可解出聊天記錄,具體不做說明了。

執行個體程式

根據上面登入過程編寫了一個執行個體程式,截幾個屏吧:

鄭重聲明:本程式編寫純屬個人對技術的愛好,絕不含惡意代碼,請勿将本程式用于非法目的。

剛發現360會誤報,如需測試請先關閉殺軟。

QQMessageView_v1.0.0_bin.rar這個東西會員反應不能用  給個具體提示  

終于知道哪裡不能用了  主要是缺少wpcap.dll

當運作程式或者遊戲時,系統彈出錯誤提示“ 找不到 wpcap.dll”,或者“ 沒有找到wpcap.dll”時,說明您系統中缺失這個dll檔案或者該dll檔案沒有被注冊,您需要下載下傳wpcap.dll檔案将其解壓到相應目錄并注冊它。

dll檔案如何安裝?

通常是将 dll檔案複制到“ X:\Windows\system32 ” (X代表您系統所在目錄盤符,如:C:\Windows\system32 ) 目錄下。

有些 dll檔案需要手動注冊一下才能使用,手動注冊方法:

1.将對應版本的 dll檔案複制到“ X:\Windows\system32 ” (X代表您系統所在目錄盤符,如:C:\Windows\system32)目錄下。

2.在開始菜單中找到“運作(R)” 或者按快捷鍵 Win+R 。

3.在“運作(R)” 中輸入 “ regsvr32 wpcap.dll” (不含雙引号) 回車即可。

wpcap.dll是一個高層的強大捕獲程式庫,與Unix下的libpcap相容。它獨立于下層的網絡硬體和作業系統。

繼續閱讀