您的位置:首页 > 其它

抓包破解QQ密码

2016-06-07 18:28 381 查看
要通过截取数据包来破解QQ密码,首先要对QQ的通信协议有一定了解。只是通过抓包来分析的话,工作量相当巨大的,幸好现在网上有一些辅助的抓包工具,这样我们就可以轻易了解到QQ基本的通信协议,
   QQ 的通信协议是一套基于二进制的数据自主开发的应用层网络协议,其中使用了一些公开的加密算法,QQ基本通信协议支持UDP和TCP两种基本协议方式。两种 方式的基本数据结构是一样的,只是TCP包多了一个描述长度的头部,那么我们就来看看QQ的登录过程是怎样的。
    首先QQ 客户端向服务器发送一个请求登录令牌的数据包,服务器返回登录令牌。这个令牌是在服务器端生成的,和客户端的IP地址,版本信息等数据相关。下文会用到这个令牌去进行其他操作。
   在QQ客户端得到登录令牌后,就会向服务器发送一个包含登录信息的登录请求,服务器首先会查看客户端的号码、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默认的登录令牌长度是0x018。此令牌是在服务器端生成的,具体的生成算法我们当然无从得知。
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密码来说没什么大的帮助。
      QQ服务器在收到登录包之后,首先用初始密钥解密登录包后面的部分,如果解密成功,就会用保存在服务器上的QQ密码信息去解开密码密钥加密的空字符串密 文。只有当用户提交的密码正确后,解密才能成功,否则解密函数返回空,认证失败。当验证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字节
15.2 个未知字节
16. 2个未知字节
17. Client Key ,32字节
18. 12个未知字节
19 . 上次登录的IP 4 字节
20 .  上次登录的时间 。4字节
21. 8个未知字节
22. 尾部
我们可以看到其中包含了会话密钥,登录时间,IP ,Client  Key等内容,这些都是会在后面的具体应用中被QQ客户端使用到。这个返回包也好似用密钥加密的。
QQ加密算法
了解了QQ登录的通信协议后还不足以破解QQ密码。我们还需要掌握QQ的加密算法。前面提到了,密码密钥是用户密码进行两次MD5加密之后得到的结果,然后再用它作为密钥使用TEA算法进行加密。TEA是Tiny
Encrypt Arithmetic的缩写 ,顾名思义就是一种比较简单的小型加密算法。它用一个16字节的密钥去加密一个8字节的明文,得到一个8字节的密文。也可以反向从密文解密出明文。具体的算法可以到网上搜索查阅,这里就不再多说了。
    QQ使用的TEA虽然是标准的TEA,但是却使用了一种特殊的填充反馈机制。QQ消息被分为多个加密单元。每一个加密单元都是8字节,使用TEA进行加 密,加密结果再作为下一个单元的密钥。如果明文本身的长度不是8的倍数,那么还要进行填充,使其成为8的倍数,填充的时候会用一个32位随机数存放于明文的开始位置,然后在明文的最后用0填充。保证整个长度是8的倍数。因为会向后反馈,这样几时对于相同的明文,因为使用不同的随机数,也会产生完全不同的密
文。
   使用这种特殊的填充反馈算法所导致的结果就是,一段密文只能用加密的密钥进行解密,如果使用不正确的密钥。就无法得到正确的填充结果。最常见的就是解密后 得到的填充数值不是0。这样就判断解密失败,服务器正式根据这种机制来确定客户端的密码是否正确的。这也是我们破解QQ密码的原理所在。
   穷举破解QQ密码
看到这里聪明的读者一定明白该如何通过抓包来破解QQ密码,让我们来回顾一下:
   当处于同一个局域网中的QQ客户端登录的时候,它会向服务器发送一个请求登录令牌包 ,服务器也会返回登录令牌包。但这对我们作用不大,然后他会发送登录包,里面包含了用密码密钥加密的16位密文。服务器接到登陆包后验证用户密码正确与
否,然后返回登录成功或者失败的应答包。
     我们只要抓到QQ客户端向服务端发送的登录包。先用初始密钥把他解开。就可以得到其密码密钥加密的16位密文,这样是使用同样的解密算法就能发现哪个密码 能够解开此密文。由于抓包后是本地进行破解的。只要我们的cpu够快,内存够多。破解时间够长,就一定能破出他的密码。这比通常的网络进行破解的方法要快很多。
     有了思路,只要写出程序就可以实现QQ密码的破解了。首先是抓包,使用WinPcap 来抓包,这样在HUB环境下可以抓到所有的QQ包。在交换环境中,我们可以使用一些ARP欺骗工具,同样能抓到特定IP所发出的包。QQ的加密算法实现,参考网上的Perl-oicq和LumaQQ等代码也可以轻易实现,然后用字典或者暴力破解的方法对密文进行解密即可,解密的过程用伪代码表示如下:
结果= decrypt (密文, MD5 (MD5 (密码)))
注意 :结果不为空的时候就是正确的密码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: