QQ传输协议分析


引言

我们都知道,现在越来越多的应用采取了 HTTPS or TLS 传输协议,对于一般的协议,我们可以使用中间人技术对流量进行劫持转发,从而破解密文,这边可以参见我的另外一篇文章基于加密邮件协议的中间人攻防实战, 而对于 HTTPS 应用即使是我们采取中间人技术,也很难让浏览器相信你的证书。对于有经验的人员而言,一眼就可以看穿。

当然除了以上情况,还有一部分应用采取私有加密方式或明文方式进行传输,本场 Chat 就第三种方式从 QQ 传输协议入手,带您探究 QQ 传输协议。

通过本场 Chat 学习,您将了解以下:

  • 协议是什么?
  • 如何使用 Wireshark 工具抓取报文?
  • QQ 文件传输协议探究。
  • QQ Udp传输方式如何保证顺序的呢?
  • QQ 离线传输协议探究。
  • QQ 秒传原理探究。
  • QQ聊天是否可破。

相信通过本 Chat 学习,您将更加熟悉传统 IM 的通信方式,同时也更知道如何保护自己程序。

网络协议

协议,网络协议的简称。网络协议是通信计算机双方必须共同遵从的一组约定。如怎么样建立连接、怎么样互相识别等。只有遵守这个约定,计算机之间才能相互通信交流。打个比方: 一个通信的双方,A将消息通过B方式传输,C接受的消息格式是D,B与D不一样,那C如何知道A给他传递什么?这样必然会造成误解,所谓通信,前提是必须能够正确的相互交流,而交流则建立在一个标准的通信规范。我们所知道的很多互联网通信协议(DNS、FTP、SMTP等)都有在RFC文件内详细说明。作为一个网络从业者,必须掌握通过阅读RFC学习协议知识。当然,不是所有的协议都会公开其消息格式的,比如我们这篇文章所要聊得QQ传输协议。QQ国内IM通信领域的佼佼者,如果他将自己的传输协议公开,那么用户的聊天就没有秘密可言,谁还会继续使用其产品,所以QQ的缔造者们,创造了属于自己的私有传输协议。本文就带你一起看一下QQ传输协议。

网络分析工具

想要学习一个通讯协议,首先你必须要有一定的网络学知识,比如TCP/IP协议栈的组成、TCP、UDP数据报文的基本格式等等,在此推荐大家可以购买TCP/IP卷进行学习。其次需要掌握如何抓取报文、如何分析报文。这边给大家推荐几款工作 ,希望能够帮到大家。 1、Wireshark 大名鼎鼎的wireshark, 不仅支持windows平台也支持linux平台。这是网络学习者所推崇必备掌握神器之一。

2、Tcpdump 用于linux 命令行下的抓包工具。在调试服务器的时候 是分外有用。

3、QPA 一款用于进程抓包的工具,能够抓取各个客户端应用的数据包,并能够自动分析某些雷同特征等。

4、HttpFider 一款用于抓取http传输信息的工具,可以设置断点、修改cookie以及代理的一款工具。

基本上掌握了上述几款抓包工具,就足够应付网络协议。

QQ传输方式探究

好了,下面开始进入我们的主题,关于QQ传输协议的探究。也许在N年前,你还能听到XX版本的QQ被破解了,随着时间的推移,QQ本身也在不断完善。 如今你是否还能听到QQ被破解呢?作者在此保留自己的态度。世界上没有不透风的墙。

首先看一下,一般IM通信的几种应用场景:

  • 公网与公网传输
  • 内网与公网传输
  • 同一子网内传输
  • 子网与不同网络子网传输

其中除了第一种公网与公网传输,其余的几种方式,均离不开nat的穿透技术。

而文件的传输方式 又大致可以分为以下几类:

  • 在线传输方式
  • 离线传输方式
    • 离线文件上传至服务器
    • 离线文件秒传至服务器

QQ UDP传输模式探究

我们都知道TCP传输是一种可靠的传输方式,一旦发现丢包会有重传机制。那么UDP传输方式,并没有seq、ack等参数,那么我们怎么能确保通信双方的信息能够准确的抵达呢?一般做法是,多次传输同一段报文。显然这个做法还是不错的,但是如果每个报文都是这么玩的话,那么这种传输模式,是很难被人接受的。既然我们无法修改TCP/IP协议栈规范,那么QQ基于此,在报文的应用层数据上进行了数据报文的组装。由应用层自行维护数据报文的乱序、以及缺失问题。下面就我们抓取的QQ udp传输报文进行分析一下:

QQ号交互

QQ传输文件一般第一步都是交互双方的QQ号码 enter image description here

QQ文件信息

传输文件名:server.c 从数据包可以看出,qq传输文是文件名unicode编码方式。

enter image description here

QQ文件内容

QQudp传输文件,主要就是把文件拆解为很多块进行传输,并用id标注了不同的传输块。 enter image description here

QQ-udp如何保证有序

由此上述报文分析,我们大概可以看出qq-udp基本传输方式。由于UDP传输本身的不可靠性,QQ应用数据每一个分块都有18个描述字节,第一表示文件传输块,其次表示每个分块的id,正如上面标注的0x00,0x01。 但是同时,我们又想为何不用TCP这样的可靠传输来进行数据传输呢?这边又不得不说一下TCP、UDP的比较:

TCP的优点: 可靠,稳定 TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源。

TCP的缺点: 慢,效率低,占用系统资源高,易被攻击 TCP在传递数据之前,要先建连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞控制机制等都会消耗大量的时间,而且要在每台设备上维护所有的传输连接,事实上,每个连接都会占用系统的CPU、内存等硬件资源。 而且,因为TCP有确认机制、三次握手机制,这些也导致TCP容易被人利用,实现DOS、DDOS、CC等攻击。

UDP的优点: 快,比TCP稍安全 UDP没有TCP的握手、确认、窗口、重传、拥塞控制等机制,UDP是一个无状态的传输协议,所以它在传递数据时非常快。没有TCP的这些机制,UDP较TCP被攻击者利用的漏洞就要少一些。但UDP也是无法避免攻击的,比如:UDP Flood攻击…… UDP的缺点: 不可靠,不稳定 因为UDP没有TCP那些可靠的机制,在数据传递时,如果网络质量不好,就会很容易丢包。

基于上面的优缺点,那么该如何选择呢:

什么时候应该使用TCP: 当对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。 在日常生活中,常见使用TCP协议的应用如下: 浏览器,用的HTTP FlashFXP,用的FTP Outlook,用的POP、SMTP Putty,用的Telnet、SSH QQ文件传输 …………

什么时候应该使用UDP: 当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这时就可以使用UDP。 比如,日常生活中,常见使用UDP协议的应用如下: QQ语音 QQ视频 ……

QQ的选择: 笔者这边特地去研究了下使用UDP传输文件的情况,通过多次抓包了解到QQ在外网传输的时候使用udp,在内网传输过程中采用了TCP,那么为什么会出现这样的情况呢? 正如我们一开始所讲的,在实际运用QQ聊天、传输文件时候,绝大部分情况都是在不同子网内,而我们如何才能做到P2P的传输方式呢?不可能所有都采用离线中转模式把?基于以上考虑,QQ使用udp传输方式的主要目的就出来了, 就是为了渗透内网,通俗讲就是内网穿透,我们都知道udp相对于tcp更加容易打洞,达到端对端通信,减轻服务器压力。

为此我也做了个实验,内网拓扑环境如下:

Client A   内网 ip: 172.16.8.187   公网ip:180.110.*.*
Client B   内网 ip: 172.168.1.2    公网ip:181.111.*.*

enter image description here 下面针对此种环境进行在线文件传输,抓包研究,可以明显看出来,远程172.168.1.2已经打好洞,172.16.8.187 直接和对端公网ip进行通信,对方公网对收到的数据转发给clientB enter image description here

这边就不对TCP传输文件方式进行更进一步的阐述了,相信您也是手到擒来。

QQ 离线传输协议探究。

QQ离线传输,相对QQ在线传输而言。所谓离线,即将消息或文件传至服务器,再由服务器中转。 离线产生原因: 一、用户手动点击离线传输,不需要一直打开客户端等待对方接受 二、多终端登录下,QQ为了兼顾所有终端都能接受,则默认采用离线传输至服务器,再由服务器对各个终端进行分发。这一点读者可以试试哦!

下面我们拆解一个QQ离线传输数据包进行粗略解读(网络拓扑依旧是不同公网的子网中): 抓取离线QQ文件传输数据报文如下: enter image description here

我们可以看到几种提交POST方式,注意到都有Md5的信息,这应该是每个片段数据的Md5值。 POST /ftn_handler?bmd5=faadd812639caaf8c35a8ec06fcda21f POST /ftn_handler?bmd5=f2aa2bd269ad617998076ab38d9e1e1a

数据段部分除了一些脏数据(目前无法破解的)仍采用明文传输的。 enter image description here

QQ 秒传原理探究。

所谓的QQ秒传,即减少你部分上传文件慢的困扰,你发的文件如果通过比对,文件中转服务器上正好有相同的公共文件的话,就可以免除上传操作,直接让接收方从服务器下载了。所以如果发送电影、安装包等文件时,不用因为可怜的上行带宽紧张,只要能秒传命中,就可以一秒搞定发送过程了!当然腾讯这么做,还有一点,就是减轻自己服务器的压力。 下面我们就做一个实验,看看QQ到底是根据什么来判断秒传的? 步骤一、发送test.gz文件给小明 为了方便,我们就用上面解析qq离线的文件。为了能够凸显传出过程,选了一个11M文件,第一次传输: enter image description here

步骤二、再次发送test.gz文件给小明 我们发现就是biu~的一下 就传上去了。

步骤三、修改名字,再次发送test.gz 依旧是biu~的一下 就传上去了。

步骤四、修改内容,再次发送test.gz 这一次又重新读秒上传了。

步骤五、同样的文件发给不同的对象,这一次又是biu~的一下 就传上去了。

通过以上实验,我们可以知道QQ离线传输到服务器,服务器对该文件的校验主要是依赖于文件的md5数值,并针对单独的客户端维护一个云存储空间,主要存放离线文件,当然为了减轻服务器压力,腾讯的存储时间也是有周期的,这一点还是QQ群存储时间相对永久,不过每个免费创建的QQ群也就10G容量。

QQ聊天是否可破。

那么QQ聊天记录是否可破呢? 这是一个长久以来,用户最关心的话题,我可以肯定告诉你,通过流量分析这条道路肯定是走不通了,你可以看看抓取的数据报文,基本都是一堆乱码,而且据说是qq将聊天信息加密方式里面还加入了用户自己的密码进行多层加密。qq经过这么多年演变,在安防方面还是做得相当可以了。那么是否有其他手段呢,笔者这边也不做多余的引述。 大家有问题可以进行读者圈进行留言,或者加入作者QQ群:524557245 继续交流。

说明

本文仅作学习交流之用,文中若有不适当,还望指出。


 Toc