在上一篇文章中,我们介绍了S7Comm协议的S7Comm Header和Job 和 Ack_Data机制。本篇文章,我们将继续介绍S7Comm协议的Userdata 协议拓展并结合pcap流量包实际分析。
UserData 用于编程/调试、读取 SZL、安全功能、时间设置,循环读取等。
Parameter 结构如下:
转换工作模式(Mode-transition 0x0)
当功能组为转换工作模式(Mode-transition)时,请求报文中是没有 Data 部分的,而主要起作用的是子功能码(Subfunction),常见的子功能码有:
程序员命令(Programmer commands 0x1)
程序员命令(Programmer commands)主要是工程师用于编程或调试,比如:监视/修改变量、读取修改诊断数据。所有的子功能码有:
请求报文的结构如下:
响应报文结构如下:
块功能(Block functions 0x3)
块功能(Block functions)是用于操作块,所有的子功能码有:
CPU功能(CPU functions 0x4)
CPU 功能(CPU functions)是用于操作块,所有的子功能码有:
子功能码有4种不同的功能类型:
系统状态列表(德语:System-ZustandsListen,英语:System Status Lists)用于描述可编程逻辑控制器的当前状态。SZL的内容只能通过信息功能进行读取,而不能修改。换言之,部分列表是虚拟列表,只在有特殊请求时由CPU的操作系统所创建。
系统状态列表包含下列内容的有关信息:
如果要读取系统状态列表,则需要使用参数 SZL-ID 和 INDEX 指定要读取的内容。比如:读取 PLC 的名称,那 SZL-ID 是 W#16#011C,INDEX 是 W#16#0001
每个部分系统状态列表都有一个编号。可以根据编号输出完整的部分列表或摘录。预定义了可能的部分列表摘录,并由一个数字标识。SZL-ID 由部分列表的编号、部分列表摘录的编号和模块等级组成。
请求报文的 Data 结构如下:
响应报文 Data 结构如下:
消息服务(Message service)主要用于订阅事件,比如:切换工作模式事件、系统诊断事件等。
请求报文的 Data 结构如下:
响应报文 Data 结构如下:
诊断消息(Diagnostic message)通常是诊断缓冲区中的数据
请求报文的 Data 结构如下:
每个事件都分配有事件 ID,而事件 ID 的结构如图
那事件 ID 的内容,包括:
在这里,把 ALARM_8 显示(0x05)、NOTIFY 显示(0x06)、ALARM_8 锁定(0x07)、ALARM_8 取消锁定(0x08)、SCAN 显示(0x09)、ALARM 确认(0x0b)、ALARM 确认显示(0x0c)、ALARM 锁定显示(0x0d)、ALARM 取消锁定显示(0x0e)、ALARM_SQ 显示(0x11)、ALARM_S 显示(0x12)、ALARM 查询(0x13)、NOTIFY_8 显示(0x16)共13个子功能归纳为告警信息。
请求报文的 Data 结构如下:
* 1 (1 byte) : 返回码(return code);
* 2 (1 byte) : 数据传输大小(Transport sizes);
* 3 (2 bytes) : 以此往后的数据长度;
* 4 (1 byte):功能标识(Function identifier);
* 5 (1 byte):消息对象个数(Number of message objects);
* 6 (varibale byte):Message Object 1;
* 1 (1 byte):Variable specification;
* 2 (1 byte):以下规范地址的长度(Length of following address specification);
* 3 (1 byte):Syntax Id;
* 4 (1 byte):Unknown;
* 5 (1 byte):查询类型(Querytype),类型有:
* 0x01:告警类型(ByAlarmtype);
* 0x03:事件ID(ByEventID);
* 0x08:Unknown;
* 0x09:Unknown;
* 6 (1 byte):Unknown;
* …
* …
响应报文 Data 结构如下:
* 1 (1 byte) : 返回码(Return code);
* 2 (1 byte) : 数据传输大小(Transport sizes);
* 3 (2 bytes) : 以此往后的数据长度;
* 4 (1 byte):功能标识(Function identifier);
* 5 (1 byte):消息对象个数(Number of message objects);
* 6 (1 byte) : 数据传输大小(Transport sizes);
* 7 (2 bytes) : 完整数据长度,也就是以此往后的数据长度;
* 8 (varibale byte):Message Object 1;
* 1 (1 byte) :长度(Length of dataset);
* 2 (2 bytes):Unknown;
* 3 (1 byte):告警类型(Alarmtype);
* 4 (4 bytes):事件ID;
* 5 (1 byte):Unknown;
* 6 (1 byte):事件状态(EventState);
* 7 (1 byte):AckState going;
* 8 (1 byte):AckState coming;
* …
* n (varibale byte):Message Object n;ALARM 显示、ALARM 锁定/解锁、ALARM 确认、NOTIFY 显示
往往这类报文都是以PUSH的形式存在, Data 结构如下:
* 1 (1 byte) : 返回码(Return code),具体的可参考6.6;
* 2 (1 byte) : 数据传输大小(Transport sizes),具体可参考6.4.2;
* 3 (2 bytes) : 以此往后的数据长度;
* 4 (8 bytes):事件时间,如果subfunc是0x09,那长度为2 bytes;
* 5 (1 byte):功能标识(Function identifier);
* 6 (1 byte):消息对象个数(Number of message objects);
* 7 (varibale byte):Message Object 1;
* 1 (1 byte):Variable specification;
* 2 (1 byte):长度(Length of following address specification);
* 3 (1 byte):Syntax Id,常见的结构标识可参考6.5;
* 4 (1 byte):相关值数目(Number of associated values);
* 5 (4 bytes):事件ID;
* `6 (1 byte):事件状态(EventState);`
* `7 (1 byte):状态(State);`
* `8 (1 byte):AckState going;`
* `9 (1 byte):AckState coming;`
* `10 (varibale bytes):Associated value 1;`
* `1 (1 byte) : 返回码(Return code);`
* `2 (1 byte) : 数据传输大小(Transport sizes);`
* `3 (2 bytes) : 长度;`
* `4 (varibale bytes):Data;`
* `...`
* `n (varibale bytes):Associated value n;`
* …
* n (varibale byte):Message Object n;
安全功能(Security 0x5)
安全功能(Security)是用于安全设置,比如:设置 PLC 密码,所有的子功能码有:
请求报文的 Data 结构如下:
响应报文 Data 结构如下:
PBC BSEND/BRECV 0x6
时间功能(Time functions 0x7)
时间功能(Time functions)是用于时间设置,比如设置时间,所有的子功能码有:
读取时间的 Data 结构如下:
设置时间的 Data 结构如下:
这里我们使用snap7本地模拟相应的请求流量,并抓包查看。
块功能(Block functions 0x3)
CPU功能(CPU functions 0x4)
安全功能(Security 0x5)
Data 是 64 67 02 06 62 65 17 10
* 第1位:0x64 ^ 0x55 = 0x31,则值是1;
* 第2位:0x67 ^ 0x55 = 0x32,则值是2;
* 第3位:0x02 ^ 0x55 ^ 0x64 = 0x33,则值是3;
* 第4位:0x06 ^ 0x55 ^ 0x67 = 0x34,则值是4;
* 第5位:0x62 ^ 0x55 ^ 0x02 = 0x35,则值是5;
* 第6位:0x65 ^ 0x55 ^ 0x06 = 0x36,则值是6;
* 第7位:0x17 ^ 0x55 ^ 0x62 = 0x20,则值是 (空);
* 第8位:0x10 ^ 0x55 ^ 0x65 = 0x20,则值是 (空);
时间功能(Time functions 0x7)
本文,我们分析了S7Comm协议的Userdata 协议拓展部分。通过与pcap流量包的结合分析,可以更加直观的了解其原理和交互过程,学习S7Comm协议对于工控安全非常重要,在之后的文章里,我们还将继续学习modbus和Ethernet/IP协议相关内容。
本文作者 r0fus0d
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。