Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1747825
  • 博文数量: 290
  • 博客积分: 10653
  • 博客等级: 上将
  • 技术积分: 3178
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-24 23:08
文章存档

2013年(6)

2012年(15)

2011年(25)

2010年(86)

2009年(52)

2008年(66)

2007年(40)

分类: 网络与安全

2010-06-10 15:22:54

一. 传统破解QQ密码的方法
 
    总是有人以各种各样的理由找我破解别人的Q密码,其实我也没有什么肯定可以破解的办法.总结现在破解QQ密码的手段,第一种是本地盗用,一般是利用木马或 者伪装程序之类的东西从QQ使用者的机器上获取用民用工业输入的密码.这种方法的缺点是首先要获取对方主机的权限,以漏洞或者欺骗的方式进行破解.第二种 是远程破解,掌握了QQ的通信方式就可以用程序模拟QQ到服务器上进行登录验证.然后用字典或者暴力方式来进行破解.由于网络速度等限制原因.这种方法的 效率真一般比较低.对于较为复杂的密码很难破解出来.还有一种方法是通过其他间接的方式,例如破解对方邮箱等,或者腾讯的服务器有某些漏洞可以导致密码泄 漏,这我就不得而知了.
其实除了以上这几种常见的攻击手段,还有一种以前使用得比较少的方法,那就是通过sniffer来捕获QQ通信信息. 由于QQ所使用的通信协议的特殊性,可以利用捕获到的信息来穷举出登录密码.由于这种破解是在本地进行的.所以速度要比远程破解快一些.这种方法比较适合 在网吧等地方盗取别人的QQ.
二. QQ通信协议介绍
     要通过抓取数据包来破争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,整个请求包如下所示;

(1)     头部

(2)     0x00

(3)  尾部


而服务器返回包则相对复杂一些,如下所示;

    

(1)     头部

(2)     回复码,0x00表示成功,1字节

(3)     登录令牌长度,默认为0x18

(4)     登录令牌

(5)    尾部






其 中0x18表示登录令牌的长度,现在QQ默认的登录令牌长度是0x18.这个令牌是在服务器端生成的.具体的生成算法我们当然还无从得知,应该是参考了 QQ客户端的I守址.端口和其他一些信息生成这个令版的,因为你把在A机器上得到的令牌用到B机器上,你就会登录不了.如果你把A机器上的IP给改了.你 照样也登录不了.
2. 登录包.
对于我们嗅探QQ密码来说,最重要的就是这个登录包.在这里包含了和QQ密码相关的信息.登录包的具体结构如下;

  

(1)     头部

(2)     初始密钥.16字节

(3)     用户的密码密钥加密一个空串得到的16字节

(4)     36字节的固定内容,未知含义

(5)     登录状态,隐身登录还是什么,1字节

(6)     16字节固定内容,未知含义

(7)     登录令牌长度,1字节

(8)     登录令牌

(9)     登录模式,1字节,目前只支持普通模式

(10)  未知1字节0x40

(11)  后面段的个数,1字节,1个段9字节

(12)  段,每次基本都是固定内容.未知含义

(13)长度不足则全部填0直到符合登录包长度,UDP模式登录请求包长度为416字节

(14)尾部


    其中初始密钥是一个16字节的随机数,用于本身的加密.这里最重要的就是密码密钥加密的一个空字符串.
    所 谓密码密钥就是用QQ口呤进行两次MD5加密后得到的密文,然后以这个密文作为密钥去加密一个空字符串,这次加密使用了反馈的TEA算法,加密结果放在 QQ登录包里,让服务器去验证,由于QQ的加密算法使用特殊的填充机制使用QQ服务器可以验证出用户密码是否正确,这个会在后面进行详细的解释.QQ登录 包里面还有一些诸如登录状态,登录令版和很多未知的内容.但是这些对于我们破解QQ密码来说都没有什么太大的作用.
需要特别提到的是,前面的请求登录令牌包是不加密的,而这个登录包除了初始密钥本身以外的部分都要用初始密钥进行加密,加密算法同样是反馈的TEA.
   QQ服务器在收到这个登录包之后,首先要用初始密钥解密登录包后面的部分,如果解密成功,就会用保存在服务器上的密信息去解密密码密钥加密的那个空字符串 密文,我现在还不确定QQ服务器上保存的是密码明文还是密码密钥.猜测是密码密钥.这样服务器就用密码密钥去解密那段16位密文,如果用户提交的密码是正 确的.才可以解密成功.否则解密函数会返回空,认证就失败了.当验证QQ客户端密码准确无误后.就返回一个登录成功包.格式如下:

  

(1)     头部

(2)     回复码.1字节

(3)     会话密钥.16字节

(4)     用户的QQ号.4字节

(5)     用户的IP.4字节

(6)     用户的端口,2字节

(7)     服务器的IP.4字节

(8)     服务器的端口,2字节

(9)     本次登录时间,4字节

(10)  未知的26字节

(11)  未知的服务器1的IP.服务器的作用未知,4字节

(12)  未知服务器1的端口.2字节

(13)  未知服务器2的IP,4字节

(14)  未知服务器2的端口,2字节

(15)  2个未知字节

(16)  2个未知字节

(17)  client key.32字节

(18)  12个未知字节

(19)  上次登录时的IP,4字节

(20)  上次登录时的时间,4字节

(21)  8个未知字节

(22)  尾部

三. QQ的加密算法
    了 解了上面的QQ登录的通信协议之后还不足以破解QQ密码,我们还需要掌握QQ的加密算法.前面提到了,密码密钥是用户密码进行两次MD5加密之后得到的结 果.然后再用空个结果作为密钥使用TEA算法进行加密.TEA是Tiny Encrypt Arithmetic的缩写.顾名思义就是一种比较简单的小型加密算法.它用一个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(密 码))),如果结果不为空的时候就是正确的密码.
五. 实际破解过程
        我写了一个程序来未例整个破解的过程.由于仅仅是用于示意.程序写得较为粗糙.加密算法都没有进行优化,这样在破解速度上并不是很快.如果用汇编去实现的话速度还能提高很多.具体的用法是这样的.
        要使用这个程序必需首先安装winpcap3.0,这样你才能抓包.安装完winpcap后,直接运行qqscrak.exe.会出现如图2所示的界面.

screen.width*0.7) {this.resized=true; this.width=screen.width*0.7}">
2
里面列出的是你机器上的网卡,选中要抓包的网卡,然后点OK.进行抓包界面.

如图3

screen.width*0.7) {this.resized=true; this.width=screen.width*0.7}">
图3
这样就开始sciff网络上所有的QQ包了.当有QQ进行登录的时候,程序会抓到QQ登录包.下面的密破解按钮就变为黑色.点击这个按钮,进行密码破解界面,如图4
screen.width*0.7) {this.resized=true; this.width=screen.width*0.7}">
图4
可 以看到QQ号码和对应的密码密钥加密的16字节密文,我们选择字典破解.打开相应的字典文件.点击开始破解,如果你的字典里面包含了对方密码的话就会弹出 成功破角对方密码的对话框.如果试了很多字典都不行.也可以选择暴力破解.实际上就是穷举所有8位的字每和数字组合的密码.但是这种方法比较浪费时间.可 能跑几年也跑池同来对方密码哦……
相关软件已经打包.请到:下载
阅读(5771) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~