PC端QQ协议说明,完美搞定QQ智能助手
一、 实验目的:
在虚拟机下NAT模式下通过Wireshark抓包,分析QQ的传输模式。了解QQ在传输信息过程中用到的协议。分析在Nat模式下,信息传输的穿透性。
二、 实验环境:
Win7 专业版32位(在虚拟机里面)。
Win7 旗舰版64位(物理机)
QQ版本:TM2013
Wireshark
三、文字聊天协议族(TCPF, Text Chatting Protocol Family)
它主要支持与其它QQ客户端进行文字聊天。TCPF是建立在UDP协议之上。UDP数据包中的第一个字符02为这个协议族的标识。TCPF的服务器使用8000号端口,腾讯的QQ客户端软件一般从4000号端口开始尝试使用,但实际上,对客户端使用的端口号并没有限制。目前的研究集中在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包头:
0)、所有TCPF包的前7个字节是包头,包头可以识别TCPF包的内容。包头的格式为:
1)、第0字节:TCPF包标识:0x02。
2)、第1-2字节:发送者标识。如果是0x01 0x00,表明是由服务器发送。客户端的标识与所使用的使用的QQ版本有关,如:版本QQ2013(8550)的标识为0x34 0x33。具体的协议的格式与这个字段所标识的客户端版本有关。目前我们以这个最新的3433版本来讨论。
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作为包尾。

三、 实验内容:
1、 QQ登录
1)、UDP登录
在虚拟机的win7打开QQ面板,设置登录服务器的类型为UDP

启动wireshark,然后开始登录QQ,登录成功等待一会儿停止wireshark的抓包。
抓包如图:

我们可以看到本地向远程登录服务器183.60.48.174发送了一个UDP的数据包,这个就是IP就是在刚才设置UDP登录时的系统默认IP,还可以看到这个IP返回了一个UDP的数据包。看来这两个包就应该是登录验证的包,接下来的几个包的服务器IP变成了183.60.48.165,由于这个IP和登录服务器的IP位于统一网段,因此我们可以猜测这个IP是腾讯用来存储我们发送的信息的服务器。需要注意的是,在多次实验下,可以发现服务器不止183.60.48.165这一个,这是因为想QQ这样的大吞吐量的信息交互,必须用多台服务器分流,所以这个IP并不一定是某一个。下面的一些包应该就是心跳包。那个OIQC协议就是QQ用的协议,其实实际上也是一个UDP包。下面的DNS协议就是因为我的QQ是在虚拟机里面登录的,在向外网交互信息的时候会通过网关192.168.214.2解析。
我们来分析一下登录时候的UDP包

从这个图我们可以得知源和目的的IP,mac地址,还有双方的端口号等等一些信息。
数据链路层:

目的MAC地址:00 50 56 e3 56 95
本机MAC地址: 00 0c 29 ba 59 3c
网络层:

通过查询资料和分析我们知道:
45:版本IPv4,首部长度20字节
00:区分服务
00-73:总长度175字节
36-1e:标识
00-00:标志和偏移
80:生存时间128
11:传输协议UDP(17)
传输层:

0f-a0:源端口4000
1f-40:目的端口8000
009b:长度155字节
7f-c4:检验和
QQ的数据

通过查询资料和分析我们知道:
02:QQ报文的开头
34-20:QQ客户端的版本号,实验所用版本为QQTM2013
08-25:用户请求登陆的命令的序号
67-dc:发送数据的序号
56-a6-d2-5c:用户QQ号码,实验中为1453773404
之后的内容为加密的数据内容
最后一个字节03:QQ报文的结尾
2)、TCP登录
设置如图:

启动wireshark,然后开始登录QQ,登录成功等待一会儿停止wireshark的抓包。
抓包如图:

可以看到几个TCP的包还有一个SSL的包
对TCP包分析如图:

通过对UDP协议的分析,我们可以看到数据层和网络层的十六进制代码和之前的一模一样,这里我们就值分析传输层的TCP协议了,如图:

通过查询资料和分析我们知道:
C4-5e:源端口号50270
01- bb:目的端口443
45-34-fc-63:序号
00-00-00-00:确认号
80-02:数据偏移,标志
20-00:窗口大小8192字节
7f-3b:检验和
00-00:紧急指针
其余部分为可选字段和填充字节
在TCP协议里面我们没有看到QQ的登录验证消息。为什么呢?一看这里还有一个SSL协议,QQ会不会是通过SSL验证的呢?
SSL((Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。)
那么我们来看看这个包:

02:QQ报文的开头
34-20:QQ客户端的版本号,实验所用版本为QQTM2013
08-25:用户请求登陆的命令的序号
67-dc:发送数据的序号
56-a6-d2-5c:用户QQ号码,实验中为1453773404
之后的内容为加密的数据内容
最后一个字节03:QQ报文的结尾
可见,这个包的信息和UDP登录时候的一样,那么TCP登录是确实使用了SSL。
2、 心跳消息数据包
如图,通过IP地址查询,可以知道119.147.45.40是广东深圳的IP,而深圳是腾讯的老巢。在多次的抓包中也可以看到这个IP段,所以我们有理由相信,这个IP段是腾讯的。
那么我们打开来看看。

看到这里,确实有很熟悉哦。通过查阅资料和分析我们知道:
通过查询资料和分析我们知道:
02:QQ报文的开头
34-20:QQ客户端的版本号,实验所用版本为QQTM2013
00-58:用户在线的命令序号
3b-09:发送数据的序号
56-a6-d2-5c:用户QQ号码,实验中为1453773404
之后的内容为加密的数据内容
最后一个字节03:QQ报文的结尾
3、 收发信息数据包
对方在线的时候

我们看看第一个包:

可以看到蓝色字体那里的02是QQ报文的开头,这里需要注意的就是00-cd是客户端向服务器发送消息的命令序号,1b-db是发送数据序号,其他的都一样。通过几次实验发现,00-cd客户端向服务器发送消息的命令序号是固定的,而1b-db发送数据序号是会改变的。而且没每送一个包,服务器是会回复一个包给客户端的。
资料QQ助手方式,关注公总号RaoRao1994,查看往期精彩-所有文章,即可获取资源下载链接

更多资源获取,请关注公总号RaoRao1994
PC端QQ协议说明,完美搞定QQ智能助手的更多相关文章
- 【转】自动识别是手机端还是pc端只用一行代码就搞定
<script type="text/javascript"> var mobileAgent = new Array("iphone", &quo ...
- 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】
说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...
- 简单案列完美搞定Mvc设计模式
一个小列子搞定Mvc模式,包括数据库以及如何提高用户体验度 1.首先来web.xml配置servlet的访问路径: <?xml version="1.0" encoding= ...
- python一招完美搞定Chromedriver的自动更新
日常的web自动化过程中,我们常常用python selenium库来操纵Chrome浏览器实现网页的自动化.这其中有个比较头疼的问题:Chrome的更新频率非常频繁,与之对应的Chromedrive ...
- PC端实现浏览器点击分享到QQ好友,空间,微信,微博等
网上现在比较流行的是JIaThis,但是测试的时候,不能分享给QQ好友,一直卡在输入验证码,以下代码亲测有效,可直接使用 <%@ page language="java" c ...
- AlloyTouch实战--60行代码搞定QQ看点资料卡
原文链接:https://github.com/AlloyTeam/AlloyTouch/wiki/kandian 先验货 访问DEMO你也可以点击这里 源代码可以点击这里 如你体验所见,流程的滚动的 ...
- GJM : AlloyTouch实战--60行代码搞定QQ看点资料卡
原文链接:https://github.com/AlloyTeam/AlloyTouch/wiki/kandian 先验货 访问DEMO你也可以点击这里 源代码可以点击这里 如你体验所见,流程的滚动的 ...
- 完美搞定《DOCKER IN ACTION》第二章示例
起来!!!命令如下: 建立第一个web docker docker run --detach --name web nginx:latest 建立第二个web_test docker docker r ...
- Celery Flower监控,完美搞定
XXXX啊,,从上午就看到QUEQUE有问题,但一直不晓得哪里出了问题, 后来,安装上FLOWER看一下,队列就出来了... 神器啊.. 安装不说,运行很EASY.. celery flower -A ...
随机推荐
- 使用stringstream代替sprintf和sscanf
C++里面的字符串格式话 之前一直是用的sprintf和sscanf 比较麻烦的是要申请一个字符数组然后在调用 用stringstream就比较完美 int main(int narg,char** ...
- js对数组分组处理
一.js数组分组 1.js对数据分组类似group by 源码如下: <!DOCTYPE html> <html lang="en"> <head&g ...
- 统计学_样本量估计_python代码实现
python机器学习-乳腺癌细胞挖掘(博主亲自录制视频)https://study.163.com/course/introduction.htm?courseId=1005269003&ut ...
- 监控部署nagios+snmp
参看是否有安装:rpm -q gcc glibc glibc-common gd gd-devel xinetd openssl-devel 未安装基础支持套件的先安装: yum install -y ...
- ArcGISDynamicMapServiceLayer 和 ArcGISTiledMapServiceLayer 区别
ArcGISDynamicMapServiceLayer(动态地图服务)通常用于实时显示经常变化的数据,支持控制单个图层可见性,可动态投影.但缺点是显示效果较差,整个服务出图较慢:ArcGISTile ...
- SAS中的聚类分析方法总结
SAS中的聚类分析方法总结 说起聚类分析,相信很多人并不陌生.这篇原创博客我想简单说一下我所理解的聚类分析,欢迎各位高手不吝赐教和拍砖. 按照正常的思路,我大概会说如下几个问题: 1. 什么是 ...
- 哈希表 HashTable(又名散列表)
简介 其实通过标题上哈希表的英文名HashTable,我们就可以看出这是一个组合的数据结构Hash+Table. Hash是什么?它是一个函数,作用可以通过一个公式来表示: index = HashF ...
- elasticsearch 修改 mapping
Elasticsearch的mapping一旦创建,只能增加字段,而不能修改已经mapping的字段.但现实往往并非如此啊,有时增加一个字段,就好像打了一个补丁,一个可以,但是越补越多,最后自己都觉得 ...
- Day03:运算符和表达式 / 分支结构
Java 运算符 计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量.我们可以把运算符分成以下几组: 算术运算符 关系运算符 位运算符 字符串运算符 ...
- USACO3.3 Home on the Range【思维】
做完之后看到题解里面很多bfs,dfs,甚至还有dp? 写了一个不知道怎么称呼它的方法,暂且叫他乱搞吧. 用数组a[][]预处理出以当前行作为最底层,这一列从上往下的最长的1的长度. 如果这个格子为0 ...