Login
升级VIP 登录 注册 安全退出
当前位置: 首页 > word文档 > 合同模板 > qq通信协议,QQ通信协议功能

qq通信协议,QQ通信协议功能

收藏

本作品内容为qq通信协议,格式为 docx ,大小 39262 KB ,页数为 27页

qq通信协议


('第1页共27页竭诚为您提供优质文档/双击可除qq通信协议篇一:qq协议简单分析qq协议简单分析qq的版本:qq的版本升级比较频繁,而且与多数的软件不同的是,它客户端的升级往往伴随着协议相应的改变。目前,对研究qq协议版本比较重要的是:qq2000c。它对应的客户端协议版本是08xx,目前对这个版本的研究比较多。qq20xx(0808)这是腾讯最新公布的qq版本,目前发现第2页共27页它对应的客户端协议版本是0a1d。目前对这个版本的研究才刚刚开始,此版本对协议做了比较大的改动。协议类型:我们尝试把qq的协议进行分类:文字聊天协议族(tcpF,textchattingprotocolFamily):它主要支持与其它qq客户端进行文字聊天。tcpF是建立在udp协议之上。udp数据包中的第一个字符02为这个协议族的标识。tcpF的服务器使用8000号端口,腾讯的qq客户端软件一般从4000号端口开始尝试使用,但实际上,对客户端使用的端口号并没有限制。目前的研究集中在tcpF上。其它未知可能存在的协议族:我们观察到qq除了与tcpF服务器通信以外,还有与其它的服务器使用udp进行通信。目前我们观察到的服务器为218.17.217.111:8000。客户端使用与tcpF不同的端口。目第3页共27页前观察到的从客户端发出的包以06开头,而服务器返回的包则以01开头。目前其具体作用未知。我们注意到一个有趣的现象是,如果选择离线后重新上线,那么在发出登录包之前,这个通讯已经开始。我们暂时把它命名为数据传输协议族(dtpF,datatransferprotocolFamily)。最新的研究发现,它传递的是qqshow的图片数据。语音、视频聊天:目前还没有开始分析,尚未知道是使用udp还是tcp协议。聊天室:没有分析,应该是tcp协议。随着对这些协议分析的开始,我们会给它们更精细的划分和恰当的命名。tcpF:tcpF是建立在udp协议上的协议族,主要支持文字聊天功能。tcpF是以请求-响应模式工作的。也就是说,客户端发出一个请求,服务器端会给出一个相应的响应;服第4页共27页务器向客户端发送信息,客户端也会给服务器相应的响应。请求和响应通过相同的序列号来进行配对(请求代码也应该相同)。而且每种请求的发起方都是相同的。目前,已知的请求包括:0x0001注销登录0x0002心跳信息0x0004更新用户信息0x0005搜索用户0x0006获取用户信息0x0009不需认证方式添加好友0x000a删除好友0x000b需要认证的方式添加好友0x000d设置隐身、示忙等状态0x0012确认收到系统消息0x0016发送消息第5页共27页0x0017收到消息(服务器发起)0x001a未知作用。0x001c在对方好友列表上删除自己0x001d未知作用。0x0022登录0x0026获取好友清单0x0027获取在线好友0x0030群操作指令0x0080收到系统消息(服务器发起)0x0081收到好友状态改变消息(服务器发起)本篇文章来源于中国协议分析网paf.net/class/otheranalysis/20xx06/4758.html篇二:qq通信原理及qq是怎么穿透内网进行通信的?qq是一个基于tcp/udp协议的通讯软件发送消息的时候是udp打洞,登陆的时候使用http~因第6页共27页为登陆服务器其实就是一个http服务器,只不过不是常用的那些,那个服务器是腾讯自行开发的!!!一、登录qq客户端在局域网内,当你打开qq登录到qq服务器时,通过外网,你的客户端与qq服务器建立了一个长连接。你可以用netstat-bn看到此连接的状态是establish此时,在qq服务器那面看到的连接的ip是你们局域网对外的ip。举个例子:qq服务器ip:121.115.11.81服务端口:80你的机器在局域网中内部ip:10.19.9.89你局域网出口internetip:61.183.172.149你的客户端的请求将通过外网出去,如果防火墙没有禁止访问internet上80端口服务,那么你的qq客户端可以正常登录。你看到的连接是(netstat-bn)10.19.9.89:55579124.115.11.81:80establish第7页共27页这是一个假象。通过qq服务器看到的连接是:124.115.11.81:8061.183.172.149:31234establish这样,防火墙上的31234口对应的就是你机器的55579口。(由于你是发起方,这个数是变化的。动态的)当有信息给你时,qq服务器只需要发给防火墙的55579口即可。(这里防火墙作了地址翻译)不管udp还是tcp,最终登陆成功之后,qq都会有一个tcp连接来保持在线状态。这个tcp连接的远程端口一般是80,采用udp方式登陆的时候,端口是8000。因此,假如你所在的网络开放了80端口(80端口是最常用端口。。就是通常访问web的端口,禁掉它的话,你的网络对你来说价值已经不大了),但没有屏蔽腾讯的服务器ip,恭喜你,你是可以登陆成功qq的。二、聊天消息通信采用udp协议,通过服务器中转方式。大家都知第8页共27页道,udp协议是不可靠协议,它只管发送,不管对方是否收到的,但它的传输很高效。但是,作为聊天软件,怎么可以采用这样的不可靠方式来传输消息呢?于是,腾讯采用了上层协议来保证可靠传输:如果客户端使用udp协议发出消息后,服务器收到该包,需要使用udp协议发回一个应答包。如此来保证消息可以无遗漏传输。之所以会发生在客户端明明看到“消息发送失败”但对方又收到了这个消息的情况,就是因为客户端发出的消息服务器已经收到并转发成功,但客户端由于网络原因没有收到服务器的应答包引起的。因为用户一般都是在局域网内,地址都为私有ip,腾讯服务器是如何将信息转发到用户的首先先介绍一些基本概念:nat(networkaddresstranslators),网络地址转换:网络地址转换是在ip地址日益缺乏的情况下产生的,它的第9页共27页主要目的就是为了能够地址重用。nat分为两大类,基本的nat和napt(networkaddress/porttranslator)。(qq通信协议)最开始nat是运行在路由器上的一个功能模块。最先提出的是基本的nat,它的产生基于如下事实:一个私有网络(域)中的节点中只有很少的节点需要与外网连接(呵呵,这是在上世纪90年代中期提出的)。那么这个子网中其实只有少数的节点需要全球唯一的ip地址,其他的节点的ip地址应该是可以重用的。因此,基本的nat实现的功能很简单,在子网内使用一个保留的ip子网段,这些ip对外是不可见的。子网内只有少数一些ip地址可以对应到真正全球唯一的ip地址。如果这些节点需要访问外部网络,那么基本nat就负责将这个节点的子网内ip转化第10页共27页为一个全球唯一的ip然后发送出去。(基本的nat会改变ip包中的原ip地址,但是不会改变ip包中的端口)关于基本的nat可以参看RFc1631另外一种nat叫做napt,从名称上我们也可以看得出,napt不但会改变经过这个nat设备的ip数据报的ip地址,还会改变ip数据报的tcp/udp端口。基本nat的设备可能我们见的不多(呵呵,我没有见到过),napt才是我们真正讨论的主角。看下图:servers118.181.0.31:1235^session1(a-s1)^18.181.0.31:1235v155.99.25.11:62000v第11页共27页nat155.99.25.11^session1(a-s1)^18.181.0.31:1235v10.0.0.1:1234vclienta10.0.0.1:1234有一个私有网络10...,clienta是其中的一台计算机,这个网络的网关(一个nat设备)的外网ip是155.99.25.11(应该还有一个内网的ip地址,比如10.0.0.10)。如果clienta中的某个进程(这个进程创建了一个udpsocket,这个socket绑定1234端口)想访问外网主机18.181.0.31的1235端口,那么当数据包通过nat时第12页共27页会发生什么事情呢?首先nat会改变这个数据包的原ip地址,改为155.99.25.11。接着nat会为这个传输创建一个session(session是一个抽象的概念,如果是tcp,也许session是由一个syn包开始,以一个Fin包结束。而udp呢,以这个ip的这个端口的第一个udp开始,结束呢,呵呵,也许是几分钟,也许是几小时,这要看具体的实现了)并且给这个session分配一个端口,比如62000,然后改变这个数据包的源端口为62000。所以本来是(10.0.0.1:1234->18.181.0.31:1235)的数据包到了互联网上变为了(155.99.25.11:62000->18.181.0.31:1235)。一旦nat创建了一个session后,nat会记住62000端口对应的是10.0.0.1的1234端口,以后从18.181.0.31发送到62000端口的数据会被nat自动的转发到10.0.0.1第13页共27页上。(注意:这里是说18.181.0.31发送到62000端口的数据会被转发,其他的ip发送到这个端口的数据将被nat抛弃)这样clienta就与servers1建立以了一个连接。呵呵,上面的基础知识可能很多人都知道了,那么下面是关键的部分了。看看下面的情况:servers1servers218.181.0.31:1235138.76.29.7:1235+----------------------+----------------------+^session1(a-s1)^^session2(a-s2)^18.181.0.31:1235138.76.29.7:1235第14页共27页v155.99.25.11:62000vv155.99.25.11:62000vconenat155.99.25.11^session1(a-s1)^^session2(a-s2)^18.181.0.31:1235138.76.29.7:1235v10.0.0.1:1234vv10.0.0.1:1234vclienta10.0.0.1:1234接上面的例子,如果clienta的原来那个socket(绑定了1234端口的那个udpsocket)又接着向另外一个servers2发送了一个udp包,那么这个udp包在通过nat时会怎么样呢?这时可能会有两种情况发生,一种是nat再次创建一个第15页共27页session,并且再次为这个session分配一个端口号(比如:620xx)。另外一种是nat再次创建一个session,但是不会新分配一个端口号,而是用原来分配的端口号62000。前一种nat叫做symmetricnat,后一种叫做conenat。我们期望我们的nat是第二种,呵呵,如果你的nat刚好是第一种,那么很可能会有很多p2p软件失灵。(可以庆幸的是,现在绝大多数的nat属于后者,即conenat)好了,我们看到,通过nat,子网内的计算机向外连结是很容易的(nat相当于透明的,子网内的和外网的计算机不用知道nat的情况)。但是如果外部的计算机想访问子网内的计算机就比较困难了(而这正是p2p所需要的)。那么我们如果想从外部发送一个数据报给内网的计算机有什么办法呢?首先,我们必须在内网的nat上打上一个“洞”(也就是前面我们说第16页共27页的在nat上建立一个session),这个洞不能由外部来打,只能由内网内的主机来打。而且这个洞是有方向的,比如从内部某台主机(比如:192.168.0.10)向外部的某个ip(比如:219.237.60.1)发送一个udp包,那么就在这个内网的nat设备上打了一个方向为219.237.60.1的“洞”,(这就是称为udpholepunching的技术)以后219.237.60.1就可以通过这个洞与内网的192.168.0.10联系了。(但是其他的ip不能利用这个洞)。呵呵,现在该轮到我们的正题p2p了。有了上面的理论,实现两个内网的主机通讯就差最后一步了:两边都无法主动发出连接请求,谁也不知道谁的公网地址,那我们如何来打这个洞呢?我们需要一个中间人来联系这两个内网主机。现在我们来看看一个p2p软件的流程,以下图为例:servers(219.237.60.1)第17页共27页+-----------------------+----------------------+nata(外网ip:202.187.45.3)natb(外网ip:187.34.1.56)(内网ip:192.168.0.1)(内网ip:192.168.0.1)clienta(192.168.0.20:60000)clientb(192.168.0.10:40000)首先,clienta登录服务器,nata为这次的session分配了一个端口60000,那么servers收到的clienta的地址是202.187.45.3:60000,这就是clienta的外网地址了。第18页共27页同样,clientb登录servers,natb给此次session分配的端口是40000,那么servers收到的b的地址是187.34.1.56:40000。此时,clienta与clientb都可以与servers通信了。如果clienta此时想直接发送信息给clientb,那么他可以从servers那儿获得b的公网地址187.34.1.56:40000,是不是clienta向这个地址发送信息clientb就能收到了呢?答案是不行,因为如果这样发送信息,natb会将这个信息丢弃(因为这样的信息是不请自来的,为了安全,大多数nat都会执行丢弃动作)。那该怎么办呢?首先我们假设servers是219.237.60.1:7000,当clineta(202.187.45.3:60000)向servers(219.237.60.1:7000)发送数据包,servers是可以正常接收到数据,因为它是属于外型开放的服务器端口。当servers收到数据包后可以获知第19页共27页clineta(202.187.45.3:60000)对外通信的临时session信息(这个叫临时的端口,假设是60000会过期,具体时间不同,一般是每30s发送一个keep住连接以保证端口维持通信连接不断)servers此时应将次信息保存起来。而同时,clientb(192.168.0.10:40000)也在时刻向servers发送心跳包,servers就向clientb(192.168.0.10:40000)发送一个通知,让clientb(192.168.0.10:4000)发送探测包(这个数据包最好发几个),clientb(192.168.0.10:4000)在收到通知后在向servers发送反馈包,说明以向自己以向clienta(192.168.0.20:60000)发送了探测包,servers在收到反馈之后再向clienta(192.168.0.20:60000)转发反馈包,clienta(192.168.0.20:60000)在收到数据包之后在向原本要求请求的clientb(192.168.0.10:4000)发送数据第20页共27页包,此时连接已经打通,实现穿透。clientb(192.168.0.10:4000)会将数据包转发给clienta(192.168.0.20:60000)从而在转发给内网内网ip:192.168.0.1。对于symmetricnapt的情况,网上有人说可以通过探测端口的方式,不过成功率并不高,我建议可用服务器进行中转。另外,最好在数据包发送前先检测是否进行的是同个nat的情况,也就是内网发内网,如果是,直接发送即可,而无需通过外网再绕回来。篇三:qq协议分析及还原qq协议分析及还原最初,qq通信协议并没有加密,而是直接采取明文的方式进行传输,到了后来才使用了加密传输,加密算法一直没有变过,使用的是blowfish算法,但是密钥的交换协议变得比较频繁。其实tx也是被逼的,现在的互联网用户第21页共27页比前几年更加注重隐私安全,这么大用户量的通信软件,如果用户与对方之间的聊天信息可以轻易的被第三方破译获取,那么用户量肯定会离开她,而去选择那些能够更加保护好个人隐私的人通信软件。因此,随着时间的推移和技术的发展,以前设计的协议可能会被研发者发现一些弱点,“图谋不轨”者加以利用,会对tx造成一些潜在的风险,他不得不对协议进行修改(qq20xx正式版中的密钥交换中对密码的md5计算就加入了salt的概念,这个salt就是对应的qq号码,后面会有详细的描叙)。qq协议首选的传输层是udp,如果udp不可登陆,那么会再尝试使用tcp进行传输。udp使用的端口是8000,tcp使用的端口是443,应用协议基本一样,只是在通过tcp进行传输时,前两个字节为协议内容的长度(包括2个字节)。qq协议中每个通信内容都带有一个协议头部,如下第22页共27页图:其中标识1一个字节,版本号、命令字和序号都是2个字节,qq号码有4个字节,接下来是数据部分(已加密),最后是一个尾部标识1个字节。在进行协议还原的时候,最关心的就是协议头部的命令字,需要根据不同的命令字,来进行相应的处理,最终获取密钥解密聊天内容。qq登陆协议密钥交换过程,首先我们使用wireshark抓报文分析,观察主要用到的命令字(见上一篇header部分的介绍)。1、touchinformation(0×0091)这个报文无需关心,是客户端向服务器在sayhello…2、loginRequest(0x00ba)未知,在此处并不重要。3、loginVerify(0x00dd)第23页共27页非常重要!!获取会话密钥首先得解密该报文。但是要解密该报文,必须得知道该登陆qq用户的密码,而用户密码只有用户和tx知道,第三方是不知道的(也有可能存在“不可思议”的第三方…)。数据传输过程中使用的加密算法是blowfish,这个算法目前从公开的资料上来说,还没有发现漏洞。因此,要实时获取用户的聊天信息,除非已经知道密码了,或者已经暴力破解了密码(这里简单介绍一下怎么进行暴力破解,这里的暴力破解,当然不是模拟一个qq客户端不停的向tx服务器发送登陆请求,这样太慢了,而且tx那边也会有记录。首先,得分析出这个报文的密钥生成算法[不是简单的直接使用密码作为密钥],加密算法(这个已知,是blowfish),第二,需要将对方的登陆报文截取保存到文件,然后写一个程序,不停拼接字符串、数字、标点符号进行组合,根据第一步分析它密钥的生成方法生成出密钥,然后作为blowfish算法的密第24页共27页钥,去解密报文,如果解密成功,恭喜你,你暴力破解到了一个qq密码。但是这种概率比较小,即使有一些,这些号码的价值不大,扯远了…)。loginVerify报文的解密密钥生成方法,在qq20xx版本之前,是md5(md5(pwd)),对qq的密码做了两次md5运算。但是qq20xx版本(包括20xx版本)之后,这个算法做了一点修改,就是:md5(md5(pwd+qq_num)),这个修改其实是非常有必要的,为什么呢?因为随着硬件技术的发展,以及前些年md5彩虹表的推出,简单密码的md5值非常容易就能从彩虹表中找出对应md5值,从而得到原始字符串密码,即使tx做了两次的md5运算。在彩虹表的推出或以前(因为我也不知道是在这以前还是以后,呵呵),在执行md5运算时,就有了加salt的说法,很形象!加盐,在这里,qq_num就是盐,这样就加大了使用彩虹表破解的难度。第25页共27页使用密码根据以上的算法得出解密密钥,解密loginVerify报文后,会得到一个新的密钥,这个密钥暂且就叫做verify_key。loginVerifyReply(0x00dd)服务器对客户端loginVerify报文的响应,这个报文需要verify_key作为密钥进行解密,得出一个新的密钥-verify_reply_key。4、logingetinformation(0x00e5)客户端接收到服务器的loginVerifyReply报文后,会使用verify_reply_key加密数据发送到服务器,而这里面又包含了一个key–get_info_key。5、loginverifye3(0x00e3)未知,此处可以不进行处理。6、loginsendinformation(0×0030)使用get_info_key解密该报文,得到会话key–第26页共27页sessionkey。回想一下:密码是关键,有了密码才能解密loginVerify(0x00dd)报文,解密了loginVerify(0x00dd),才能解密后续的的报文。其步骤是:passwd->verify_key->verify_reply_key->get_info_key->session_key。前面两篇简单的介绍了qq登陆协议密钥交换过程以及所使用的加密算法,知道了这两点,就可以对它的协议进行还原了。qqdecrypt,通过winpcap抓包,实时对qq聊天协议进行还原。除了聊天协议之外,我们还可以对qq相关的协议进行还原,包括但不限于:1、qq文件传输2、qq音频传输第27页共27页3、qq视频传输4、qq密码验证程序5、qq密码获取,是的,你没有看错,有一种主动的方法(用户登录时)就可以获得qq的密码。在网络出口获取,而不是在客户端进行hook的方式获取。',)


  • 编号:1700673301
  • 分类:合同模板
  • 软件: wps,office word
  • 大小:27页
  • 格式:docx
  • 风格:商务
  • PPT页数:39262 KB
  • 标签:

广告位推荐

相关合同模板更多>