浅析UMAS协议

 

1、概述

UMAS (Unified Messaging Application Services) 统一消息传递应用程序服务,它是用于交换应用程序数据的平台独立协议,通信数据使用标准的Modbus协议。ModbusModicon公司在1979年开发的基于消息结构的协议,最早是为Modicon公司的PLC中使用,后为施耐德电气公司所有。Modbus协议是现今使用的最早和应用最广泛的工业控制系统协议之一,主要是用于和现场控制器通信的应用层协议,共有三种工作模式:Modbus/ASCIIModbus/RTU,和Modbus/TCP

Modbus协议标准是公开的,其众多功能码早已广为人知,在此不做赘述。但其标准文档中也提到了一些未公开、且为占用状态的功能码,90功能码(0x5A)即为其中一个,UMAS协议即为90功能码的Modbus

 UMAS协议为施耐德电气私有的、用于对其PLC产品进行配置和监控等操作,通过查阅,发现未有相关详细描述文档,因此,本文的主要目的即是对UMAS进行基本研究和归纳,不当之处望指正。UMAS协议的基本结构如下图所示:

2、UMAS协议功能码

UMAS协议即为0x5A功能码的Modbus协议,其通信数据在Wireshark中的识别情况如下图:

功能码全部显示为Unity(Schneider)(90),那么,UMAS有功能码吗?进一步观察Data部分,在Wireshark中其隶属于Modbus部分且未能被详细解析,而恰好此部分即为UMAS所特有的,本节内容所讨论的UMAS功能码并非Modbus协议中的功能码,而是指UMAS特有部分中的功能码,其与PLC的各种配置,包括:PLC读、写、运行/停止、数据上传/下载等操作密切相关。

UMAS协议功能码的梳理与总结,源于对相关DLL文件的分析和对与PLC通信数据分析总结而来,测试中使用了Schneider M340 PLC,在没有PLC的情况下,可使用上位机软件Unity Pro XL(后来软件更名为EcoStruxure Control Expert)自带的仿真器代替PLC进行通信。

安装Unity Pro软件后,通过对特定DLL文件进行分析,可以发现逆向源码中即对协议的名称描述即为UMAS,相关的对PLC特定操作亦可以快速定位到:

结合代码分析和通信数据,UMAS相关功能码和基本含义总结如下:

UMAS功能码

序号

功能码

含义

1

0x01

INIT_COMM

建立UMAS通信

2

0x02

READ_ID

请求PLC ID

3

0x03

READ_PROJECT_INFO

读取PLC中工程信息

4

0x04

READ_PLC_INFO

读取PLC内部信息

5

0x06

READ_CARD_INFO

读取PLC SD卡信息

6

0x0A

REPEAT

回传发送给PLC的数据

7

0x10

TAKE_PLC_RESERVATION

独占PLC

8

0x11

RELEASE_PLC_RESERVATION

释放PLC

9

0x12

KEEP_ALIVE

保持连接

10

0x20

READ_MEMORY_BLOCK

准备读取PLC内存块

11

0x22

READ_VARIABLES

bit/word方式读系统变量

12

0x23

WRITE_VARIABLES

bit/word方式写系统变量

13

0x24

READ_COILS_REGISTERS

PLC的线圈/寄存器值

14

0x25

WRITE_COILS_REGISTERS

PLC的线圈/寄存器值

15

0x26

ENABLE/DISABLE DATA DICTIONARY

启用/关闭数据字典功能

16

0x30

INITIALIZE_UPLOAD

初始化数据上传(From PLC

17

0x31

UPLOAD_BLOCK

上传PLC数据

18

0x32

END_STRATEGY_UPLOAD

完成数据上传

19

0x33

INITIALIZE_DOWNLOAD

初始化数据下装(To PLC

20

0x34

DOWNLOAD_BLOCK

下载数据到PLC

21

0x35

END_DOWNLOAD

完成数据下载

22

0x36

CREATE/RESTORE/REMOVE BACKUP

创建/恢复/删除内存卡中的数据备份

23

0x39

READ_ETH_MASTER_DATA

Read Ethernet Master Data

24

0x40

START_PLC

运行PLC

25

0x41

STOP_PLC

停止PLC

26

0x50

MONITOR_PLC

监视PLC变量

27

0x58

CHECK_PLC

检查PLC连接状态

28

0x70

READ_IO_OBJECT

IO目标

29

0x71

WRITE_IO_OBJECT

IO目标

30

0x73

GET_STATUS_MODULE

获取状态模块

 

3、UMAS协议数据分析

使用Unity Pro连接M340 PLC进行一些列操作,抓取通信过程数据,可对功能码进行对照分析。对于UMAS协议,有一点需要明确的是它是一种应/答式的通信协议:包含某种功能码的数据发送到PLCPLC对请求解析后按照固定格式回应数据。UMAS的请求与响应数据基本格式如下所示:

请求:

[ TCP Packet ] – [ Modbus Header ] – [5A] – [ UMAS CODE (16 bit) ] [ UMAS PAYLOAD (Variable) ]

响应:

[ TCP Packet ] – [ Modbus Header ] – [5A] – [ RETURN CODE (16 bit) ] [ UMAS PAYLOAD (Variable) ]

[RETURN CODE]即为状态码部分,存在两种可能性:0x01 0xFE–意味着OK

0x01 0xFD–意味着Error

功能码0x01:建立通信,抓取的实际建立通信的数据将为:

响应数据包为:

功能码0x03:读取PLC中工程信息,抓取的实际建立通信的数据将为:

响应数据包为:

响应数据包的基本格式为:

[ TCP Packet ] – [ Modbus Header ] – [5A] – [ Response Code (16) ] –  [ Unknown (9 bytes) ] –  [ Unknown 2 (9 bytes) ] –

[ Modification date (8 bytes) ] – [ Modification date Rep (8 bytes) ] – [ Project Version (16) ] – [ Unknown (16) ] –

[ Project Name length (8) – [ Project name (variable) ]

状态码之后连续两个9字节数据意义不明确,df 07按照小端数据换算过来即为2015,即工程修改时间为2015年;工程版本为0.0.01

功能码0x40/0x41:启动/停止PLC

启动PLC的请求数据为:

UMAS CODE部分为00 40,不同情况下使用01 40亦可以启动PLC运行(与PLC固件版本相关)。

相应的停止PLCUMAS CODE部分为00 4101 41均可。尝试对Schneider M340 PLC发送启/停数据包,验证数据格式及功能的可行性,如下所示:PLC被停止后,其run灯变为闪烁状态(并非熄灭):

结合对UMAS功能码的理解,尝试编写数据解析插件并对数据包解析,可得到如下效果:

请求数据包:

回复数据包:

4、总结

本文基于对施耐德组态软件Unity Pro的关键DLL分析和对上位机与PLC通信数据分析,梳理总结了UMAS协议基本功能码,同时尝试编写Wireshark解析插件以方便数据包分析,验证了插件的可用性和数据的正确性。

 

参考资料:

[1] https://modbus.org/docs/Modbus_Application_Protocol_V1_1b3.pdf

[2] https://www.trustwave.com/en-us/resources/blogs/spiderlabs-blog/vulnerabilities-in-schneider-electric-somachine-and-m221-plc/

[3] https://www.lshack.cn/827/

[4] https://www.cnblogs.com/zzqcn/p/4840589.html

(完)