请求登录令牌包
包内容就是对一次命令的具体信息,对于第一次发送的请求登录令牌包来说,包命令是0x0062,整个请求包如下所示;
(1) 头部
(2) 0x00
(3) 尾部
(1) 头部
(2) 回复码,0x00表示成功,1字节
(3) 登录令牌长度,默认为0x18
(4) 登录令牌
(5) 尾部
而服务器返回包则相对复杂一些,如下所示;
其中0x18表示登录令牌的长度,现在QQ默认的登录令牌长度是0x18.这个令牌是在服务器端生成的.具体的生成算法我们当然还无从得知,应该是参考了QQ客户端的I守址.端口和其他一些信息生成这个令版的,因为你把在A机器上得到的令牌用到B机器上,你就会登录不了.如果你把A机器上的IP给改了.你照样也登录不了.
2. 登录包.
(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)尾部
对于我们嗅探QQ密码来说,最重要的就是这个登录包.在这里包含了和QQ密码相关的信息.登录包的具体结构如下;
其中初始密钥是一个16字节的随机数,用于本身的加密.这里最重要的就是密码密钥加密的一个空字符串.
所谓密码密钥就是用QQ口呤进行两次MD5加密后得到的密文,然后以这个密文作为密钥去加密一个空字符串,这次加密使用了反馈的TEA算法,加密结果放在QQ登录包里,让服务器去验证,由于QQ的加密算法使用特殊的填充机制使用QQ服务器可以验证出用户密码是否正确,这个会在后面进行详细的解释.QQ登录包里面还有一些诸如登录状态,登录令版和很多未知的内容.但是这些对于我们破解QQ密码来说都没有什么太大的作用.
需要特别提到的是,前面的请求登录令牌包是不加密的,而这个登录包除了初始密钥本身以外的部分都要用初始密钥进行加密,加密算法同样是反馈的TEA.
QQ服务器在收到这个登录包之后,首先要用初始密钥解密登录包后面的部分,如果解密成功,就会用保存在服务器上的密信息去解密密码密钥加密的那个空字符串密文,我现在还不确定QQ服务器上保存的是密码明文还是密码密钥.猜测是密码密钥.这样服务器就用密码密钥去解密那段16位密文,如果用户提交的密码是正确的.才可以解密成功.否则解密函数会返回空,认证就失败了.当验证QQ客户端密码准确无误后.就返回一个登录成功包.格式如下: