3、数据包捕获与预处理:Wireshark抓包技巧、过滤规则、数据包导出、Hex转储分析
说实话,搞逆向这么多年,我最怕的就是跟黑盒协议打交道。你想想看,一个陌生的二进制协议摆在面前,没有文档、没有源码,唯一能抓住的线索就是网络里飞来飞去的数据包。这时候,Wireshark就是你的眼睛。
这一章,我带你走一遍我的标准流程:怎么抓、怎么滤、怎么导、怎么看。全是实战里磨出来的经验,不是那种照本宣科的教程。
3.1 抓包前的准备工作
别急着点那个蓝色的鲨鱼鳍。先想清楚你要抓什么。
抓包位置的选择,我个人习惯放在目标进程所在的主机上。如果条件不允许,比如目标跑在嵌入式设备里,那就用端口镜像或者ARP欺骗把流量引过来。我在一次工控协议逆向中就吃过亏——抓包点放错了位置,结果抓了一堆广播包,真正的MCP通信流量全从旁路走了,白忙活半天。
另外,记得关闭Wireshark的自动解析功能。嗯,这一点很多人会忽略。Wireshark默认会尝试解析各种协议,但MCP这种私有协议它根本不认识,反而会把原始数据搞乱。我建议在抓包前就把“Enable transport layer protocol heuristics”关掉。
3.2 过滤规则:从海量数据里捞出你想要的
Wireshark一开,数据包就像瀑布一样往下刷。不设过滤,你根本找不到北。
针对MCP协议,我常用的过滤规则分三层:
| 过滤目标 | 过滤表达式 | 说明 |
|---|---|---|
| 按IP过滤 | ip.addr == 192.168.1.100 |
只显示目标主机的流量 |
| 按端口过滤 | tcp.port == 8080 |
MCP通常跑在固定端口上 |
| 按数据特征过滤 | tcp.payload[0:4] == 0x4d435000 |
匹配MCP协议魔数(Magic Number) |
第三层过滤最实用。MCP协议的数据包头部通常有一个固定的魔数,比如0x4D435000(对应ASCII的“MCP”)。你只要在Wireshark里输入tcp.payload[0:4] == 0x4d435000,就能把非MCP的流量全部过滤掉。我曾经在一个项目中,服务器上跑了七八个服务,混杂的流量里就靠这一招精准定位到了MCP的通信流。
3.3 数据包导出:把原始数据拿到手
Wireshark里看数据很方便,但我们要做的是离线分析。所以必须把数据包导出成我们能处理的格式。
我一般用两种导出方式:
- 导出为pcap文件:保留完整的包结构,适合后续用Python的Scapy库做自动化分析。
- 导出为Hex转储:只保留原始字节流,适合快速查看和手动分析。
具体操作很简单:选中你要导出的数据包(或者直接用过滤后的结果),点击 文件 → 导出分组解析结果 → 为纯文本文件。在导出选项里,我建议勾选“Packet bytes”和“Hex dump”,这样每一行就是一个数据包的完整十六进制表示。
举个例子,导出的Hex转储长这样:
00000000 4d 43 50 00 01 00 00 00 00 00 00 2a 00 00 00 01 MCP........*....
00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
你看,第一行的4d 43 50 00就是魔数,后面跟着的是协议版本号、数据长度、序列号等字段。这些信息在后续的协议逆向中至关重要。
3.4 Hex转储分析:从字节里读出故事
拿到Hex转储后,怎么分析?说白了,就是猜。
我有一套固定的分析流程:
- 找边界:看数据包的长度变化。MCP协议通常是定长头部+变长负载。头部长度固定,比如32字节,那前32个字节就是头部,后面是负载。
- 找魔数:每个MCP数据包的开头都有魔数,用来标识协议身份。找到它,你就找到了数据包的起点。
- 找长度字段:头部里一定有一个字段记录了整个数据包的长度。通过对比不同数据包的长度,可以反推出这个字段的位置和字节序。
- 找序列号:MCP是请求-响应模式,所以头部里一定有序列号或事务ID,用来匹配请求和响应。
举个例子,我拿到一段Hex转储:
4d 43 50 00 01 00 00 00 00 00 00 2a 00 00 00 01
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
我一眼就能看出:
4d 43 50 00:魔数,4字节01 00 00 00:版本号,小端序,值为100 00 00 2a:数据长度,小端序,值为42(0x2a)00 00 00 01:序列号,值为1
剩下的全是保留字段或填充。你看,就这么简单。但实际项目中,字段可能不是对齐的,字节序也可能是大端,这就需要你多对比几个数据包才能确认。
3.5 知识体系:数据包捕获与预处理的核心逻辑
下面这张图,是我自己总结的数据包捕获与预处理流程。你照着这个思路走,基本不会跑偏。
这张图的核心逻辑就是:先捕获,再过滤,然后导出,最后分析。手动分析和自动分析可以并行,也可以互补。我个人的习惯是先用Hex转储做一轮快速的手动分析,摸清协议的大致结构,然后再写脚本做批量验证。
好了,数据包捕获和预处理这块,我就讲这么多。记住,工具是死的,思路是活的。Wireshark再强大,也替代不了你的分析能力。下一节,我们会拿着这些预处理好的数据,开始真正的协议逆向解密。
公众号:蓝海资料掘金营,微信deep3321