资讯详情

用Wireshark解密QQ通信协议:从抓包到协议拆解全指南

📅 2026/9/19 15:32:26 | 华诺云谱 👁 阅读
用Wireshark解密QQ通信协议:从抓包到协议拆解全指南
搞网络分析这些年Wireshark是我最离不开的工具之一。前几天看到一个话题——用Wireshark解密QQ通信协议乍一听挺唬人实际上拆开来讲这活儿并不玄乎。很多人一听“解密”就觉得是扒别人聊天记录其实不是那么回事。真正的技术点在于怎么把QQ在网络上产生的那些数据包抓下来再从里面拆出TCP/IP分层的头、UDP载荷、TLS握手过程一步步还原出QQ通信协议的框架结构。这个项目就是干这个的适合对网络协议栈有基础了解、想深入理解IM软件通信机制的人。这篇文章我会把完整的思路、抓包步骤、协议特征识别方法、以及我踩过的坑全部记录下来照着做你也能跑通整个流程。做这个项目的前提是把话说清楚**我所说的“解密”指的是对网络协议分层结构的拆解以及在不破坏加密机制的前提下对QQ通信行为特征的识别与推断而不是对QQ加密内容进行破解。**QQ的正文消息在传输层之上做了TLS加密单纯用Wireshark是看不到明文聊天内容的——这是一条安全边界明白这条边界这个项目才做得下去、做得有意义。1. 内容整体设计与思路拆解1.1 “解密”的边界先搞明白我们要解的是什么开始动手之前我在白板上写了一个问题QQ的通信协议到底哪一层是可以“解密”的这里说的解密其实是三个不同层面的工作协议栈拆解。QQ客户端和服务器之间通信先是TCP/UDP承载在IP之上IP承载在以太网帧之上。Wireshark最擅长就是把这些封装层逐层剥开从十六进制的原始字节流里恢复出源IP、目的IP、端口号、TCP标志位、序列号这些结构化信息。这一层是100%可解的也是整个项目的基石。应用层行为识别。QQ的登录、心跳、消息收发、文件传输在流量上会表现出不同的特征——比如目标端口、包大小分布、发送频率、DNS查询域名。我们可以通过抓包特征推断“此刻发生了什么行为”这是可观察、可验证的。内容层还原。也就是把聊天文字直接恢复出来。抱歉这一步在今天的QQ协议面前基本不可能因为QQ在UDP载荷之上叠加了TLS加密TLS 1.2/1.3密钥协商走的是ECDHE这类前向保密算法服务端不配合客户端私钥拿不到Wireshark里的SSLKEYLOGFILE也只是一厢情愿。如果我看到有人说自己用Wireshark直接抓出了QQ明文聊天内容那只有两种可能要么是伪造的实验环境要么是骗子。想通这一点后整个项目的定位就清晰了用Wireshark把QQ通信协议的骨架摸出来。重点放在TCP/UDP层的流量特征分析、TLS握手流程拆解、关键服务器的识别上。这个定位既安全又有技术含量学到的东西也是通用的——以后分析任何IM软件、任何加密流量这套思路都能复用。1.2 为什么选Wireshark做这个活儿做协议分析可选工具有tcpdump、TShark、Fiddler、Charles等但我最后还是用Wireshark作为主工具原因有三可视化协议树是效率神器。tcpdump能抓包但你要在满屏十六进制里人肉找字段偏移量那叫一个酸爽。Wireshark在图形界面里直接把Ethernet II、IPv4、TCP、TLS这些协议的每个字段都标得清清楚楚点一下就能看到对应字节学习成本和排错效率完全不在一个量级。内置协议解析器覆盖广。Wireshark不仅能解析几百种标准协议还内置了对OICQQQ早期公开协议名的基础识别能力虽然它把QQ识别为OICQ时未必100%准确但至少能帮你快速定位可疑的UDP包。这一点在筛选QQ流量时能省很多事。过滤表达式表达能力极强。ip.addr 你的IP udp.port 8000这种组合过滤配合统计菜单里的“会话”“端点”“协议分级”功能几乎就是一个轻量级的流量分析平台。特别是用“追踪流”功能看TCP会话能把一次QQ登录过程从建立连接到TLS握手完整还原出来。当然Wireshark也有短板——它太“轻”了不适合长时间海量抓包也不适合做自动化分析。但作为教学和手工分析的工具它无可替代。2. 环境准备与协议基础2.1 抓包前的三件事网卡、混杂模式和权限这三件事不做对后面全是白忙活。**网卡选择。**我用的是一台Windows笔记本机器上有有线网卡、Wi-Fi网卡还装了VirtualBox带虚拟网卡。开始抓包前一定要在Wireshark的“接口列表”里看清楚实际联网的是哪块网卡。我犯过的错误是选错了虚拟网卡抓了半天全是VirtualBox的虚拟流量QQ的影子都没看到。SSID连接的无线网卡或者插了网线的有线网卡名字一般带Ethernet或Wi-Fi字样虚拟网卡通常有VirtualBox、VMware这些厂商名一眼就能认出来。**混杂模式。**混杂模式Promiscuous Mode的作用是让网卡接收所有经过它的数据包而不仅是发给自己的。在交换网络中普通网卡默认只处理目的MAC是自己的帧开启混杂模式后理论上能“听”到同一冲突域里的所有流量。但要注意现在的交换机都是交换式工作方式不是早期的共享式Hub开启混杂模式并不能抓取局域网内其他电脑的流量该隔离的还是隔离。所以这里的混杂模式主要作用是把发给自己网卡的多播包、广播包、以及本机多IP产生的流量都收进来避免漏抓。**管理员权限。**Windows下抓包必须用管理员身份运行Wireshark否则NPcap驱动加载不了抓包界面会一直提示“没有权限”。Linux下更直接非root用户跑dumpcap会报错我的习惯是给当前用户加到wireshark用户组而不是直接sudo运行Wireshark——组权限够了还能避免很多图形界面下权限环境不一致的幺蛾子。2.2 QQ通信协议的基本盘端口、传输层和域名在动手抓包之前我还做了两件事查QQ的公开技术资料和自己预先跑了一轮小规模抓包探路。综合下来QQ通信协议有这么几个已知特征登录和长连接以UDP为主。QQ的经典登录场景大量使用UDP协议目的端口集中在8000、80、443这些端口上。UDP适合QQ这种需要频繁发心跳包、对实时性要求高的场景——它没有TCP的握手开销和队头阻塞丢包了就让上层重传。TCP只在上传下载、HTTP类业务中用得多。比如头像上传、文件传输、部分网页版逻辑web.qq.com相关的HTTPS请求走TCP这时目标端口通常是443HTTPS、80HTTP或4430等QQ自用端口。本地DNS解析优先。QQ服务器域名的IP不写死启动时会向DNS服务器查询sz.tencent.com、cloud.tencent.com这类域名。所以在QQ启动瞬间抓包列表里会看到大量DNS查询——这就是QQ通信协议里“前置行为”的一个特征。下表是我整理出来的、在抓包现场经常会遇到的端口和用途对照端口传输层典型用途说明8000UDP经典QQ接入老版本UDP协议的主要端口现网中仍会出现常作为长连接通道80TCP/UDP备用接入、HTTP业务防火墙放行率最高的端口很多内网环境只有80能通443TCP/UDPTLS加密通信握手后所有载荷都走TLS也是内容不可解的关键点53UDP/TCPDNS解析客户端启动时解析服务器域名可作为定位QQ服务器的线索4430、80000等TCP文件传输辅助通道QQ做文件传输时可能使用特殊端口因版本而异这些信息不在Wireshark里写死但结合抓包结果相互印证就能拼出通信框架。我建议你也做一个类似的“预研清单”带着问题去抓包效率远高于盲抓。3. Wireshark抓包实操完整跑通QQ流量捕获流程3.1 三步启动抓包别点那个蓝色鲨鱼就完事很多人打开Wireshark习惯直接双击网卡名开始抓包但对这个项目来说太过粗暴。我建议按下面的步骤操作每一步都有明确目的打开Wireshark看到主界面后先不要急着双击网卡。点菜单栏的“捕获” - “选项”在弹出的窗口里勾选正确的网卡同时在下方的“捕获过滤器”框里先输入一个预过滤条件。这个步骤是提前把无关流量挡在外面避免中途被大量ARP和广播包淹没注意力。在捕获过滤器里输入host 你的本机IP or port 8000 or port 443**然后点“开始”。**这里把本机IP放进去是确保只关心进出本机的包后面两个端口是QQ通信的重灾区。如果你是动态IP可以先在命令行用ipconfig /allWindows或ifconfig/ip addrLinux确认IP再填。让QQ产生流量。最小化Wireshark窗口然后在QQ上做一轮操作下线再登录、给好友发一条纯文字消息、发一张图片、刷新一次好友列表。每一步操作之间停顿3~5秒制造出清晰的时间分段——这对接下来的分析特别重要每段时间内的流量都能对应到具体行为了。注意整个抓包过程建议持续3到5分钟就够了不要长时间开着。Wireshark的环形缓冲如果不设置内存占用会随着流量增大不断上涨到后面分析起来不光卡还会出现丢包反而影响判断。3.2 用显示过滤器把QQ流量从噪声里捞出来抓完包停掉抓包会话我们面对的可能是一屏花花绿绿的包。这时要用显示过滤器Display Filter来收敛范围。区别于捕获过滤器显示过滤器可以在已经抓取的全部数据里随时切换条件不影响原始数据非常灵活。我常用的几组过滤条件如下按场景排列只看某个IP进出流量ip.addr 你的IP (udp.port 8000 || tcp.port 443)。这一条能快速锁定所有和QQ服务器交互的关键包。只看UDP连接udp.port 8000或者oicq。Wireshark内置了对OICQ协议的启发式识别凡是能识别为OICQ的UDP包用oicq过滤词就能全列出来。如果你的版本没识别出任何包说明QQ现在的流量特征和老的OICQ已经有较大出入没关系继续用端口过滤。只看TLS握手过程tls.handshake.type 1 || tls.handshake.type 2。这个过滤条件会把ClientHello和ServerHello全部捞出来TLS握手的两个关键消息一目了然。我自己实际抓包后用udp.port 8000过滤出来的包数量大概占总量两成左右每包大小普遍在几十到两百字节之间符合QQ心跳包“小、勤、快”的特征。我还发现在登录成功后的几秒内会出现一个较大的UDP包长度能到500字节以上推测是登录验证通过后的配置同步或好友列表推送。3.3 从登录到心跳一次QQ启动的流量时间线还原为了验证对协议流程的推断我用“统计”菜单里的“流量图”Flow Graph功能生成了从启动QQ到登录成功的完整会话时间线。这是整个过程里最有成就感的一步因为你能亲眼看到协议分层如何协作。还原出来的时间线大致是这个结构t0秒客户端发起DNS查询域名是某个腾讯服务器域名响应IP为一段公网地址。t0.1秒客户端向该IP的8000/UDP端口发出第一个UDP包包长大约60字节携带的数据像是连接请求。t0.2秒~0.5秒连续几个UDP包在客户端和服务器之间来回每个包都带有一个类似序号或Token的字段Wireshark把它解析为OICQ的发送序号数值逐步递增。t0.8秒QQ界面弹出登录成功同时间出现一个较大的UDP包500字节以上推测是登录响应中包含的初始配置文件或好友列表摘要。t2秒之后流量进入平稳期客户端每30~60秒发出一个极小的UDP包30字节左右这就是心跳保活包。这条时间线非常有价值因为它把抽象协议转化成了可观测的行为序列。以后你在其他IM软件上做同样的事步骤完全一样找DNS、找长连接端口、观察握手机制、观察心跳频率。4. 协议拆解从UDP载荷和TLS特征里读出关键信息4.1 在UDP载荷里我们到底能读出什么这是整个项目最有技术含量的一部分。当Wireshark把UDP包识别为OICQ协议时双击那个包下方的协议树会展开几个字段包头Header包含了协议版本号、标志位、序列号。这些字段证明了QQ自定义协议数据格式的存在——也就是说在UDP载荷的最前面不是直接放业务数据而是先放了一个固定格式的控制头。命令字Command它用于区分当前包的业务类型比如登录请求、心跳、消息发送。Wireshark能识别出部分命令字但并不能做到100%对应到QQ当前版本。数据段Data正常情况下这里应该是业务数据但在我抓的包里这段内容已经被TLS加密Wireshark只能显示成不可读的十六进制字节。结论很明确**QQ在UDP长连接之上升级成了TLS加密命令字可识别但真正的载荷是密文。**这正是我前面提到的“内容层不可解”的直观证据。你如果在抓包里看到数据段是一串无法用ASCII解读的随机字节不用怀疑这就是TLS保护生效的正常表现。4.2 用TLS握手流程验证加密通道的建立在TCP流量里我抓到了一次典型的HTTPS请求筛选条件是tls.handshake.type 1。双击ClientHello包能清楚看到下面几个字段TLS版本显示TLS 1.2或更高版本说明QQ传输层至少启用了TLS 1.2。Cipher Suites密码套件列表包含TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256这类前缀为ECDHE的套件。ECDHE保证了“前向保密”——即使服务器私钥泄露历史流量也无法被解密。这等于从协议层面封死了被动抓包解密的路。SNIServer Name Indication有些包能读出访问的域名信息这是定位具体业务的一个好线索。我做为一个实验顺手把Wireshark里配置SSLKEYLOGFILE的方式试了一下通过设置环境变量SSLKEYLOGFILE再在Wireshark的TLS协议设置里指定日志文件路径。原理上只要浏览器或程序支持导出密钥日志就能用它解密TLS流量。但实测下来QQ客户端并不理会这个环境变量——这也是意料之中的结果毕竟它是自有加密通信系统不会配合第三方抓包工具做调试。这个实验反倒让我更确认了一件事对于QQ这类成熟商业IM被动解密内容是不可能完成的任务。4.3 从抓到的事实逆向推断协议设计思想拆完全部关键包之后我尝试从工程师视角去总结QQ协议的几个设计侧重点这些结论都能在抓包里找到证据UDP优先、TCP兜底。QQ之所以选择UDP作为长连接主力核心目标是降低连接建立时延和服务器内存开销。UDP无连接状态对于千万级同时在线的服务端来说内存占用和CPU开销都远低于TCP。TCP并不是不用而是在可靠性要求更高的场景比如文件传输才会介入。这是一个很典型的“按业务场景选传输层”的架构决策。心跳机制与NAT保活。我抓到的30秒左右一次的小UDP包本质上是NAT保活包。移动网络下运营商NAT设备会回收长时间无流量的映射表项客户端必须周期性发心跳让NAT设备维持“这条连接还活着”的状态服务器才知道你还在线。这个细节在网上很少被讲透但抓包一次就能直观理解。协议分层思路。自定义包头 高级加密载荷这种模式很像“控制面明文、数据面加密”的设计。控制面明文让服务器能快速区分包类型并转发数据面加密保证业务内容安全。这是一种兼顾性能与安全的设计范式。5. 常见问题与排查技巧实录5.1 为什么我抓了半天QQ一个包都没有这个问题十个人里有八个人会碰上。我第一次做的时候也踩了同一个坑——开着WiresharkQQ挂机结果过滤列表里干干净净。排查思路如下先确认网卡抓对了没有。如果无线连着Wi-Fi就必须选无线网卡有线连着就选有线网卡。很多人电脑上Wi-Fi和有线同时连着流量可能走了你没选的那块网卡。最稳妥的办法是把其他网卡禁用掉只留一个联网入口。确认防火墙没有拦截Wireshark的驱动。Windows防火墙和第三方安全软件可能把NPcap驱动当恶意行为拦掉。检查Wireshark首次安装时是否弹过权限确认如果没弹去杀毒软件的拦截记录里看有没有NPcap相关条目。确认捕获过滤器没写错。捕获过滤器用的是BPF语法host 192.168.1.100中间的IP一定不能写错。如果动态IP变了过滤器就形同虚设。我的习惯是抓包前先ping一下外网域名然后在Wireshark里看能否抓到自己的ICMP包这叫“探针法”能快速确认抓包链路整体通不通。5.2 为什么Wireshark没有识别出OICQ协议很多时候你会看到UDP包是有的端口8000也对得上但协议列显示的是“UDP”而不是“OICQ”。这是因为Wireshark识别OICQ依赖启发式规则需要包里的特征字节和已知模式吻合。QQ改版之后包格式可能调整启发式识别就会失效。遇到这种情况我的建议是不要为了识别而识别。端口过滤本身就是一个足够可靠的特征。用udp.port 8000等条件先把流量圈出来然后自己写协议树分析手动记录包大小、方向、频率一样能还原协议行为。甚至你可以基于Wireshark的插件机制写一个自定义解析器这就是另外一个大坑了感兴趣的话可以看官网的tshark和Lua脚本文档写出来会很有成就感。5.3 解密TLS失败别浪费时间了我在网上看到过不少帖子教人在Wireshark里配置TLS密钥日志去解QQ的HTTPS流量。实测下来这招对Firefox、Chrome里的网页流量是有效的但对QQ客户端完全无效——因为它不会把会话密钥导出到任何日志文件。所以在这个项目里你在“解密”上投入的时间要有边界感把TLS握手过程分析清楚就够了不要去尝试破解TLS本身。如果非要看明文HTTP请求可以开一个HTTP代理把QQ的部分业务强制走HTTP比如某些图片资源的下载在代理端做SSL剥离SSL Stripping但这需要客户端配合而且已经脱离Wireshark的讨论范畴。我不建议为了这点好奇心去做这种灰产边缘的尝试合规意识和技术能力同样重要。5.4 长时间抓包导致Wireshark卡死或丢包有一次我开着Wireshark抓了半小时内存占用飙到4GB多界面拖动都困难。原因是我没设置环形缓冲所有包全往内存里堆。解决方案是捕获选项 - 输出勾选“使用多文件”文件大小设成10MB或20MB文件数量设成10个左右。这样Wireshark会滚动保存不至于把内存吃满。抓包中途不要开“实时解析”之外的统计类功能像“流图”这类耗时操作会阻塞UI线程。如果只是想保存数据后续分析可以用命令行工具tshark -i 网卡名 -w output.pcap倾囊而出不占图形界面资源效率更高。6. 实操心得与扩展思考跑完这个项目我对“解密通信协议”这件事的理解有了本质变化。以前总觉得解密就是搞到一个密钥、看到明文现在才意识到协议分析真正的乐趣在于从杂乱的数据包里反向推断出一套系统设计者的思路——为什么用UDP、为什么30秒发一次心跳、为什么控制面和数据面要做分层。这些问题的答案不是任何文档直接告诉你的而是你自己一步步从抓包里观察、验证、总结出来的。这种“逆向思考”的能力能迁移到任何网络相关的排查场景里比如网页打不开、视频卡顿、服务器连接超时你都能通过抓包快速定位问题在哪一层。最后再分享一个小技巧抓QQ的包时别忘了在“统计”菜单里看“会话”Conversations窗口按“数据包”列排序你能一眼找出流量最大的几个对端IP和端口。再配合IP归属地查询工具你还能推断出QQ的接入服务器大致分布在哪些地区。这一步看似简单却是把协议分析和网络工程实践连接起来的关键一跃。做完这些你就真正把Wireshark从“抓包工具”用成了“网络显微镜”。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。