<a target="_blank" href="http://www.cnhonkerarmy.com/forum.php?mod=viewthread&tid=153514">http://www.cnhonkerarmy.com/forum.php?mod=viewthread&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->S向伺服器發送登陸請求,需要使用密碼進
行運算解密的封包中包含對第2步的解密密鑰。
Login verify reply(0x2608)
S->C伺服器傳回的封包,使用第1步獲得的密
鑰進行解密,可以獲得解密第3步的密鑰。
Login session(0x2808)
S->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->verify_key->verify_replay_key->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相容。它獨立于下層的網絡硬體和作業系統。