需要软件:
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中查到。前面的一些,分别代表字号,字型等,通过试验就可以了解。
我们就是这样逐步知道这些数据包内容的含义的。。。