QQ下载和分析示范

发表于:2007-05-26来源:作者:点击数: 标签:
需要软件: PC 上:QQ2003(0808)或最新版本。 windump OS X上:showUDP calcMD5 qqDecrypt 准备工作: 把QQ的密码改为 123456。目的是以后分析方便。 把PC上可能的 网络 通讯软件都关闭,避免其它数据干扰我们的分析。 截获QQ与 服务器 的通讯数据: 我们

需要软件:

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中查到。前面的一些,分别代表字号,字型等,通过试验就可以了解。

我们就是这样逐步知道这些数据包内容的含义的。。。

原文转自:http://www.ltesting.net