Skip to content

Instantly share code, notes, and snippets.

@Akagi201
Created April 16, 2014 09:17
Show Gist options
  • Star 79 You must be signed in to star a gist
  • Fork 29 You must be signed in to fork a gist
  • Save Akagi201/10839084 to your computer and use it in GitHub Desktop.
Save Akagi201/10839084 to your computer and use it in GitHub Desktop.
title description date categories slug
QQ协议分析
QQ协议分析
2014-04-16
protocol
qq-protocol

一. 文字聊天协议族(TCPF, Text Chatting Protocol Family)

它主要支持与其它QQ客户端进行文字聊天. TCPF是建立在UDP协议之上. UDP数据包中的第一个字符02为这个协议族的标识. TCPF的服务器使用8000号端口, 腾讯的QQ客户端软件一般从4000号端口开始尝试使用, 但实际上, 对客户端使用的端口号并没有限制. 目前的研究集中在TCPF上.

在PC(Windows)上使用wireshark对qq客户端进行抓包, 使用oicq进行过滤, 即为TCPF协议.

TCPF包结构

对于TCPF包我们又把它分为5类:

  1. 登录请求包(LIP, LogIn Packet), 它是由客户端向服务器发出登录请求的数据包.
  2. 登录应答包(LRP, LogIn Reply Packet), 它是由服务器响应客户端登录请求的数据包.
  3. 注销请求包(LOP, LogOut Packet), 它是由客户端向服务器发出注销登录请求的数据包, 服务器对这个包不作应答.
  4. 客户端其它包(CSP, Client Sent Packet), 它是由客户端向服务器发送的其它包.
  5. 服务器其它包(SSP, Server Sent Packet), 它是由服务器向客户端发送的其它包.

TCPF包头

所有TCPF包的前7个字节是包头, 包头可以识别TCPF包的内容. 包头的格式为:

  1. 第0字节: TCPF包标识: 0x02, wireshark中解析为: FLag: oicq packet(0x02)
  2. 第1-2字节: 发送者标识. 如果是0x01 0x00, 表明是由服务器发送. 客户端的标识与所使用的使用的QQ版本有关. 我的QQ版本: QQ5.3(10702), 使用wireshark抓包得到: Version: 0x350b, 0x3511
  3. 第3-4字节: 命令编号. 具体的命令编号含义在<QQ协议概述>(Protocol Overview.rtf)中有描述. 以QQ2013为例, 如果这个字段是0x00 0x59, 那么这是一个注销请求包. 如果这个字段是0x08 0x25, 而第12位为 0x00, 那么这是一个登录应答包. 如果这个字段是0x08 0x25, 而第12位为 0x03, 那么这是一个登录请求包. 其它的命令代码表明是其它包, 我们通过发送者标识来区分它是CSP还是SSP.(与我抓包数据不符, 暂时保留不修改)
  4. 第5-6字节: 命令序列号. 客户端和服务器都有各自的当前发送序列号. 每初始发出一个指令的时候, 使用当前的序列号, 然后把当前序列号加一, 如果超过0xFFFF, 就绕回. 如果是响应对方发出的命令, 则使用这个命令的序列号. 例如, 客户端当前的序列号为0x1110, 它向服务发送一个0x0016命令, 它使用0x1110这个序列号, 服务器收到以后, 返回一个序列号为0x1110的0x0016命令响应. 下一次, 客户端又发送一个0x0026命令, 这一次它使用了加一的序列号0x1111, 服务器也响应0x1111序列号的一个0x0026命令响应. 如果这时服务器要向客户端发送0x0017命令, 它使用它自己的当前序列号, 比如说0x2220, 客户端收到以后, 也响应一个序列号为0x2220的0x0017命令应答. 我们可以通过序列号来判断发出的指令是否已经得到了应答, 如果没有, 可以重发. 服务器对收到的命令的序列号顺序没有要求. 服务器也不会一定按照发出的顺序给予应答.

TCPF包尾

所有的TCPF包都以0x03作为包尾.

qq请求协议头部

qq协议

qq使用UDP端口8000作为主要通信端口, 端口HTTP(80)和HTTPS(443)也是可接受的. 客户端会尝试连接8000端口, 如果失败他会自动尝试80和443端口.

源码分析

  • wireshark/epan/dissectors/packet-oicq.c 对qq协议的判定不过准确, 只能识别出是udp,和8000端口的
  • ndpi/src/lib/protocols/qq.c 解析的跟强

Refs

Copy link

ghost commented Jun 17, 2016

感谢,正好用到!

@zsq2010
Copy link

zsq2010 commented Aug 20, 2016

我认为腾讯也不要变协议了.. 大家变来变去很累.. 总有人能弄出来.. gist主赞!

@leetking
Copy link

leetking commented May 2, 2017

也就是说目前这个协议分析还是有效的了?找了好多分析QQ的协议都过于老而不能用

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment