手机QQ传送过程

以前的手机 QQ 大多采用明文形式传输 ,但是 2010 则是采用与 QQ 客户端相近的方式传输的 .
我测试了一下,以下的 10 个服务器是可以连接的 ,其他的我没有测试,请自行寻找 .
"219.133.51.65","121.14.94.26","211.136.236.81","211.136.236.82","211.136.236.83","211.136.236.84","211.136.236.85","211.136.236.86","211.136.236.87","211.136.236.88"

手机 QQ2010 连接的端口为 14000 ,比如在 C# 中测试服务器连接 :
IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse("219.133.51.65”), 14000);
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(remoteEP);
NetworkStream ns = new NetworkStream(socket);

本例中的号码 :  4012938----ai0283oy

一. 请求密钥
手机 QQ 采用 16 轮的 TEA 加解密算法 ,正如 QQ 客户端一样 . 在登录之前 ,需要向服务器请求一个名为 session_key 的东西 ,该东西可以用来加解密之后所有的数据包 . 首先 ,发送一个 58 字节的数据包给服务器 ,该数据包如下 :
02 
00 3a 
06 08 
00 49 
39 46 
[00 3d 3b 8a  ]
00 
37 42 37 37 43 45 37 46 44 44 37 46 39 39 34 32 02 01 00 10 33 5a 38 46 4d 5a 55 4f 55 36 32 4d 32 47 39 30 02 00 04 00 00 00 c8 03
其中第一行是 TCPF 协议族的开始标志 ,06 08 表示手机 QQ2010 ,00 3a,00 49 表示获取密钥 ,之后的 00 49 是消息编号 ,可以采用固定的 . 接下来是 4 字节的 QQ 号码 ,将数字形式的 QQ 号码转换为 16 进制 ,如果不足 8 位的话用 0 在前面填充 . 接下来的全部是固定形式了 .
发送成功数据包之后,服务器返回 32 字节的数据包 ,其中就包括 16 字节的密钥 ,举例如下 :
02 
00 20 
06 08
00 49 
0c c7 
00 3d 3b 8a  
00 [39 31 31 35 46 38 37 34 35 34 43 36 42 30 34 38 ]00 03
以上中括号部分就是 16 字节的密钥 ,之前还包括对应的 QQ 号码
二. 登录
获取密钥之后,就可以加密密码然后发送给服务器了,密码先用 MD5 加密一下 ,然后用上面的密钥在 TEA 加密一下 ,举例如下 :
加密之前的经过 md5 处理的密码 :  2F 6D 90 61 1F 98 1C D8 A4 61 3F 2D 35 D1 9E D5
处理一下密码数据包 :
00 09 00 01 00 00 00 00 37 42 37 37 43 45 37 46 44 44 37 46 39 39 34 32 10 (2F 6D 90 61 1F 98 1C D8 A4 61 3F 2D 35 D1 9E D5) 00
除了密码部分,其余的都是固定的
然后用 TEA 加密一下 , 02 00 47 06 08 00 50 39 47 00 3d 3b 8a 00 [bc 88 04 7c 67 9a e3 9d 0c ec ff 51 95 f6 75 69 20 a0 30 87 8b bb 3e 86 5e 2b 22 b0 ea 3d 53 e8 bd 87 a8 a1 fa 17 20 21 0f 24 9f 5f c9 d6 bc 7d be b2 7e 65 48 2b 60 fd] 03
其中方括号中是加密后的密码数据,其他的部分和上面获取密钥的相似 .

发送密码数据包后,服务器会返回如下几种结果 :
1. 密码正确,登录成功,为 87 字节的数据包
02:00:57:06:08:00:50:39:47:00:3d:3b:8a:00:52:c8:37:7f:7d:1a:25:72:8d:ff:24:55:94:95:bc:e5:88:c0:92:0b:40:e7:79:ce:33:db:81:48:6f:e1:70:8a:cf:77:a0:8d:50:4e:76:2e:74:bd:84:43:9c:56:79:ec:6c:8f:63:40:f3:32:0f:d0:16:45:40:b9:c1:e5:20:8e:4f:c7:53:71:f7:28:85:69:03
2. 密码错误,登录失败,为 55 字节的数据包
数据包就不列出来了,其中第 14 个字节是 01 ,如果成功的话是 00 ,其他的部分和获取密钥部分的相似 .
3. 需要验证码,为大于 600 字节的数据包
数据包太大,数据包大概描述如下 : 开始的 14 个字节和获取密钥部分的相似 ,第 15 字节到倒数第二个字节的数据是加密后的验证码部分 ( 数据包都是以 03 结尾的 ) ,用之前获取的密钥解密该数据包,解密后的数据包中就包含了验证码图片,通常验证码图片部分从第四个或者第五个字节开始一直到最后一个字节,这取决于第几次发送验证码请求,如果第一次获取验证码,则是从第五个字节开始,如果验证码输入错误一次之后就是从第四个字节开始,但这不是绝对的,验证码图片是一 89 50 开头的 ,所以可以把这个作为验证码图片开始的依据,把这部分数据流写入图片就可以了 .
4. 限制登录,手机 QQ 很多号码是限制登录的 .
三. 发送验证码
如果需要验证码的话,可以用如下方式向服务器发送验证码 :
02 00 27 06 08 00 77 28 cd 00 3d 3b 8a 00 [6a 4a 15 d3 30 1e 5f fc a0 08 81 53 96, 82 dc 38 fb f0 34 84 71 70 9b cd] 03
其中加方括号部分是加密后的验证码字符,加密前的信息为
02 00 08 00 34 00 37 00 38 00 35  (4785)
腾讯把验证码的四个数字添加到 3 的后面 ,足以见得腾讯是多么的可耻,加密仍然是使用之前获取的密钥 .
四. 获取好友
获取好友,你可以发送加密后的八个 0 来获取 .
02 00 27 06 08 00 54 00 03 00 3d 3b 8a 00 [96 29 ad dc c6 ad 6c 71 c6 ad ab 70 56 68 69 2e a0 c7 b8 ce c9 1c 99 13] 03
上面方括号中的是加密后的 8 个 0 ,当然,密钥不同,加密后的内容也会不同 .
发送给服务器后,服务器会返回数据包,其中就包括好友信息
02 
00 2f 
06 08 
00 54 00 13 
00 3d 3b 8a 
00 
b8 4c 8b 38 f0 0e ce e7 9c ad c0 71 72 75 60 91 ed 0d 02 6c 8f 84 2e 70 84 93 56 74 14 93 ad f0 03
解密其中的好友部分得到[00 00 00 00 00 00 00 00 
00 
00 1d b2 b7 01 00 
00 22 0e b4 01 00 ]
当然,解密的数据包也是以 8 个 0 开头的 ,接下来的一个 0 表示获取成功 ,再接下来,每 6 个字节代表一个好友的 QQ 号码 ,前 4 个是 QQ 号码 ,接下来 01 我忘了是什么了 ,等想起来再说吧,最后的 00 表示默认分组 ,我们知道默认分组就是那个我的好友,如果是其他组的,数字就会不一样,比如 04 ,08,40,41 等 .
五. 更改签名
手机 QQ2010 中改资料只有改签名不是通过 http 方式改的 ,当然也可以通过 http 方式改签名 .
其中一次改签名的数据包是 :  02 00 2f 06 08 00 6a 0c d7 00 3d 3b 8a 00 [75 ba d5 9c 55 f5 e8 15 d5 83 f9 ce 9c af 83 4c 2c 0b 21 08 88 fb 04 d5 cc ac 4b 6c 3e e6 c5 d3] 03
解密之后为 :  [01 00 00 0C 6D 4B 8B D5 4E 2A 60 27 7B 7E 54 0D ]
其中 01 00 是固定的 ,00 0C 是编号 ,随后的一些就是签名了,他是采用BigEndian编码形式的,不同于 QQ 号码的编码方式 . 比如 ”我爱你”的 LittleEndian 的 Unicode 编码是 11 62 31 72 60 4F,而BigEndian的 Unicode 编码则是 62 11 72 31 4F 60
六. 发送消息
发送消息的数据包举例 :  02 00 37 06 08 00 55 3b 88 00 3d 3b 8a 00 [e4 be 4d 9f 2d 6a 9e ab 80 9f e9 2d a8 6a 5a 02 0b cc d4 62 0e 4d d0 f8 00 4f ea ce 86 84 05 3f 8a 8e 92 74 66 f1 3e fa 43 b7 42 59 82 fe 0c ce] 03
解密之后是 :  [00 16 0A 48 00 20 (62 11 56 76 5C 31 61 1F 89 C9 55 4A) 00 20 00 00 09 00 00 00 00 86 02 8B 5B 53 4F 0D ]
其中开始的 4 个字节为好友 QQ 号码 ,解码之后为 1444424 ,接下来的 00 20 是消息编号 ,再接下来是消息的BigEndian的 Unicode 编码 ,接下来的00 20 00 00 09 00 00 00 00 86 02 8B 5B 53 4F 0D为固定 .

转载于:https://my.oschina.net/ypimgt/blog/86868

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值