需要軟件:
PC 上: QQ2003(0808)或最新版本。
windump
OS X上: showUDP
calcMD5
qqDecrypt
準備工作:
把QQ的密碼改為 123456。目的是以后分析方便。
把PC上可能的網絡通訊軟件都關閉,避免其它數據干擾我們的分析。
截獲QQ與服務器的通訊數據:
我們在windows的命令行輸入:
windump -w pc.dump -s 0 udp
由于我們目前只關心QQ使用UDP協議通信的部分,所以我們只選擇獲取UDP數據。
然后啟動QQ,執行一些我們所要分析的操作。
在命令行按ctrl+C,中斷截取數據的操作。
記錄下我們所對QQ做的操作。包括每一步操作的順序,系統反饋和要我們輸入的信息等等。
把當前目錄下生成的pc.dump文件傳送到Mac上準備做進一步分析。
數據的預處理:
我們在sample目錄底下已經有一個這樣的pc.dump。我們在開始分析前,需要對數據進行一些預處理,以方便以后的分析。
首先,我們要把這個文件轉化為方便閱讀的文本文件格式。我們使用:
showUDP pc.dump > pc.ascii
這時會生成了一個名為pc.ascii的文件。這個文件是一個文本文件,你可以用textEdit等編輯器來打開它。里面是分為一個包一個包的UDP數據的內容。我們可以簡單地判斷一下,把一些與QQ無關的數據刪除掉。然后我們保存下這個文件。在sample目錄里面,你也可以看到這個文件。
我們把這個文件進一步刪除一些我們暫時不感興趣的內容。比如,我們只留下以02開頭的數據包。這些數據包是我們稱為TCPF協議族的通信。它構成了QQ文字聊天功能的主體。我們把這個文件保存為tcpf.ascii。這是我們下一階段的分析重點。
下面,我們要準備一些解密的密鑰。
首先,在tcpf.ascii中,第一個包應該是以02 0a 1d 00 22開頭的登錄數據包。我們把它的隨機密碼部分(應該是16個01拷貝到一個空白的存文本文件中,并把它保存為loginKey.hex。然后我們把后面的登錄包數據部分(不包括包尾的03),保存為loginData.hex。
然后我們執行:
qqDecrypt loginData.hex loginKey.hex
這個程序的作用是使用loginKey.hex文件的內容作為密鑰去解密loginData.hex文件中的數據。
如果解密成功的話,程序輸出的最后一塊數據就是解密后的結果。我們把這塊數據保存為loginData.decrypt。這時我們就有了QQ登錄數據包的真實數據。
下面,我們還要制作一個文件,它里面是我們QQ密碼的ascii數值。對123456的密碼,應該就是31 32 33 34 35 36。我們的sample里面有這個文件,文件名為pwd.hex。
然后,我們還要制作我們密碼的md5 digest。這可以運行:
calcMD5 pwd.hex
這個命令會計算pwd.hex文件里面數值的Md5 digest。我們把輸出結果中的md5 digest保存到pwdmd5.hex中。然后,我們還要計算它的md5 digest:
calcMD5 pwdMD5.hex
把計算的結果部分保存到pwdmd5md5.hex文件中。我們可以使用它來作為密鑰解密登錄請求的應答數據包:
我們在tcpf.ascii文件中找到以02 01 00 00 22開頭的數據包,把它的數據部分拷貝到loginReplyData.hex中,然后運行命令:
qqDecrypt loginReplyData.hex pwdmd5md5.hex
輸出的結果就是登錄響應數據包的真實數據。第一個數字應該是0,后面的16個數值就是以后通訊所使用的密鑰。我們把它保存到名為sessionKey.hex文件中。
下面我們就可以用sessionKey.hex逐個解開這些以后的數據包,憑借著想象力和不斷的嘗試,我們可以越來越了解QQ協議的細節。
后續數據包的解開:
對于從客戶端發出的數據包,前7個字節是包頭,接著4個字節是你的QQ號碼。后面到包尾(不包括包尾03)是解密的包數據。我們把它拷貝到一個文件。比方說例子中我找了個0x0016命令的數據包,把它的數據放到了sendMsg.hex中。然后運行:
qqDecrypt sendMsg.hex sessionKey.hex
輸出的結果就是它的真實數據。我們把它保存到sendMsg.decrypt中。它是這樣的:
01 82 5D 90 0E C9 37 04
0A 1D 01 82 5D 90 0E C9
37 04 9D DD F7 1A F2 B0
96 CF 57 73 5A 56 3B 2C
D6 ED 00 0B 3B F0 3F 51
24 0E 00 CC 00 00 00 01
00 00 00 00 01 74 72 79
69 6E 67 20 00 09 00 00
00 00 86 02 CB CE CC E5
0D
你會發現其中有這樣的一些魔術般的數字:01 82 5D 90,轉換成十進制就是25320848。我的QQ號碼。0E C9 37 04,轉換成十進制就是248067844,macres的QQ號碼。74 72 79 69 6E 67,轉換成ascii字符就是trying。根據前面的操作記錄,我曾經試著向macres發送了一個trying的消息,很明顯這個數據包就是這個發送消息的數據包。
現在我們知道,0x0016是發送消息的命令。而且,我們對其中的一些內容也有些了解了。
CB CE CC E5是GB18030的“宋體”。顯然,它表示的是所使用的字體。關于18030的碼表,可以在http://people.netscape.com/ftang/testscript/gb18030/gb18030.cgi中查到。前面的一些,分別代表字號,字型等,通過試驗就可以了解。
我們就是這樣逐步知道這些數據包內容的含義的。。。