接手一个工业控制系统的安全事件,第一反应往往不是去看服务器日志,而是先问一句:现场跑的是不是Modbus。这个问题的分量,做过ICS取证的人都懂——在电力、水务、制造、楼宇自控这些行业里头,Modbus几乎是事实上的"通用语",一个老旧PLC带几十台从站设备,一条双绞线跑十几年,这种场景太常见了。
作为从IT取证转过来的人,我最初对Modbus的轻视吃过不少亏。它的报文格式看起来实在太简单,功能码就那么几个,寄存器读写一眼就能翻完。但真正到了取证环节才发现,恰恰是这种"简单"带来了巨大的分析难度:它没有加密、没有认证、没有会话状态,一个IP报文里头甚至看不出"这一次操作是哪台设备发起的、上一帧是谁应答的"这种基本归属关系。这篇笔记是我把自己踩过的坑、翻过的协议文档和实际案件里的分析思路重新梳理了一遍,想清楚了很多以前只是"照着工具点"的步骤,也沉淀了一套从流量到主机痕迹的完整取证路线。适合刚接触工控安全、或者准备做ICS取证但还没系统摸过Modbus协议的人参考。
1. 为什么Modbus取证是绕不开的课题——协议特性与取证痛点的碰撞
工业现场关于协议的争论很多:Profinet、EtherCAT、EtherNet/IP各有拥趸,但真正让安全人员又爱又恨的,始终是Modbus。爱它是因为透明、开放、实现成本极低;恨它也是因为同样的理由——摸底太容易,攻击者根本不用找什么0day,直接对着标准文档写脚本就能控制现场设备。
1.1 从1979年走到今天的协议,为何仍是现场主流
Modbus是施耐德电气(原Modicon)在1979年提出的串行通信协议,最初的目的很简单:让PLC和现场仪表之间能交换数据。后来随着以太网普及,Modicon在1999年前后定义了Modbus TCP,报文结构基本沿用了串行链路的设计,只是做了"截断"和"封装"。
这些年工控圈总有人说Modbus要被淘汰了,但现实是:存量设备基数太过庞大。水务系统里的流量计、变电站里的电表、工厂流水线上的变频器,一个现场几百个节点里,Modbus设备占比经常超过一半。对做取证的人来说,这意味着一个回避不了的事实:如果事件现场有Modbus通信,那么攻击链路的分析主线就绕不开它。
1.2 取证视角看到的Modbus,和工程师视角完全不同
搞工艺的工程师看Modbus,关心的是寄存器的地址映射对不对、数据格式是浮点还是整型、轮询周期能不能满足实时性。但做取证的人必须换一套思维:
- 不关心"数值对不对",关心"这个数值是谁写的、什么时候写的、为什么写"。
- 不关心"通信正不正常",关心"异常通信的前后因果链"。
- 不关心"协议实现了哪些功能",关心"攻击者能用哪些功能做破坏"。
举个例子:一个工程师看到功能码06(写单个寄存器),想到的是"参数调整";取证人员看到功能码06,想到的是"这可能是一次对PID参数或频率指令的篡改"。同一个协议,两种解读逻辑,这就是取证视角的核心差异。
1.3 我总结的Modbus取证三大难点
- 无认证导致身份归属困难:Modbus TCP里没有用户、没有会话,从报文上只能看到IP和端口,但无法确认"操作者是谁"。这一帧写指令是工程师站的组态软件发的,还是攻击者伪装的,仅从报文看不出来,必须结合主机侧证据。
- 无加密导致流量分析门槛低、但量级大:报文明文中包含功能码、寄存器地址、数据值,分析门槛很低,但工业现场一般7x24小时运行,PCAP文件动辄几个GB,想从海量数据里定位一次"短促的恶意写入",筛数逻辑必须足够精确。
- 状态机弱导致上下文重建困难:Modbus是无状态请求/响应模型,每一帧都是独立的,缺少"会话层"信息。攻击者可以只发一个功能码16(写多个寄存器)完成破坏,也可以慢慢轮询做扫描,两种行为在协议层面都没有"会话边界",时间线的重建更多依赖对业务逻辑的理解。
2. Modbus协议家族的现场身份识别:先把底层传输介质分清楚
做取证最忌讳拿着一份Modbus TCP的报文解析脚本,去处理一串从串口抓回来的RTU数据。你先要分清楚,现场跑的到底是Modbus RTU、Modbus ASCII还是Modbus TCP。这一步判断错了,后面的分析全白费。
2.1 RTU、ASCII、TCP三种形态的判定方法
这里我整理了自己在现场判断协议形态的快速路径:
| 判断维度 | Modbus RTU | Modbus ASCII | Modbus TCP |
|---|---|---|---|
| 典型物理层 | RS-232/RS-485 | RS-232/RS-485 | 以太网(TCP 502端口) |
| 帧格式特征 | 二进制,8位数据位,CRC16校验 | ASCII字符,LRC校验 | 二进制,报文前加MBAP头 |
| 帧间隔判定 | 3.5字符时间静默间隔 | 起始冒号:,结束CR/LF | TCP连接,一次请求一个事务 |
| 现场抓包工具 | 串口嗅探器、PLC编程软件 | 串口嗅探器 | Wireshark直接识别 |
串口场景下最常见的误判,是把RTU帧的CRC校验码当成正文数据。因为RTU是二进制的,一帧报文的最后两个字节是CRC16校验,初看很容易当成"额外的数据载荷"。判断的方法是看帧长度:RTU请求帧一般是8字节(地址1字节+功能码1字节+数据区+CRC 2字节),如果抓到的每一帧都能按这个规律对齐,基本可以确认是RTU。
2.2 关于RS-485和Modbus的关系,很多新人搞混
网上有大量文章把"485协议"和"Modbus协议"并列着讲,这本身就是个误区。RS-485是物理层标准(电气特性、差分信号、半双工通信),Modbus是应用层协议。你可以把RS-485理解成一条"公路",Modbus是公路上跑的"车"。RS-485这条"公路"上不只可以跑Modbus,也可以跑Profibus DP、DH+等其它协议。只是Modbus协议在串行链路上最常用的是RS-485,所以很多人默认两者等同了。
这个区分对取证实操意义很大:如果你在总线上抓到了非Modbus的串行数据,别再死磕Modbus解析器,先判断它到底是哪种协议。我在一个水厂项目里就遇到过:一条RS-485总线上同时挂了Modbus设备和一个采用私有协议的流量计,一开始按Modbus解包总出乱码,后来定位到是私有协议的轮询报文才理清通信全貌。
2.3 从"伺服电机控制"案例看Modbus RTU的现场特征
曾经有个伺服电机控制的取证案例让我印象深刻。在一条生产线的伺服驱动器控制中,上位机通过Modbus RTU不断写入速度设定值。正常情况下,报文模式非常规律:每隔固定周期发送功能码06写单个寄存器,然后读取当前状态。但事件期间的报文出现了两个异常:
- 写入寄存器地址不再是工艺规定的那个速度设定寄存器,而是指向了参数区。
- 写操作频率从原来的100ms一次,变成了10ms连发,大量连续写指令直接把驱动器的参数区刷了一遍。
从取证角度,这些"频率模式"和"地址漂移"就是最直接的异常信号。如果你只看单帧数据、不看通信节奏,很容易漏掉这种攻击行为。
3. 取证视角下的Modbus帧解剖:从字节序到功能码的解读逻辑
这篇笔记的核心,是把Modbus帧"拆开揉碎",从取证角度重新审视每一个字段能提供什么线索。
3.1 Modbus TCP的MBAP头:事务标识符真的没信息量吗
Modbus TCP的帧结构比RTU多了一个7字节的MBAP头:
- 事务处理标识符(Transaction Identifier,2字节)
- 协议标识符(Protocol Identifier,2字节,固定0x0000)
- 长度字段(Length,2字节)
- 单元标识符(Unit Identifier,1字节,相当于串行链路中的从站地址)
流量取证时,很多人习惯性忽略事务标识符,直接跳到功能码和寄存器。但我的经验是:攻击者如果用现成工具或自己写脚本,往往会把事务标识符固定成某个值或者简单地递增;而正常组态软件/SCADA系统的事务标识符生成逻辑通常是由协议栈底层实现的,随机性或有特定的滚动规律。
举个例子:如果PCAP里的Modbus TCP事务标识符一直是0x0001,那大概率不是正常上位机发的,因为协议栈不会写得这么"死板"。当然这是一个弱特征,不能单独作为定案依据,但可以用于筛选可疑流量和建立攻击时间线。
3.2 RTU模式下地址、功能码和数据区的关联解读
Modbus RTU帧结构如下:
| 字段 | 长度 | 取证关注点 |
|---|---|---|
| 从站地址 | 1字节 | 锁定被操作的从站设备 |
| 功能码 | 1字节 | 判断操作类型(读/写/诊断) |
| 数据区 | 可变 | 寄存器地址、寄存器数量、字节数、实际数值 |
| CRC16 | 2字节 | 校验完整性,也可以用于验证抓包工具是否丢帧 |
数据区的解读要特别注意字节序。Modbus协议规定寄存器值是大端序(高字节在前),但在实际设备映射里,16位以上的数据(如32位浮点、32位整数)有两种排列方式:一个字高字在前(big-endian)或一个字低字在前(byte-swapped)。攻防双方一旦用了不同的字节序解析同一段寄存器值,看到的数值完全不一样。这在取证分析时是个大坑:
- 攻击者写入的原始报文是
0x4120 0x0000(浮点数10.0的IEEE 754表示),你按字交换解析,读出来就是0x0000 0x4120,就成了一个接近1.415e-43的小数,很容易误判为"攻击者写入了无意义数据"。而实际上,攻击者精确地把某台加热设备的温度设定值改成了10度。
所以我做取证时一定会做两件事:先从设备手册或PLC程序中确认寄存器映射和数据类型,再用正常历史数据反推本现场的字节序规则。不要一上来就套通用解析模板。
3.3 功能码的语义拆分:哪些是扫描、哪些才是破坏
Modbus功能码定义了很多,但取证分析重点关注这四类:
- 读操作类:01(读线圈)、02(读离散输入)、03(读保持寄存器)、04(读输入寄存器)
- 正常场景:SCADA系统周期性轮询。
- 异常场景:短时间内对大量地址发起连续读请求,通常是攻击者在做资产测绘和数据收集,属于"踩点"行为。
- 写操作类:05(写单线圈)、06(写单寄存器)
- 正常场景:工艺参数调整、设备启停。
- 异常场景:对非预期地址的写操作,或者频繁修改某一关键参数。
- 写多寄存器类:15(写多线圈)、16(写多寄存器)
- 正常场景:下装组态、批量参数设置。
- 异常场景:一次写入大量寄存器,且数据区内容超出工艺允许范围,这是破坏性攻击中常见的"一键覆盖"方式。
- 诊断/文件类:08(诊断)、23(读写多寄存器)、43(读设备标识)
- 这些功能码平时很少出现在正常轮询里,如果出现,往往是攻击者在对设备做指纹识别。尤其是43功能码,可以读到设备厂商、产品代码、版本号,是针对性攻击前的重要侦察手段。
我在分析时,会先把PCAP里的功能码分布统计出来。正常Modbus现场的轮询流中,读功能码占比应该在95%以上;写功能码频繁出现本身就值得警觉。一个把所有功能码统计和具体时间关联起来的"功能码时序图",经常能直接看出攻击者的行为模式。
3.4 功能码的边界情况和异常组合
有些人以为Modbus报文只要功能码合法、CRC通过,就代表设备接受了操作。但实际排查中我遇到过一种比较隐蔽的情况:攻击者发送功能码06的写单个寄存器请求,数据区内写入的值和原值相同。这种"空写"从功能上看没有改变任何参数,但会刷新设备的状态位或触发某些设备的写保护锁存逻辑。
这种攻击很难通过"只看最终工艺参数是否变化"来发现。所以,做取证不能只对比跳变值,还要关注请求次数和写入频率的异常。一个寄存器被反复写入相同值几百次,这绝不是一个正常工程师会干的活。
4. 基于PCAP的流量取证实操:从握手到异常操作码的全链路还原
前面讲的都是协议知识,但纸上谈兵没有用,真正落地还是得对着PCAP干活。这一节我把自己常用的分析流程写下来,尽量具体到能照做。
4.1 抓包前的准备:如何判断该抓全流量还是抽样
工业环境做取证经常面临一个矛盾:全流量保存成本高、周期长,抽样保存又怕漏掉关键攻击帧。我的建议是分两级:
- 长期镜像:在核心交换机上做端口镜像,保存PCAP,时间可以到30~90天。如果存储不够,至少保留报文头的摘要信息(IP、端口、功能码、时间戳)。
- 事件触发抓包:如果IDS或主机安全设备产生了告警,立刻对相关网段做针对性抓包,这个包不需要大,但必须是原始PCAP。
实际案件中,长期镜像的价值远大于事后补救。我见过一个案例,攻击者在破坏前一个月就开始做小流量探测,每次动作很小,单看一天根本看不出问题,但拉长到一个月的时间线,从探测到利用到清除痕迹的三阶段脉络就非常清晰了。
4.2 如何用tshark和Wireshark高效过滤Modbus流量
Wireshark对Modbus TCP的解析非常成熟,加装modbus插件的话功能更强。但如果PCAP文件特别大,直接在GUI里点来点去效率太低,我习惯先用tshark过一遍:
# 只看502端口的Modbus TCP流量 tshark -r capture.pcap -Y "tcp.port == 502" # 过滤出所有Modbus写操作(功能码05、06、15、16) tshark -r capture.pcap -Y "modbus.func_code == 5 || modbus.func_code == 6 || modbus.func_code == 15 || modbus.func_code == 16" # 按功能码统计数量 tshark -r capture.pcap -q -z "modbus,tcp" # 过滤特定从站地址的功能码16写请求 tshark -r capture.pcap -Y "modbus.unit_id == 10 && modbus.func_code == 16"注意,如果抓到的报文是Modbus RTU,Wireshark默认不能直接解析,需要先用工具把串口二进制流转换为可以导入Wireshark的格式。我常用的方案是先用serialdump或tcpdump把串口数据抓成二进制文件,再用modbus_rtu_cap这类python脚本转成pcapng,或者直接在Wireshark里通过"从十六进制转储导入"功能导入。
4.3 还原攻击链路的四个关键步骤
以一次典型的"扫描-写入-破坏"攻击为例,流量侧还原分四步:
第一步:资产发现行为分析先看是否存在大范围的Modbus TCP扫描,特征是对多个IP的502端口发起TCP握手,但很快就断开。这时候抓到的全是请求,没有响应,因为很多PLC/RTU的Modbus服务即使开放也不会主动响应无效请求。这种扫描的源IP很可能就是攻击者的跳板机。
第二步:定位首次写寄存器操作用功能码过滤找到第一次写操作。很多攻击脚本的"试错"阶段会先写某个寄存器验证能不能成功,再写真正破坏的寄存器。这个"首次写"和"破坏性写"之间的时间差非常关键,如果能在主机侧日志里找到对应时间的进程启动记录,就可以把攻击者工具链完整拉出来。
第三步:提取写入值并与正常基线对比把写操作的寄存器地址、数据值全部提取出来,与正常工艺参数范围做基线对比。比如一个水处理系统的加药泵频率正常设定范围是20-50Hz,攻击者写入的数值是9999,这个值远超工艺允许范围,大概率是恶意操作。这里还要注意转换逻辑,有些值是二进制位串、有些是BCD编码,务必按设备的实际映射解析。
第四步:梳理时间线,生成证据链把TCP流、功能码、寄存器地址、响应码合并成一条时间线。我一般会用Excel或Python脚本整理成如下表格:
| 时间戳 | 源IP | 目的IP | 功能码 | 寄存器地址 | 写入值 | 响应码 | 事件备注 |
|---|---|---|---|---|---|---|---|
| 2025-05-11 03:22:01.123 | 192.168.10.50 | 192.168.10.101 | 03 | 0x0000-0x0064 | - | 0x00 | 扫描PLC地址范围 |
| 2025-05-11 03:22:03.456 | 192.168.10.50 | 192.168.10.101 | 16 | 0x0064 | 0x0000 0x270F | 0x00 | 写入频率设定值9999 |
这么一张表,比任何文字描述都有说服力。
4.4 响应码也是证据:异常响应的取证价值
很多人只关注请求帧,把响应帧晾在一边。其实异常响应也是重要取证点。Modbus的异常响应帧会在功能码的最高位置1(比如0x86表示对功能码06的异常响应),并附带异常码:
- 0x01:非法功能码
- 0x02:非法数据地址
- 0x03:非法数据值
如果某个IP持续向设备发送请求,并收到大量非法地址异常响应,说明攻击者正在探测寄存器映射。这种"扫描-失败-再扫描"的行为模式,是判断攻击意图的强证据。反过来,如果攻击者已经拿到了设备点位表,发出的写请求全部成功,响应码全是0x00,说明他不只是在试错,而是有明确的破坏目标。
5. 主机侧痕迹挖掘:寄存器读写记录与进程行为的时间线串联
光看流量,你只能看到"有人通过IP 192.168.x.x改了寄存器",但看不到"谁在操作那台电脑"。除非你有MAC地址到交换端口的绑定信息,否则很难把IP对应到具体的人。这时候就要把视线转到主机侧。
5.1 工控主机上的关键痕迹位置
现场工程师站、操作员站通常跑的是Windows系统,攻击者如果通过RDP、VNC远程接入,或者直接在主机上执行恶意脚本,会留下多种痕迹:
- 进程执行痕迹:利用Windows事件日志中的4688(进程创建)记录,可以还原攻击者在主机上运行了哪些工具。如果系统开启了命令行参数记录,还能看到具体的脚本命令。
- Prefetch文件:记录程序运行痕迹,列出攻击者可能用过哪些exe工具。
- RDP登录日志:Windows事件ID 4624(登录成功)和4778/4779(RDP会话连接/断开),结合源IP可以判断是否有外部远程接入。
- 临时文件和脚本:攻击者为了批量发送Modbus报文,通常会在主机上放Python脚本、工具压缩包、甚至编译好的exe。这些文件往往没有经过正规软件签名,在文件系统里非常扎眼。
我做主机取证时,会先把主机上的进程创建记录和流量PCAP做的功能码时间线对齐。如果某个时间点有进程创建,紧接着PCAP里出现Modbus写操作,这两条证据链一拼,就能成闭环。
5.2 从内存中提取Modbus扫描/写入工具
这个点其实是从"Netscan内存取证"这类思路里迁移过来的。如果攻击工具只在内存中运行,或者操作完之后立刻删除自身,磁盘里可能找不到任何可疑文件。但只要你把内存镜像拿到手,就能做一次"进程内存字符串扫描",找Modbus相关的特征:
- 功能码数组:工具内部大概率会有
01 02 03 04 05 06 15 16这类硬编码字节序列。 - 寄存器地址表:攻击者可能把要写入的寄存器地址预先存储在内存中。
- IP端口字符串:如果工具是Python脚本,内存里会有
502、modbus_tk、pymodbus等字符串。
实际操作中,我会先用Volatility或MemProcFS把内存镜像里的进程列表导出来,然后针对可疑进程dump内存,再用strings命令配合正则搜索502端口和功能码特征。这个方法在好几起工控事件里都起了大作用,比单纯依赖文件系统扫描可靠得多。
5.3 串口下发场景的取证:没有网络流量怎么查
不是所有Modbus流量都能在网络层抓到。很多老旧工控现场,上位机通过USB转RS-485线和PLC通信,攻击者如果直接操作那台上位机,或者插一个自己的USB串口适配器到现场总线上,你从交换机上根本抓不到任何东西。
这种场景的取证思路要变一下:
- 查USB设备使用痕迹:Windows注册表里的
SYSTEM\CurrentControlSet\Enum\USB可以查看曾经连接过的USB转串口设备。如果出现了一个案发时间段内新增的USB串口设备,而现场工程师表示没人动过,这就值得深挖。 - 查串口软件的使用记录:Modbus Poll、ModScan、串口调试助手这类工具,会在注册表或配置文件中留下最近的串口参数(波特率、数据位、校验位)。通过比对现场PLC的实际配置,可以判断是否被第三方工具碰过。
- 查PLC程序的下载记录:有些PLC(如Siemens S7系列)在程序块里有时间戳信息,但Modbus RTU的设备大多没有这种审计功能,所以PLC本身很难提供"谁动过它"的证据。
这个方向往往是最难的,也是最容易被忽略的。建议做现场检查时永远不要只盯着网络流量,把工控主机上的串口配置、USB历史、软件安装记录一并带走。
6. 取证过程中的常见陷阱与误判场景
最后这部分,我想把那些在真实案件里踩过、见过、听同行吐槽过的"坑"集中写出来,帮大家少走弯路。
6.1 陷阱一:把TCP重传当攻击行为
Modbus TCP建立在TCP之上,TCP的重传机制本来是为了可靠性而存在的。但在工控现场,网络抖动、交换机丢包会导致大量TCP重传。如果你只按功能码过滤,没看到DUP ACK标志,很容易把一段正常通信中因为丢包重传的写寄存器请求当成"攻击者重复发送写指令"。
判断方法:在Wireshark里看TCP的序列号和确认号。重传报文的TCP序列号会和原始报文相同,时间间隔通常在几百毫秒内。真正攻击者的连发写操作,每一帧的TCP序列号都是递增的,不会存在完全相同的重复帧。
6.2 陷阱二:把工程师的例行维护当成恶意行为
这是工业取证里最容易犯错的一点。工控系统不像办公网,一切看起来"异常"的操作不一定就是攻击。现实里有很多合法但同样"不合常规"的操作:
- 工程师利用下班时间远程改参数,因为产线停机窗口只有那时候。
- 设备厂商的技术支持通过网络远程调试,可能会连续读写大量寄存器。
- 组态软件更新时,会自动批量写入参数,功能码15/16的使用频率可能暴增。
面对这种情况,我的做法是先建立"白名单行为基线":找现场工程师确认哪些IP是可信的、哪些时间段会有正常的批量操作、哪些软件在特定操作时会产生大流量写操作。只有在白名单之外的异常,才进入真正的攻击分析流程。没有基线就下结论,迟早要出丑。
6.3 陷阱三:寄存器数据的类型解析错误导致漏报
前面提到的字节序问题,这里再敲一次黑板。Modbus寄存器是以16位为单位的,32位浮点数、32位整数、64位整数在寄存器里的排列方式各有不同。更麻烦的是,很多PLC厂商在具体实现时并不完全严格遵循标准字节序。同一台设备,同一组寄存器,你在Wireshark里看到的十六进制值和设备实际监控界面显示的值,可能完全不一样。
解决方案:写操作取证时,不要只看原始值,必须把原始寄存器值和设备监视画面对应起来。如果可能,把正常历史数据中同一组寄存器的值和现场工艺参数做回归,反推设备在项目中被配置的字节序格式。这一步做扎实了,对"写入值到底有没有越界"的判断才算有根据。
6.4 陷阱四:忽略时间同步问题
最后这个坑,特别隐蔽,也特别致命。工控系统里PLC、上位机、交换机的时钟往往不同步,PCAP包的时间戳来自抓包电脑,主机日志时间戳来自主机本身,如果两个时间源差了几个小时甚至几天,你做时间线关联基本上等于白做。
我在每个案件开始的时候,都会先做一次时间偏差排查:
- 把抓包主机的系统时间与NTP服务器比对,记录偏差。
- 把主机的时间与PCAP里的TCP时间戳做个交叉验证。
- 如果发现时间偏差超过5分钟,就必须在时间线上做校正,或者寻找一个"已知事件锚点"(比如某个告警日志里同时记录了主机时间和网络设备时间),反向推算偏差。
如果两个时间源差了几个小时甚至几天,时间线关联就没有任何意义。这类问题一旦在前面几步没发现,后面所有分析结论都可能被推翻。
7. 关于工具链的选型心得
内容写到这儿,协议分析和取证思路都过了一遍,最后说说工具的问题。很多人一上来就问"哪个工具最强",我的经验是工具永远服务于你的分析流程,选工具之前先把流程定下来。
我个人常用的组合是:
- 流量侧:Wireshark + tshark作为主力,额外的脚本用Scapy写,处理超大PCAP再用
editcap切片。Modbus TCP解析Wireshark原生支持,Modbus RTU需要转换,我用自己写的Python脚本把串口日志转成pcapng。 - 主机侧:KAPE用于收集,Velociraptor做远程取证,Volatility做内存分析,配合
strings和grep做特征搜索。 - 时间线分析:Timeline Explorer或自定义的Python脚本,把EVTX、文件时间、PCAP三源合一。
但请注意,工具再好,也要有协议功底撑着。如果你不知道Modbus功能码的语义,不知道异常响应码的取证价值,不知道寄存器字节序的坑,再贵的商业取证软件也帮不了你。反过来,协议理解到位了,用开源工具一样能做出漂亮的案件分析报告。
如果你刚接触这块,我建议第一步不是去下载各种收费软件,而是先找一份包含Modbus TCP流量的公开PCAP,用Wireshark把每一个字段都点开看看,再对照本文第二、三节的内容自己动手解析几帧,同时找一份工控主机镜像练手内存取证。纸上得来终觉浅,这些话一点不虚。把基础功打牢了,后面再到真实案件里,你才会有底气对自己说:这个流量是扫描,这个写操作是破坏,这两个时间点之间是一条完整的攻击链。