首页
论坛
课程
招聘
[原创]西门子S7comm协议Read SZL解析
2021-1-8 14:52 5055

[原创]西门子S7comm协议Read SZL解析

2021-1-8 14:52
5055

背景

S7Comm全称S7 Communication ,是西门子为了多个PLC之间、SCADA与PLC之间的通信而设计的专属协议,在西门子S7-300 / 400系列、S7-200系列、S7-200 Smart系列上应用。S7-1200和S7-1500系列采用带有加密签名的S7CommPlus协议。关于S7comm协议的解析有很多文章描述,但对该协议后期添加的Userdata部分的介绍较为匮乏,本文主要介绍S7Comm协议的Userdata部分的Read SZL子功能码的解析及其在安全产品中的应用。

S7Comm简介

为了文章的完整性,先介绍S7Comm协议的模型及其PDU类型。S7Comm以太网协议基于OSI模型下表所示。
图片描述
S7Comm协议的TCP/IP实现依赖于面向块的ISO传输服务,S7Comm协议被封装在TPKT和ISO-COTP协议中,这使得PDU(协议数据单元)能够通过TCP传送。
图片描述
S7Comm PDU包含三个主要部分:
标头:包含长度信息,PDU参考和消息类型常量
参数:内容和结构根据PDU的消息和功能类型有很大不同
数据:这是一个可选字段,用于存储数据,例如内存值,块代码,固件数据等。

 

标头部分报文信息如下,包含了协议ID,消息类型,保留字段,PDU参考,参数长度,数据长度。其中有些报文中还包含了错误类(Error class)和错误代码(Error code)。
图片描述
消息类型:PDU类型,一般有以下值:
 0x01:JOB
即作业请求,如,读/写存储器,读/写块,启动/停止设备,设置通信
 0x02:ACK
即确认,这是一个没有数据的简单确认
 0x03:ACK_DATA
即确认数据的响应,一般是响应JOB的请求
 0x07:USERDATA
即扩展协议,其参数分段包含请求/响应ID,一般用于编程/调试,读取SZL等

UserData类型介绍

当PDU类型为UserData时S7Comm协议的结构如下图所示,S7Comm的参数部分为蓝色,展开描述:参数头3字节,参数长度1字节,方法字段1字节,类型字段半字节,功能组半字节,子功能码1字节,序号1字节。
图片描述
常见的功能群组,如下表所示
图片描述
以下针对功能组中的0x4 CPU功能的子功能码如下表所示
图片描述
以下进入到我们重点讲述的CPU功能码(0x4)中的0x01 Read SZL读取系统状态列表。

Read SZL详解

系统状态列表(德语:System-ZustandsListen,英语:System Status Lists)用于描述PLC的当前状态,系统状态列表的内容只能读取不能修改。系列状态列表包含了如下信息:
 系统数据
 模块状态数据
 模块诊断数据
 模块诊断缓冲区信息
系统状态列表的请求报文结构,如下,其中header头与parameter部分与上文描述一致,parameter部分的功能组为0x4,子功能码为0x01,在此着重展示Data部分(黄色标识)。
图片描述
系统状态列表的响应报文结构,如下
图片描述

 

以上报文结构中出现了SZL-ID字段,该字段标识每个状态列表部分的代码编号,利用该编号与紧接的SZL-index可索引出完整的列表或者摘录。SZL-ID由部分列表的编号、部分列表摘录编号和模块等级组成。结构如下图
图片描述
模块等级如下所示
图片描述
对于CPU模块从12~15bit填充的0000,因此后续对于CPU模块的SZL请求组装报文时该部分均为0。
部分列表摘录编号,该字段的含义取决于特定的系统状态列表,有的状态列表该字段为2#0001,有的为2#0000,也会出现2#1111,具体取决于读取的状态列表。
部分列表的编号,该字段表示要索引的系统状态列表,也可以理解为要读取的具体向导码。
下表列出了可能使用到的编号,该表中是一个合集,有的编号在具体的CPU模块中可能失效,如利用W#16#xy75 (Switched DP slaves in the H-system)访问普通的CPU模块是不成功的。
图片描述
图片描述

 

在报文结构中也包含了SZL-index字段,该字段与SZL-ID配合索引到具体要读取的详细系统状态列表,可以理解为索引子编号或地址。该字段根据不同的SZL-ID有不同的取值,如W#16#0001,W#16#0000等。

 

以上将SZL的报文结构及其关键的字段SZL-ID和SZL-index做了介绍。接下来,结合实战练习,深入理解报文交互过程。选取经常使用的模块标识 、运行状态、CPU的诊断缓冲区状态列表介绍。

模块标识

配置如下SZL-ID和SZL-index可获取到不同的模块资产信息。
图片描述
如下图为读取CPU全部信息的请求报文
图片描述
响应报文中包含了CPU模块的所有信息:模块订货号6ES7 315-2EH14-0AB0(绿色框体内),模块固件版本V3.2.17(黄色框体),模块BootLoader版本37.12.12(蓝色框体)。
图片描述

 

如下图为读取CPU订货号的请求报文,SZL-ID为0x0111,SZL-index为0x0001
图片描述
对应的响应报文如下,包含了订货号信息6ES7 315-2EH14-0AB0
图片描述

运行状态

配置如下SZL-ID和SZL-index可获取模块的运行状态信息,如模块当前处于RUN、STOP等状态。
如下图为读取CPU当前运行状态的请求报文,SZL-ID为0x0424,SZL-index为任意值均可,此处为0x0000;
图片描述

 

对应的响应报文如下所示,在该时刻下CPU的运行状态为RUN,对应的代码为0x08;STOP运行状态对应的代码为0x03;
图片描述

CPU诊断缓冲区

配置SZL-ID=0x00a0和SZL-index为任意值,可获取模块的诊断缓冲区信息,该处存放着模块的诊断事件和操作事件。

 

如下图为请求报文
图片描述
对应的响应报文如下所示,如若诊断缓冲区的内容较多,则CPU模块需要多次回应才可处理完成。响应报文中包含有事件总数,事件代码及其对应描述,事件发生时间戳。
图片描述

 

以上仅列举了常用的几种类型的系统状态列表读取的报文分析,其余的状态列表还囊括了更大的信息量,比如SZL-ID为0x0232/SZL-index为0x0004时,为获取模块的保护级别,其中包含有密码信息。

Read SZL在安全产品中的应用

在工控安全产品中,有的产品需要对工业现场的设备做出识别,设备状态做出识别,这时候就需要针对不同厂商的设备及其资产做研究,利用何种方案去识别不同厂商的资产及状态。本文提出的S7Comm中Read SZL子功能码就可以解决针对S7-300/S7-400系列产品的这个问题,利用实战示例中的模块标识和运行状态对应的功能码字段可获取到资产信息及其资产运行状态,利用SZL列表中CPU诊断缓冲区功能码字段可读取资产的内部事件,可以作为资产健康度和资产审计使用。利用资产保护等级功能码字段可获取到设备的加密状态等等。因此,SZL功能码的诞生对于做资产信息收集的产品来说无疑是一个福音,像是一个外部接口,只需要研究清楚接口调用就能轻松获取资产的信息。
是不是还担心万一模块加密了上了三级密码了,Read SZL功能就不灵验了?此处回答:NO。S7-300/S7-400系列的密码为三级保护,设置了三级保护需要在读写时验证权限,但是对于SZL这种读取状态列表的操作功能则不需要。对于操作对象/功能/数据块之类就需要权限验证,如若权限不当则返回相应错误代码。

总结

本文对S7Comm协议中Userdata部分的Read SZL功能做了详细剖析,目的在于让这个显得极为复杂的但是又经常被我们使用的角色走向台前,让更多人的认识并了解它,在以后安全产品的预研及其设计过程中多一个思路,也可以让工控厂商在设计自己产品时学习‘老大哥’的这种做法,开放更多本体信息的接口,为正在走向我们的工业互联趋势做准备,有了这个接口,不仅可以获知资产信息、资产健康度,也可以与安全产品联动做到防护与控制相结合,做到安全生产,健康运营。


[看雪官方培训] Unicorn Trace还原Ollvm算法!《安卓高级研修班》2021年6月班开始招生!!

收藏
点赞1
打赏
分享
最新回复 (3)
雪    币: 1484
活跃值: 活跃值 (348)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
wx_Dispa1r 活跃值 2021-1-12 09:08
2
0
感谢分享!
雪    币: 213
活跃值: 活跃值 (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dongshan 活跃值 2021-1-12 14:11
3
0
cool! 3ks
雪    币: 2938
活跃值: 活跃值 (508)
能力值: ( LV11,RANK:185 )
在线值:
发帖
回帖
粉丝
MTRush 活跃值 1 2021-1-15 09:40
4
0
get
游客
登录 | 注册 方可回帖
返回