今天,来和大家分享一下:安卓QQ登录原理(基于7.9.0协议)
首先我们要明确,手机QQ与腾讯服务器进行通讯,采用TCP/UDP协议
在客户端(手机QQ)与服务端(腾讯服务器)之间建立通讯通道后,开始加密后的数据传输
当你打开客户端时(完全退出QQ后,打开),就已经生成了用于加密数据的share_key、pri_key、pub_key、tgt_key
输入完QQ号与密码后,按下“登录”按钮时,客户端会获取QQ号、QQ密码、手机安卓版本、手机品牌、手机型号、手机串号、手机guid、网络环境(移动、联通、电信、4G、5G、还是WiFi)、当前IP地址、当前网络时间等信息,并将其打包后用share_key、pri_key、pub_key、tgt_key、QQ号与密码的MD5、16个0Tea加密
之后客户端访问服务端
此时服务端会返回ip地址
客户端再带着刚才打包的数据去访问ip地址
此时ip所在的客户端会将数据包解密并且一一核对
核对项目包括:QQ号与密码是否匹配、是否在常用地登录(利用登录时打包带走的IP地址判断)、手机品牌、手机型号、手机串号是否正确(如果错误会提示需要接收手机验证码,验证成功后才可继续登录)
登录成功后,将建立通讯通道,以保证客户端与服务端正常通讯
服务端一样会返回到客户端数据包
客户端将其一一解密后可得到:
QQ号
QQ昵称
clientKey(敏感cookie)
skey(每次登录成功返回的都不同,此cookie及其重要,如果别人有了你的skey,可对你的QQ进行许多敏感操作,包括操作QQ钱包转账)
sessionKey(用于解密收到来自服务端的消息,好友消息,群消息都需要sessionKey解密后才可看见内容)
登录令牌(二次上线需使用登录令牌,何为二次上线?当你将QQ彻底退出后台后,再次打开QQ是不是不需要输入密码直接就登录了,此时就需要用到登录令牌)
以及QQ好友列表,QQ群列表和一些离线消息
自此QQ登录完成,但要是想一直在线,还需每隔一段时间与服务端通讯
我们称之为“心跳”
如果没有心跳,服务端会长时间没有接受到来自客户端的数据,服务端会默认此客户端已下线
此时任何到达此客户端的消息都不会被服务端下发(因为你已离线)
所以,客户端也不会再接收到任何消息
:bilibili4: