来自于:http://forum.maxthon.com/forum/lofiversion/index.php/t4228-50.html
Linux应用技巧
在Linux中也可以使用“QQ”
作为国内最著名的聊天软件之一,QQ在广大网民中有着很大的影响,而腾迅公司并没有推出QQ的Linux版本。如果在Linux下无法使用QQ,那将是一个很大的遗憾。但是这难不倒自由软件爱好者,热心的网友推出了即时通信软件Gaim,在Gaim的基础上安装一个QQ插件,这样就可以在Linux中使用QQ号登录聊天了。
Gaim最初是作为AOL的即时通讯软件AIM的客户端进行设计的,从它的名字就能看出来,Gaim其实就是GNU AIM。在即时通讯领域,另起炉灶和Windows平台下的巨头竞争显然是不现实的,于是Gaim的开发者寻找到了一个绝妙的切入点。Gaim本身并不具备通讯功能,而是使用插件(通常一个插件就是一个扩展名为SO的库文件,在Windows中就是扩展名为DLL的动态链接库),因此具有博采众家之长的优势。得益于模块化的设计思想和源代码的开放共享,Gaim迅速成长起来。
LibQQ是Linux平台下的一个支持QQ协议的Gaim插件,目前已经初步实现了Windows下QQ软件的一些最基本的功能,在很大程度上已经可以满足在Linux下使用QQ的要求(支持点对点的消息收发)。
在Linux中使用Gaim的QQ插件有一些讲究,需要相应版本的Gaim配合相应版本的LibQQ插件,版本要求严格符合才行。推荐使用Gaim 0.62配合LibQQ for Gaim 0.62,这是目前广大玩家反映使用效果较好的一个组合,大家可以在
http://www.linuxeden.com/download/winapps/...qpatched.tar.gz
下载
该软件。由于该软件发布是采用源代码发行,需要在下载后重新编译该软件,所以你需要预先安装GCC编译器才行。
1.安装
使用“
tar -xzfv gaim-0.62-libqqpatched.tar.gz
”对软件包进行解压缩,然后进入解压缩生成的Gaim-0.62目录,仔细阅读Install软件。按照先前介绍的软件安装方法,先精心设置软件安装前的配置:运行
./configure
命令,这个命令会检查系统相关的环境资料是否满足安装需要并进行一定安装配置,这个过程会耗费一定的时间,请耐心等待。Configure运行完毕后,请接着运行Make进行编译,然后使用Make Check进行编译结果的检查,最后使用Make Install进行软件的最后安装。安装完毕后,就可以用Gaim命令启动Gaim以及QQ插件了(图1)。
如果你是第一次使用Gaim,你需要装入相应的插件。Gaim缺省提供了很多及时聊天程序的协议插件,比如MSN、ICQ、Yahoo Messager等等,这里我们需要装入QQ协议的插件,如图2。然后选择我们提供的QQ协议插件所在的目录,点击这个文件名,然后选择“加载”(Load),如果你的Gaim版本和你的QQ协议插件的版本一致(Gaim在装入插件的时候需要检查版本号),将出现如图2所示的协议信息,表示QQ协议插件已经正确装载了。
2.设置
图3是输入QQ号和密码的界面,首先选择协议,这里我们选择的是QQ,会出现和QQ有关的一些设置选项。QQ Server是QQ服务器的IP地址,这个地址可以在Windows版的QQ的网络设置选项中找到。QQ Server Port是QQ服务器的端口号,这个一般都是
8000
。Login Method是缺省上线的方法,0表示“
隐身
”登录,1表示“
正常
”登录,2表示“
离开
”。添加完账号之后,就可以在账号登录界面中输入账号登录了,可以用
Ctrl
键选择多个账号同时登录,不同协议的账号也可以同时登录。
如果你是第一次选择某个账号登录,程序会自动从服务器下载你的好友名单,和Windows版本的QQ程序一样,也将先显示出来好友的数字号码,然后逐个获得好友的昵称。程序会保存好这个账号的好友名单,下次登录时就会直接显示好友的昵称和头像了。
3.使用
登录成功之后,就可以像Windows版本的QQ一样和好友聊天。双击好友的头像,就可以出现聊天窗口(如果收到别人的消息,该窗口也会出现)。Gaim还为用户提供了一个Debug窗口,可以提供一些程序内部的调试信息。QQ协议插件有大量的调试信息在该Debug窗口中显示出来,如图4。
最后修改: 2003年10月3日
QQ的版本:
QQ的版本升级比较频繁,而且与多数的软件不同的是,它客户端的升级往往伴随着协议相应的改变。
目前,对研究QQ协议版本比较重要的是:
QQ2000c 。它对应的客户端协议版本是08xx,目前对这个版本的研究比较多。
QQ2003 (0808) 这是腾讯最新公布的QQ版本,目前发现它对应的客户端协议版本是0A 1D。目前对这个版本的研究才刚刚开始,此版本对协议做了比较大的改动。
协议类型:
我们尝试把QQ的协议进行分类:
文字聊天协议族(TCPF, Text Chatting Protocol Family):它主要支持与其它QQ客户端进行文字聊天。TCPF是建立在UDP协议之上。UDP数据包中的第一个字符02为这个协议族的标识。TCPF的服务器使用8000号端口,腾讯的QQ客户端软件一般从4000号端口开始尝试使用,但实际上,对客户端使用的端口号并没有限制。目前的研究集中在TCPF上。
其它未知可能存在的协议族:
我们观察到QQ除了与TCPF服务器通信以外,还有与其它的服务器使用UDP进行通信。目前我们观察到的服务器为 218.17.217.111 : 8000。客户端使用与TCPF不同的端口。目前观察到的从客户端发出的包以06开头,而服务器返回的包则以01开头。目前其具体作用未知。我们注意到一个有趣的现象是,如果选择离线后重新上线,那么在发出登录包之前,这个通讯已经开始。我们暂时把它命名为数据传输协议族(DTPF,Data Transfer Protocol Family)。最新的研究发现,它传递的是QQ Show的图片数据。
语音、视频聊天:目前还没有开始分析,尚未知道是使用UDP还是TCP协议。
聊天室:没有分析,应该是TCP协议。
随着对这些协议分析的开始,我们会给它们更精细的划分和恰当的命名。
TCPF:
TCPF是建立在UDP协议上的协议族,主要支持文字聊天功能。TCPF是以请求-响应模式工作的。也就是说,客户端发出一个请求,服务器端会给出一个相应的响应;服务器向客户端发送信息,客户端也会给服务器相应的响应。请求和响应通过相同的序列号来进行配对(请求代码也应该相同)。而且每种请求的发起方都是相同的。目前,已知的请求包括:
0x0001 注销登录
0x0002 心跳信息
0x0004 更新用户信息
0x0005 搜索用户
0x0006 获取用户信息
0x0009 不需认证方式添加好友
0x000a 删除好友
0x000b 需要认证的方式添加好友
0x000d 设置隐身、示忙等状态
0x0012 确认收到系统消息
0x0016 发送消息
0x0017 收到消息(服务器发起)
0x001a 未知作用。
0x001c 在对方好友列表上删除自己
0x001d 未知作用。
0x0022 登录
0x0026 获取好友清单
0x0027 获取在线好友
0x0030 群操作指令
0x0080 收到系统消息(服务器发起)
0x0081 收到好友状态改变消息(服务器发起)
修订历史:
2003年10月3日 jeff_yecn增加群操作的定义
2003年8月30日 jeff_yecn增加对DTPF的命名
2003年8月29日 jeff_yecn创建
61.144.238.146 : 8000
202.104.129.251 : 8000
202.104.129.254 : 8000
61.141.194.203 : 8000
202.104.129.252 : 8000
202.104.129.253 : 8000
61.144.238.145 : 8000
218.17.209.22 : 8000
最后修改: 2003年8月30日
包结构类型:
TCPF包我们把它分为5类:
登录请求包(LIP,LogIn Packet),它是由客户端向服务器发出登录请求的数据包。
登录应答包(LRP,Login Reply Packet),它是由服务器响应客户端登录请求的数据包。
注销请求包(LOP,LogOut Packet),它是由客户端向服务器发出注销登录请求的数据包,服务器对这个包不作应答。
客户端其它包(CSP,Client Sent Packet),它是由客户端向服务器发送的其它包。
服务器其它包(SSP,Server Sent Packet),它是由服务器向客户端发送的其它包。
包头:
所有TCPF包的前7个字节是包头,包头可以识别TCPF包的内容。包头的格式为:
第0字节:TCPF包标识:0x02。
第1-2字节:发送者标识。如果是0x01 0x00,表明是由服务器发送。客户端的标识与所使用的使用的QQ版本有关,目前最新版本QQ2003(0808)的标识为0x0A 0x1D。具体的协议的格式与这个字段所标识的客户端版本有关。目前我们以这个最新的0A1D版本来讨论。
第3-4字节:命令编号。具体的命令编号含义在《QQ协议概述》(Protocol Overview.rtf)中有描述。如果这个字段是0x00 0x01,那么这是一个注销请求包。如果这个字段是0x00 0x22,而发送者标识是0x01 0x00,那么这是一个登录应答包。如果这个字段是0x00 0x22,而发送者标识是其它(例如0x0A 0x1D),那么这是一个登录请求包。其它的命令代码表明是其它包,我们通过发送者标识来区分它是CSP还是SSP。
第5- 6字节:命令序列号。客户端和服务器都有各自的当前发送序列号。每初始发出一个指令的时候,使用当前的序列号,然后把当前序列号加一,如果超过0xFFFF,就绕回。如果是响应对方发出的命令,则使用这个命令的序列号。例如,客户端当前的序列号为0x1110,它向服务发送一个0x0016命令,它使用0x1110这个序列号,服务器收到以后,返回一个序列号为0x1110的0x0016命令响应。下一次,客户端又发送一个0x0026命令,这一次它使用加一了的序列号0x1111,服务器也响应0x1111序列号的一个0x0026命令响应。如果这是服务器要向客户端发送0x0017命令,它使用它自己的当前序列号,比如说0x2220,客户端收到以后,也响应一个序列号为0x2220的0x0017命令应答。我们可以通过序列号来判断发出的指令是否已经得到了应答,如果没有,可以重发。服务器对收到的命令的序列号
顺序没有要求。服务器也不会一定按照发出的顺序给予应答。
包尾:
所有的TCPF包都以0x03作为包尾。在包头和包尾中间的包数据则不同类型的包有所不同。
LIP包:
登录请求包的包数据格式为:
第7-10字节(4 bytes):发出登录请求的QQ号码。这是一个Big Endian(高位在前)的unsigned long型数值。例如:0x01 0x82 0x5D 0x90就是0x01825D90,转换为十进制是25320848,表明发出请求的QQ号是25320848。
第11-26字节(16 bytes):随机密钥。这个密钥由于加密后面的数据。QQ使用TEA算法来加密数据。它使用的是128bit(16 bytes)的密钥。在0A1D版本中,这个密钥已经固定为16个01。
第27-106字节(80 bytes):加密后的登录包数据。
LRP包:
从第7字节开始到包尾前:加密的登录应答包数据。解密的密钥随客户端版本的不同,有不同的可能。在旧有版本中,使用登录包的随机密钥,在后期的版本,使用用户QQ密码的MD5 Digest。在0A1D中,使用QQ密码的MD5 Digest的MD5 Digest(这体现了腾讯有多么的愚昧和无耻,为了改变而改变)。LRP包内数据很重要的是16个字节的Session Key,它用来作为以后通讯的加密密钥。
LOP包:
它的序列号总是0xFFFF。不过,在新的版本中,好象已经没有了这个要求。
第7-10字节(4 bytes):发送注销登录请求的QQ号码。
第11字节到包尾前:加密的注销登录包数据。使用Session Key作为密钥。
CSP包:
第7-10字节(4 bytes):发送请求的QQ号码。
第11字节到包尾前:加密的包数据。使用Session Key作为密钥。
SSP包:
从第7字节开始到包尾前:加密的服务器发送包数据,使用Session Key作为密钥。
QQ加密算法概述:
QQ使用的加密算法来源于一种称为TEA(Tiny Encryption Algorithm)加密算法。它是在1994年由英国剑桥大学的David Wheeler和Roger Needham所发明的一种加密方法。大概来说,它是使用128bit密钥加密64bit数据产生64bit输出的一种算法。这种算法的可靠性是通过加密轮数而不是算法的复杂度来保证的。具体的算法可以参考:http://www.ftp.cl.cam.ac.uk/ftp/papers/djw-rmn/djw-rmn-tea.html。实现可以参考:http://abcn.net/crypto.htm。
QQ使用16轮的加密(这是最低限,推荐应该是32轮)。
QQ在使用这个算法的时候,由于需要加密不定长的数据,所以使用了一些常规的填充办法和交织算法(也就是说,把前一组的加密结果和后一组的进行运算,产生新的结果)。
具体的填充算法是:原始字符串加上8个字节再加上填充字符数应该是8的倍数(至少填充2个字节)。填充后的字符串是这样组织的。第一个字节,为填充字符数减2 OR 上0xA8。后面是填充字节。然后是待加密的数据,最后是7个0。填充的字节一般是0xAD,但再0A1dD版本中,会使用随机的填充字符串。一般,我们会用解密后最后是否7个零来判断是否正确的解密。
交织算法:第一个64bits块,按照一般的TEA加密。下一个64bit块与上一组的加密结果XOR生成待加密数据,加密后与上一组的待加密数据XOR生成加密结果。
文档历史:
2003年8月30日 jeff_yecn创建。
采集QQ数据是我们对QQ协议进行分析的基础。由于我们不可能有完整的QQ的使用环境,所以我们需要您的帮助来使我们获得必要的数据,使我们能够做出功能更完善的软件。
隐私说明:
您帮我们采集的数据,只会用于isQ小组内部进行分析使用。我们保证不会公开这些数据资料。在下面的采集过程中,我们也精心设计了流程,使其中涉及尽量少的个人隐私。
需要使用的硬件和软件:
一台PC机,安装有能够运行QQ的必要的windows操作系统。我们建议为windows 2000。除非特别的采集需要,它最好通过ADSL直接上网。(这是使用一些QQ功能的条件)。
QQ 2003 (0808)或更新版本。如果你不是这个版本,请到腾讯的网站下载。(http://www.tencent.com)。
windump软件。这是我们用来采集的软件。你可以在:http://windump.polito.it/install/default.htm下载。同一下载页面还有一个下载WinPcap的链接,你也需要下载它。在使用windump前,你需要安装WinPcap。WinPcap可以按照windows软件的通常方法进行安装。然后,把下载的windump文件放在C盘的根目录底下(这样,一进入命令行就可以运行它,比较方便)。
在开始采集之前,你还需要准备一张纸和笔,以记下你的所需要的一些操作和系统的反馈。
开始之前的热身:
首先,希望你先熟悉一下QQ的使用,尤其是这次要采集的功能的操作。这对我们的分析很重要,因为,如果中间有误操作,我们分析的时候可能也会把误操作也作为了必需的操作了。另外,我们分析的时候,会按照发生的时间来猜测哪些数据包是相关的,所以,如果你的系列操作中有过长时间的停顿的话,也会使我们产生错误的猜测。我们希望你能在开始收集之前,先找到这次所要收集的功能的最简洁和完整的操作方法。
熟悉一下,我们进行收集的命令。在左下角,点“开始”按钮,选择“运行”。在弹出的对话框中输入 cmd,然后按确定。这会打开windows的命令行窗口。然后在命令行窗口输入windump,然后按enter键。如果一切正常的话,应该会显示大概是下面的信息:
windump: listening on \Device\........
你可以按Ctrl+C组合键来终止这个命令的运行。
准备工作:
把你的QQ密码更改为 123456 。这主要是保证你平常使用的密码不会泄露给我们,另外也方便我们的分析。
关闭其它不必要的网络程序,避免产生干扰数据。如果有必要的话,重新启动计算机。
开始收集过程:
1. 打开命令行窗口,输入命令,开始收集:
windump -w pc.dump -s 0 udp
2. 运行QQ,登录。
3. 登录成功以后,略微等 4 到 5 秒。主要的目的是把登录的命令和后面要收集的命令区分开来。
4. 执行需要收集的操作,中间注意把操作细节记录下来。包括操作顺序,系统的反馈提示,输入过的信息。如果一个操作比较长时间才有反馈,请把大约的时间间隔记录下来。如果你觉得还有什么我们可能需要的信息,也把它记录下来。信息越详细,越有助于我们进行猜测。
5. 需要记录的信息完成以后,略等4到5秒,选择离线。目的也是把后面的操作和中间的操作区分开来。
6. 回到命令行窗口,按Ctrl+C结束收集。
结束工作:
根目录下面应该有了一个pc.dump文件,把它保存到你自己的目录中。因为,下次你的收集会再覆盖了这个文件。
把你的QQ密码改回原来的密码。
把你的操作过程,整理成计算机文本文件。文件格式请选择一般通用的PC和MAC上都可以阅读的格式。例如纯文本,RTF等。
把这个文本文件和收集的pc.dump发给我们,请留下你的通信方式。因为很多情况下,我们可能需要对一些细节进行补充收集。
保存这个文件和收集的数据。由于网络传输不一定可靠,所以你要保留一个备份,以便有必要的话,进行重传。我们在收到你的收集的数据以后,会给您反馈确认。
其它建议:
每次采集尽量专注于一个功能,这样有助于我们的分析。
如果连续进行多次采集,注意要在每次采集的过程中备份pc.dump文件,因为这个文件会在每次采集过程中被覆盖。
每次采集的数据都应该包括登录过程,这样我们才能够获得足够的信息来对数据包进行解密。也就是说,命令行运行的采集命令必需在开始登录前发出。
回馈:
采集高质量数据是一项烦琐而且本身也需要灵感的工作,一个富有经验的数据采集人员和一个新手所采集的数据,对分析的难易是有很大差别的。所以,我们希望您能够长期和我们保持合作,这样,我们之间才可以建立默契,以保证高效的工作。
作为数据采集人员,你拥有以下的权利:
在isQ软件的Credits里面注名。每个版本,我们只会注名这个版本开发期间和我们合作的采集人员的名字。当然,你也可以选择匿名,如果你选择匿名话,请告诉我们。
获取我们对协议的最新研究成果。我们鼓励您能够尽量对协议进行了解。对协议本身了解的人,可以更有针对性的进行采集。这些资料,除了了解有关协议以外,如果你对TCP/IP网络的通讯技术或加密解密技术希望有深入的了解的话,是非常珍贵的财富。这些资料,仅限于您个人使用。如果你希望获取有关资料,请与我们联系,了解有关细节。
获取isQ的最新版本。除了面向大众的正式版和Beta测试版以外,您还可以获得alpha测试版和部分的中间开发版本。
最后,再次感谢您对渤麦堂 isQ 开发小组的支持!
这插件可以改改吗,如果可行,就麻烦您了。
我安装的地址是:http://free3.e-168.cn/yangyan/qq/qq.html
网页版QQ
有ASP+Database 服务器使用的插件哦...
在显示的界面上输入QQ号码和密码,点击“登录”按钮就可以登录了。
图 网页版QQ
登录后点击“在线好友”,会显示所有在线的好友,双击某个好友就会弹出聊天窗口进行聊天了,如图所示。
如果想查看某个好友的资料,只要单击选中该好友,然后点击下面的“查看好友信息”链接,就会弹出一个显示该好友资料的对话框。
提示:网页版QQ的聊天窗口和软件的也差不多,但是下面的工具栏按钮还不能使用,只能进行文字聊天。
最后修改:2003 年 8 月 31 日
需要软件:
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中查到。前面的一些,分别代表字号,字型等,通过试验就可以了解。
我们就是这样逐步知道这些数据包内容的含义的。。。
修改历史:
2003 年 8 月 31 日 jeff_yecn 创建。
最后修改:2003 年 8 月 31 日
需要软件:
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中查到。前面的一些,分别代表字号,字型等,通过试验就可以了解。
我们就是这样逐步知道这些数据包内容的含义的。。。
修改历史:
2003 年 8 月 31 日 jeff_yecn 创建。