wireshark和QQ的前世今生

参考:

①:Wireshark系列(从入门到精通的10个干货)

②:利用WireShark破解网站密码

:一个很详细的博客主写的教程

④:qq算法博主

⑤:看雪论坛

wireshark抓取qq数据包

抓包接口设置成本地连接

点击start,登录qq,输入oicq进行过滤qq包

找到第一个OICQ,点击后,点击oicq-IM software

可以看到自己登录的QQ号码为765343409

本机IP=172.16.69.151,第一个是从本机发送到目的IP的,第二个是从服务器返回来的

分析数据报协议

这是UDP协议部分的信息,destination port = irdmi(8000),这在国内主要是QQ使用的端口号,irdmi表示为qq聊天软件

分析以太网(数据链路层)

FujianSt_ae:1b:ac (00:d0:f8:ae:1b:ac) 表明路由器厂商是福建的一个厂商

QQ传输数据是加密的

在oicq上右键选择follow UDP stream

数据传输顺序

可以看到IP长度是67(0x0043),与下面的物理层传输的最终形式(16进制)一样。00在前,43在后,说明进行网路传输的时候是先传输高位再传输低位,即高字节数据在低地址,低字节数据在高地址。


要通过截取数据包来破解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 (密码)))


注意 :结果不为空的时候就是正确的密码。
  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值