您好,欢迎访问三七文档
QQ通信协议介绍2009-09-1817:29:11|分类:学习资料|字号订阅要通过抓取数据包来破争QQ密码.首先要对QQ的通信协议有一定的了解.只是通过抓包来分析的话,工作量是相当巨大的.幸好现在网上有一些开源的QQ项目.例如lumaqq.perl-oicq等.这要关我们就可以轻易了解QQ基本的通信协议了.QQ的通信协议是一套基于二进制数据的自己开发的应用层网络协议.其中使用一些公司的加密算法.QQ基本通信协议支持udp和tcp两种基本协议方式.两种方式的基本数据结构是一样的.只是tcp包多了一个描述长度的头部.那么我们就来看看QQ的登录过程是怎么样.首先QQ客户端向服务器发送一个请求登录令牌的数据包.服务器返回登录令牌.这个令牌是在服务器端生成的.和客户端的IP地址,版本信息等数据相关.以后会用到这个令牌去进行其他操作.在QQ客户端得到登录令牌之后.就会向服务器发送一个包含登录信息的登录请求.要求登录.服务顺会首先看看客户端的号码.I守址和版本是否可以在本服务器上进行登录.如果可以的话,就验证客户端的登录信息是否与服务器上保存的登录信息进行比较.匹配的就向客户端返回一个登录成功的数据包.不匹配返回登录失败.因为QQ的服务器有很多台.可能要分管不同的QQ版本.IP等.所以如果客户端的号码.IP地址和版本无法在本服务器进行登录.服务器就返蜀犬吠日一个重定向包.让客户端去另外一台服务器登录.其实整个QQ登录过程就是这么简单的两个步骤.了解了QQ登录的过程后.我们还需要知道具人本的数据包格式.以便解析出我们需要的数据内容.QQ登录过程的数据包分为头部.内容和尾部三个部分.其中头的格式固定为:0x02客户端版本命令序列号QQ号码.其中0x02是1个字节的标志;客户端版本2个字节.用于表示QQ客户端的版本;命令2个字节.表示要发送的命令类型.例如请求登录令牌登录请求等;序列号是一个2字节的随机数,在一次QQ会话中通过它来确认回应包是否对应请求包.QQ客户端默认每次加1;QQ号码就是4字节的QQ号.对于服务器来说是每个字段是无所谓的.QQ登录过程数据包的尾部固定为0x03.1.请求登录令牌包包内容就是对一次命令的具体信息,对于第一次发送的请求登录令牌包来说,包命令是0x0062,整个请求包如下所示;而服务器返回包则相对复杂一些,如下所示;其中0x18表示登录令牌的长度,现在QQ默认的登录令牌长度是0x18.这个令牌是在服务器端生成的.具体的生成算法我们当然还无从得知,应该是参考了QQ客户端的I守址.端口和其他一些信息生成这个令版的,因为你把在A机器上得到的令牌用到B机器上,你就会登录不了.如果你把A机器上的IP给改了.你照样也登录不了.2.登录包.对于我们嗅探QQ密码来说,最重要的就是这个登录包.在这里包含了和QQ密码相关的信息.登录包的具体结构如下;其中初始密钥是一个16字节的随机数,用于本身的加密.这里最重要的就是密码密钥加密的一个空字符串.所谓密码密钥就是用QQ口呤进行两次MD5加密后得到的密文,然后以这个密文作为密钥去加密一个空字符串,这次加密使用了反馈的TEA算法,加密结果放在QQ登录包里,让服务器去验证,由于QQ的加密算法使用特殊的填充机制使用QQ服务器可以验证出用户密码是否正确,这个会在后面进行详细的解释.QQ登录包里面还有一些诸如登录状态,登录令版和很多未知的内容.但是这些对于我们破解QQ密码来说都没有什么太大的作用.需要特别提到的是,前面的请求登录令牌包是不加密的,而这个登录包除了初始密钥本身以外的部分都要用初始密钥进行加密,加密算法同样是反馈的TEA.QQ服务器在收到这个登录包之后,首先要用初始密钥解密登录包后面的部分,如果解密成功,就会用保存在服务器上的密信息去解密密码密钥加密的那个空字符串密文,我现在还不确定QQ服务器上保存的是密码明文还是密码密钥.猜测是密码密钥.这样服务器就用密码密钥去解密那段16位密文,如果用户提交的密码是正确的.才可以解密成功.否则解密函数会返回空,认证就失败了.当验证QQ客户端密码准确无误后.就返回一个登录成功包.格式如下:QQ的加密算法了解了上面的QQ登录的通信协议之后还不足以破解QQ密码,我们还需要掌握QQ的加密算法.前面提到了,密码密钥是用户密码进行两次MD5加密之后得到的结果.然后再用空个结果作为密钥使用TEA算法进行加密.TEA是TinyEncryptArithmetic的缩写.顾名思义就是一种比较简单的小型加密算法.它用一个16字节的密钥去加密一个8字节的明文.得到一个8字节的密文.也可以反向从密文解密出明文.具体的算法可以到网上搜索查阅.这里就不在赘述了.但是QQ使用的TEA虽然是标准的TEA.但是QQ却使用了一种自己特殊的填充反馈机制,QQ消息被分为多个加密单元.每一个加密单元都是8字节.使用TEA进行加密.加密结果再作为下一个单元的密钥.如果明文本身的长度不是8的倍数.那么还要进行填充.使其成为8的倍数.填充的时候会用一个32位随机数存放于明文的开始位置.再在明文的最后用0填充为整个长度是8的倍数.由于会向后反馈这样即使对于相同的明文,因为使用了不同的随机数.也会产生完全不同的密文.使用这种特殊的填充反馈算法所导致的结果就是,一段密文只能用加密它的密钥进行解密.如果使用不正确的密钥.就无法得到正确的填充结果.最常见的就是解密后得到的填充数值不是0,这样就判断解密失败.服务器正式根据这种机制来确定客户端口的密码是否正确的.这也是我们破解QQ密的原理所在.穷举破解QQ密码有了以上的思路.只要写出程序就可以实现QQ密码的破解了.首先是抓包.我使用了winpcap来抓包.这样在HUB环境下可以抓到所有的QQ包.在交换环境中.我们可以使用一些ARP欺骗工具.同样可以抓到特定IP所发出的包.还有QQ的加密算法的实现.参考网上的perl-oicq和lumaqq等代码也可以轻易实现.然后用字典或者暴力破解的方法对密文进行解密即可.解密的过程用伪代码表示如下:结果=decrypt(密文,MD5(MD5(密码))),如果结果不为空的时候就是正确的密码.QQ协议研究1--基于HTTP的QQ协议研究写给设计人的10个jQuery特效QQ通讯协议2011-07-2420:18:58|分类:.NET|字号订阅要通过截取数据包来破解QQ密码,首先要对QQ的通信协议有一定了解。只是通过抓包来分析的话,工作量相当巨大的,幸好现在网上有一些开源的QQ项目,例如LumaQQ、Perl-Oicq。这样我们就可以轻易了解到QQ基本的通信协议,QQ的通信协议是一套基于二进制的数据自主开发的应用层网络协议,其中使用了一些公开的加密算法,QQ基本通信协议支持UDP和TCP两种基本协议方式。两种方式的基本数据结构是一样的,只是TCP包多了一个描述长度的头部,那么我们就来看看QQ的登录过程是怎样的。首先QQ客户端向服务器发送一个请求登录令牌的数据包,服务器返回登录令牌。这个令牌是在服务器端生成的,和客户端的IP地址,版本信息等数据相关。下文会用到这个令牌去进行其他操作。在QQ客户端得到登录令牌后,就会向服务器发送一个包含登录信息的登录请求,服务器首先会查看客户端的号码、IP地址和版本是否可以在本服务器上进行登录,如果可以就验证客户端的登录信息是否与服务器上保存的登录信息一致,如果一致就向客户端返回一个连接成功的数据包,不匹配则返回登录失败,其实整个QQ登录过程就是这么简单的两个步骤,如图1所示了解了QQ登录的过程后,我们还需要知道具体的数据包格式。以便解析出我们需要的数据内容,QQ登录过程的数据包分头部,内容和尾部三部分。其中头部的格式固定为:0x02|客户端版本|命令|序列号|QQ号码其中0x02是1个字节的标志,客户端版本2个字节,用于表示QQ客户端的版本,命令2字节,表示要发送的命令类型,例如请求登录令牌,登录请求等;序列号是一个2字节的随机数,在一次QQ回话中通过它来确认回应包是否对应请求包,QQ客户端默认每次加1;QQ号码是4字节的QQ号,对于服务器来说这个字段是无所谓的。QQ登录过程数据包的尾部固定为0x031。请求登录令牌包包内容就是一条命令的具体信息。对于第一次发送的请求登录令牌包来说,包命令是0x0062,整个请求包如下所示:1.头部2.0x003.尾部而服务器返回包则相对复杂一些,如下所示:1.头部2.回复码0x00表示成功,1字节3.登录令牌长度,默认为0x184.登录令牌5.尾部其中0x18表示登录令牌的长度,现在QQ默认的登录令牌长度是0x018。此令牌是在服务器端生成的,具体的生成算法我们当然无从得知。2.登录包对于我们嗅探QQ密码来说。最重要的就是登录包了。在这里面包含了和QQ密码相关的信息,登录包的具体结构如下:1.头部2.初始密钥,16字节。3.用户的密码密钥加密的一个空串等到的16字节4.36字节的固定内容,未知含义5.登录状态,隐身登陆还是什么。1字节6.16字节固定内容,未知含义7..登录令牌长度。1字节8.登录令牌9.登录模式。1字节目前只支持普通模式10.未知1字节,0x4011.后面段的个数,1字节1个段9字节(猜测)12.段,每次基本都是固定内容,未知含义13.长度不足则全部填0直到符合登录包长度。UDP模式登录请求包长度为416字节14.尾部其中初始密钥是一个16字节的随机数,用于本身的加密,这里最重要的就是密码密钥加密的一个空字符串,所谓密码密钥就是用QQ口令进行两次MD5加密后得到的密文,然后以这个密文作为密钥去加密一个空字符串,这次加密使用了反馈的TEA算法,加密结果放在QQ登录包里,让服务器去验证,由于QQ的加密算法使用特殊的填充机制使得QQ服务器可以验证出用户密码是否正确,下文会详细的解析,QQ登录包里还有一些诸如登陆状态,登录令牌和很多未知的内容。但是对于我们破解QQ密码来说没什么大的帮助。QQ服务器在收到登录包之后,首先用初始密钥解密登录包后面的部分,如果解密成功,就会用保存在服务器上的QQ密码信息去解开密码密钥加密的空字符串密文。只有当用户提交的密码正确后,解密才能成功,否则解密函数返回空,认证失败。当验证QQ客户端密码准确无误后,将返回一个登录成功包,格式如下:1.头部2.回复码,1字节3.会话密钥,16字节4.用户的QQ号。4字节5.用户的IP4字节6.用户的端口2字节7.服务器的IP4字节8.服务器的端口2字节9.本次登录时间4字节。10.未知的26字节11.未知的服务器1的IP,服务器的作用未知,4字节12.未知服务器1的端口,2字节13.未知服务器2的IP。4字节14.未知服务器的端口,2字节15.2个未知字节16.2个未知字节17.ClientKey,32字节18.12个未知字节19.上次登录的IP4字节20.上次登录的时间。4字节21.8个未知字节22.尾部我们可以看到其中包含了会话密钥,登录时间,IP,ClientKey等内容,这些都是会在后面的具体应用中被QQ客户端使用到。这个返回包也好似用密钥加密的。QQ加密算法了解了QQ登录的通信协议后还不足以破解QQ密码。我们还需要掌握QQ的加密算法。前面提到了,密码密钥是用户密码进行两次MD5加密之后得到的结果。然后再用它作为密钥使用TEA算法进行加密。TEA是TinyEncryptArithmetic的缩写,顾名思义就是一种比较简单的小型加密算法。它用一个16字节的密钥去加密一个8字节的明文,得到一个8字节的密文。也可以反向从密文解密出明文。具体的算法可以到网上搜索查阅,这里就不再多说了。QQ使用的TEA虽然是标准的TEA,但是却使用了一种特殊的填充反馈机制。QQ消息被分为多个加密单元。每一个加密单元都是8字节,使用TEA进行加密,加密结果再作为下一个单元的密钥。如果明文本身的长度不是8的倍数,那么还要进行填充,使其成为8的倍数,填充的时候会用一个32位随机数存放于明文的开始位置,然后在明文的最后用0填充。保证整个长度是8的倍数。因为会向后反馈,这样几时对于相同的明文,因为使用
本文标题:QQ通信协议介绍
链接地址:https://www.777doc.com/doc-4583683 .html