QQ協議分析及還原

最初,QQ通信協議並沒有加密,而是直接採取明文的方式進行傳輸,到了後來才使用了加密傳輸,加密算法一直沒有變過,使用的是blowfish算法,但是密鑰的交換協議變得比較頻繁。其實TX也是被逼的,現在的互聯網用戶比前幾年更加註重隱私安全,這麼大用戶量的通信軟件,如果用戶與對方之間的聊天信息可以輕易的被第三方破譯獲取,那麼用戶量肯定會離開她,而去選擇那些能夠更加保護好個人隱私的人通信軟件。因此,隨着時間的推移和技術的發展,以前設計的協議可能會被研發者發現一些弱點,“圖謀不軌”者加以利用,會對TX造成一些潛在的風險,他不得不對協議進行修改(QQ2011正式版中的密鑰交換中對密碼的MD5計算就加入了salt的概念,這個salt就是對應的QQ號碼,後面會有詳細的描敘)。

QQ協議首選的傳輸層是UDP,如果UDP不可登陸,那麼會再嘗試使用TCP進行傳輸。UDP使用的端口是8000,TCP使用的端口是443,應用協議基本一樣,只是在通過TCP進行傳輸時,前兩個字節爲協議內容的長度(包括2個字節)。

QQ協議中每個通信內容都帶有一個協議頭部,如下圖:

其中標識1一個字節,版本號、命令字和序號都是2個字節,QQ號碼有4個字節,接下來是數據部分(已加密),最後是一個尾部標識1個字節。

在進行協議還原的時候,最關心的就是協議頭部的命令字,需要根據不同的命令字,來進行相應的處理,最終獲取密鑰解密聊天內容。

 

QQ登陸協議密鑰交換過程,首先我們使用Wireshark抓報文分析,觀察主要用到的命令字(見上一篇Header部分的介紹)。

QQ2011登陸過程分析
命令字 含義
1、Touch Information(0×0091) 根服務器SAY HELLO,如果對該報文做一些小動作,可以讓QQ認爲,TX的服務器或網絡不能訪問…
2、Login Request(0x00ba) 未知,可以不進行處理。
3、Login Verify(0x00dd) 向服務器發送登陸請求,需要使用密碼進行運算作爲密鑰才能機密該報文,解密的報文中包含對第4步的解密密鑰。
4、Login get Information(0x00e5) 未知,但是服務器返回的報文你必須得知道,因爲這個報文中包含解密會話密鑰報文(第6步)的密鑰。
5、Login verify E3(0x00e3) 未知,可以不進行處理。
6、Login send Information(0×0030) 客戶端向服務器發送sessionKey,使用第4步獲取的密鑰進行解密。

 

 

 

 

 

 

 

 

 

 

1、Touch Information(0×0091)

這個報文無需關心,是客戶端向服務器在SAY HELLO…

2、Login Request(0x00ba)

未知,在此處並不重要。

3、Login Verify(0x00dd)

非常重要!!獲取會話密鑰首先得解密該報文。但是要解密該報文,必須得知道該登陸QQ用戶的密碼,而用戶密碼只有用戶和TX知道,第三方是不知道的(也有可能存在“不可思議”的第三方…)。數據傳輸過程中使用的加密算法是blowfish,這個算法目前從公開的資料上來說,還沒有發現漏洞。因此,要實時獲取用戶的聊天信息,除非已經知道密碼了,或者已經暴力破解了密碼(這裏簡單介紹一下怎麼進行暴力破解,這裏的暴力破解,當然不是模擬一個QQ客戶端不停的向TX服務器發送登陸請求,這樣太慢了,而且TX那邊也會有記錄。首先,得分析出這個報文的密鑰生成算法[不是簡單的直接使用密碼作爲密鑰],加密算法(這個已知,是blowfish),第二,需要將對方的登陸報文截取保存到文件,然後寫一個程序,不停拼接字符串、數字、標點符號進行組合,根據第一步分析它密鑰的生成方法生成出密鑰,然後作爲blowfish算法的密鑰,去解密報文,如果解密成功,恭喜你,你暴力破解到了一個QQ密碼。但是這種概率比較小,即使有一些,這些號碼的價值不大,扯遠了…)。

LoginVerify報文的解密密鑰生成方法,在QQ2011版本之前,是MD5(MD5(PWD)),對QQ的密碼做了兩次MD5運算。但是QQ2011版本(包括2011版本)之後,這個算法做了一點修改,就是:MD5(MD5(PWD+QQ_NUM)),這個修改其實是非常有必要的,爲什麼呢?因爲隨着硬件技術的發展,以及前些年MD5彩虹表的推出,簡單密碼的MD5值非常容易就能從彩虹表中找出對應MD5值,從而得到原始字符串密碼,即使TX做了兩次的MD5運算。在彩虹表的推出或以前(因爲我也不知道是在這以前還是以後,呵呵),在執行MD5運算時,就有了加SALT的說法,很形象!加鹽,在這裏,QQ_NUM就是鹽,這樣就加大了使用彩虹表破解的難度。

使用密碼根據以上的算法得出解密密鑰,解密Login Verify報文後,會得到一個新的密鑰,這個密鑰暫且就叫做verify_key。

Login Verify Reply(0x00dd)

服務器對客戶端Login Verify報文的響應,這個報文需要verify_key作爲密鑰進行解密,得出一個新的密鑰-verify_reply_key。

4、Login get information(0x00e5)

客戶端接收到服務器的Login Verify Reply報文後,會使用verify_reply_key加密數據發送到服務器,而這裏面又包含了一個key – get_info_key。

5、Login verify E3(0x00e3)

未知,此處可以不進行處理。

6、Login send Information(0×0030)

使用get_info_key解密該報文,得到會話KEY – session key。

回想一下:密碼是關鍵,有了密碼才能解密Login Verify(0x00dd)報文,解密了Login Verify(0x00dd),才能解密後續的的報文。其步驟是:passwd -> verify_key -> verify_reply_key -> get_info_key -> session_key。

前面兩篇簡單的介紹了QQ登陸協議密鑰交換過程以及所使用的加密算法,知道了這兩點,就可以對它的協議進行還原了。

QQDecrypt,通過winpcap抓包,實時對QQ聊天協議進行還原。

除了聊天協議之外,我們還可以對QQ相關的協議進行還原,包括但不限於:

1、QQ文件傳輸

2、QQ音頻傳輸

3、QQ視頻傳輸

4、QQ密碼驗證程序

5、QQ密碼獲取,是的,你沒有看錯,有一種主動的方法(用戶登錄時)就可以獲得QQ的密碼。在網絡出口獲取,而不是在客戶端進行HOOK的方式獲取。

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