需要软件: PC 上: QQ2003(0808)或最新版本。 OS X上: showUDP 把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 你会发现其中有这样的一些魔术般的数字: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中查到。前面的一些,分别代表字号,字型等,通过试验就可以了解。 我们就是这样逐步知道这些数据包内容的含义的。。。
windump
calcMD5
qqDecrypt
准备工作:
数据的预处理:
后续数据包的解开:
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