本篇文章主要讲述PC QQ协议的入门和腾讯的迷惑操作 Warning:如果没有一定协议基础看此类文章会觉得很魔幻
注意:PC协议
QQ协议是分为UDP和TCP的,一般情况下我们以UDP为标准,因为官方也是大部分使用的UDP。
为什么会大部分使用UDP?UDP传输不是不可靠吗,那么我的消息不是会出现丢包,然后看似发出然后实际丢掉的情况?又或者因为非阻塞导致消息顺序异常?
噗,实际上腾讯也是不会这么傻的,于是在协议中整了点魔法,非常有意思的是原理类似的还有未来技术Http3(Quic) 颇有此番风味
那么刚刚说到的魔法是什么呢? 传统所谓的可靠性传输是基于网络传输协议层面 当然我们可以在应用协议层整点加个包序加个验证的hash或者返回一个包确认 噗 如果你没彻底了解tcp和udp 你可能会问 这种有什么用呢 感觉更麻烦了 实际上UDP不需要服务端握手 直接一次性完成 而且还是暴力型 不排队那种 完全不清楚谁先发出 然后我们的TCP就比较文明了 需要敲敲门 握几次手 还要排队进去 这样发出顺序很清楚 然后我们按照腾讯的方案是怎么样的 就是给UDP的包加个序号 然后让他们发出 这样包序就不会有问题了 关于不可靠性 仅需一个返回包或者一个hash校验就行。
选择UDP 然后我们来理理腾讯的过程 xxxx包是指腾讯给每个命令一个特殊的标记 长度2字节 未指定服务器 解析腾讯域名 获取IP 0825包 发现 Say Hello 0826包 验证账号
点击登录的一瞬间会给服务器发一个0825包链接服务器
发这个包就问候服务器 Say Hello
问他能不能让我进去
如果不能,就告诉QQ 我不行了 人太多了 你去下家服务器 我告诉你那服务器 IP
okok 经过几次服务器的交接 我们找到一位能行的的服务器 接下来就发送账号和密码了(发送0826包)
以下包为转载的 由于太忙 分析QQ请用工具抓包后hex(16进制)下分析 QQ和IP转16进制算法可自行百度 腾讯包以tea魔改算法加解密 版本号早已不同 包内有些固定的东西
02 //包头 腾讯所有发送的数据包都是以这个开头
2F 35 //版本号 QQ版本不同。这个东西也会变
08 25 // 命令 首次跟服务器接触发送滴。。
4B B1 //序号 这个东东是随机的 。。。 随机生成这个就可以了。
39 80 8C 2C // QQ号的HEX 转换过来就是 964725804
03 00 00 00 01 01 01 00 00 65 A6 00 00 00 00 //这个是固定的。。具体啥么东西,不清楚
3E 59 4A DF 55 04 B1 AD 22 33 9F B3 E1 C3 CC D7 //这个是随机的tea key 软件里随机生成就可以 -------------------------------------------------------------------------------以下就是经过 tea key加密后的数据了
39 16 78 35 92 0F 3D 37 95 4C 7C C8 8E 26 5C E6 D4 D9 47 C0 EE 30 08 94 BE 08 AC 8C 14 C8 CD 1A 90 CF 7F 01 AE 8D 55 75 51 56 D9 A7 92 6B A0 C6 79 00 BF 99 47 06 8F 5C D9 2C 6B 97 C9 D4 AE 79 C1 31 1B AC A6 0E 5F 9C
----------------------------------------------------------------------------- 以下是经过tea key解密后的数据
00 18 00 16 00 01 //token1 固定的6的长度 这些后续的发包里需要用到。所以要记下来,好方便后面组合
00 00 04 11 00 00 00 01 00 00 12 91 //token2 固定的 12的长度
39 80 8C 2C //这个是QQ号
00 00 00 00 01 14 00 19 01 01 //固定的数据
00 15 //这个呢。下面数据大小 16进制的15 换成10进制就是21 下面刚刚好是21的长度
03 2A 37 9C 8E 0B 74 A2 F1 E5 47 56 0B 02 CE 2C D0 0A 83 9E D2 //这21的长度是随机的。随便生成
03 //包尾 腾讯所有发送的数据包都是以这个结尾
02 2F 35 08 25 4B B1 39 80 8C 2C //前面的和上面的意思一样。这个是QQ的返回包
00 00 00 //用固定的 00 00 00隔开了
--------------------------------------------------------------------------------以下是加密数据,用发送的那个tea key解密
30 10 39 3F 8B 13 9F 79 36 24 8A 07 78 25 94 C7 2C 50 D1 2A 3D B1 54 5E 19 8C 93 EA 10 4E 5E 99 80 96 C0 D0 39 39 6C 14 D2 53 D9 35 C4 95 4A 3B 60 94 80 9C F8 B5 D9 8B DC 65 D6 3F C1 6C DA 10 4A A3 9A CC BA FB 98 44 6B B2 91 53 7F A8 94 A0 11 38 BB EA 8B 89 22 1B 51 94 87 1B 77 22 00 EE EB 43 EE E1 7B 9F 4F E0 F8 10 20 66 DC 97 E6 A5 EA D4 F4 DD 02 A5 3C CA -------------------------------------解密出来的数据
FE // 服务器IP需要中转..。。。其实根据接收的数据包大小就可以知道。需要中转的话 接收的数据包是135的长度,不需要的话是111的长度
01 12 // 固定 00 38 //0038的token 38的10进制是56,下面56的长度后就可以是下一个命令了,这些数据在 0826包都需要
D8 62 09 42 21 5C FE 51 C6 E6 07 C6 0A 3A 2A 7F 7B 50 E0 86 A3 0F 7E 10 FB A4 04 E6 DA 6E 9B BF 19 CA 64 52 2E 27 FB B0 9C 68 A0 4F BA 6A EC 9B 24 F4 F3 14 BF A1 D8 5F
00 17 00 0E 00 01 //固定了
50 F2 C9 3F //这个是连接的时间 2013-01-13 22:48:31
7B B6 90 44 //偶的本机IP 123.182.144.68
BD 0B 00 00 00 0C 00 16 00 02 00 00 00 00 00 09 00 00 00 00
70 5A 54 65 //中转的服务器IP 112.90.84.101 这里把解密出来的IP地址直接放到socket的IP设置那里就可以了,
00 00 00 00 00 00 !--------------------------------------------------------- 03 //包尾
那就下篇文章啦