西门子通信协议 S7CommPlus V0.1

释放双眼,带上耳机,听听看~!

西门子通信协议 S7CommPlus V0.1

1 S7CommPlus协议结构

S7CommPlus是西门子专有的协议,是西门子S7通讯协议簇里的一种。目前支持的设备有 S7-1200 V3.0以上的固件版本以及S7-1500 所有的固件版本。

S7CommPlus协议的TCP/IP实现依赖于面向块的ISO传输服务。S7协议被封装在TPKT和ISO-COTP协议中,这使得PDU(协议数据单元)能够通过TCP传送。

它用于PLC编程,在PLC之间交换数据,从SCADA(监控和数据采集)系统访问PLC数据以及诊断目的。

S7CommPlus以太网协议基于OSI模型:

OSI layer

Protocol

7 Application Layer

S7 communication Plus

6 Presentation Layer

S7 communication Plus (COTP)

5 Session Layer

S7 communication Plus (TPKT)

4 Transport Layer

ISO-on-TCP (RFC 1006)

3 Network Layer

IP

2 Data Link Layer

Ethernet

1 Physical Layer

Ethernet

其中,第1-4层会由计算机自己完成(底层驱动程序),关于这些神马的定义,大家可以上网查一下;

第5层TPKT,应用程数据传输协议,介于TCP和COTP协议之间。这是一个传输服务协议,主要用来在COTP和TCP之间建立桥梁;

第6层COTP,按照维基百科的解释,COTP 是 OSI 7层协议定义的位于TCP之上的协议。COTP 以“Packet”为基本单位来传输数据,这样接收方会得到与发送方具有相同边界的数据;

第7层,S7 communication Plus,这一层和用户数据相关,对PLC数据的读取报文在这里完成。

可能会对TPKT和COPT迷惑,其实在具体的报文中,TPKT的作用是包含用户协议(5~7层)的数据长度(字节数);COTP的作用是定义了数据传输的基本单位(在S7Comm中 PDU TYPE:DT data)。

图1 S7Comm Plus协议OSI模型

2 TPKT协议

TPKT协议是应用程数据传输协议,介于TCP和COTP协议之间。这是一个传输服务协议,主要用来在COTP和TCP之间建立桥梁。

其英文介绍如下:

TPKT is an “encapsulation” protocol. It carries the OSI packet in its own packet’s data payload and then passes the resulting structure to TCP, from then on, the packet is processed as a TCP/IP packet. The OSI programs passing data to TPKT are unaware that their data will be carried over TCP/IP because TPKT emulates the OSI protocol Transport Service Access Point(TSAP).

TPKT结构如图2:

图2 TPKT协议结构

其中,TPKT的结构为:

  • 0 (Unsigned integer, 1 byte): Version,版本信息。

  • 1 (Unsigned integer, 1 byte): Reserved,保留(值为0x00)。

  • 2-3 (Unsigned integer, 2 bytes): Length,TPKT、COTP、S7三层协议的总长度,也就是TCP的payload的长度。

举个例子,如图3所示:

图3 一个TPKT的例子

从图4中可知,其version=3,length=25(0x0019)。

3 COTP协议

COTPISO 8073/X.224 COTP Connection-Oriented Transport Protocol)是OSI 7层协议定义的位于TCP之上的协议。COTP以“Packet”为基本单位来传输数据,这样接收方会得到与发送方具有相同边界的数据。

COTP协议分为两种形态,分别是COTP连接包(COTP Connection Packet)和COTP功能包(COTP Fuction Packet)。

3.1 COTP Connection Packet

COTP连接包(COTP Connection Packet)也就是S7Comm的握手包,其格式如图4所示。

图4 COTP连接包的结构

其中, COTP连接包的头结构为:

  • 0 (Unsigned integer, 1 byte): Length,COTP后续数据的长度(注意:长度不包含length的长度),一般为17 bytes。

  • 1 (Unsigned integer, 1 byte): PDU typ,类型有:

o  0x1加急数据(ED Expedited Data);

o  0x2加急数据确认(EA Expedited Data Acknowledgement);

o  0x4用户数据(UD);

o  0x5拒绝(RJ Reject);

o  0x6数据确认(AK Data Acknowledgement);

o  0x7: TPDU错误(ER TPDU Error);

o  0x8断开请求(DR Disconnect Request);

o  0xC断开确认(DC Disconnect Confirm);

o  0xD连接确认(CC Connect Confirm);

o  0xE连接请求(CR Connect Request);

o  0xF数据传输(DT Data);

  • 2~3 (Unsigned integer, 2 bytes): Destination reference

  • 4~5 (Unsigned integer, 2 bytes): Source reference

  • 6 (1 byte): opt,其中包括Extended formats、No explicit flow control,值都是Boolean类型。

  • 7~? (length-7 bytes, 一般为11 bytes): Parameter,参数。一般参数包含Parameter code(Unsigned integer, 1 byte)、Parameter length(Unsigned integer, 1 byte)、Parameter data三部分。

算了,还是来个例子,更加明了:

图5 连接请求包

图5中,PDU类型为连接请求(0x0e),表示该数据包是一个连接请求包。为了更好对比,图6为图5的连接请求的响应包:

图6 连接确认包

3.2 COTP Fuction Packet

相对而言,COTP Fuction Packet比COTP Connection Packet简单多了,其结构如图8所示:

图7 COTP功能包的格式

其中, COTP 功能包的头结构为:

  • 0 (Unsigned integer, 1 byte): Length,COTP后续数据的长度(注意:长度不包含length的长度),一般为2 bytes。

  • 1 (Unsigned integer, 1 byte): PDU type,类型有:

o  0x1加急数据(ED Expedited Data);

o  0x2加急数据确认(EA Expedited Data Acknowledgement);

o  0x4用户数据(UD);

o  0x5拒绝(RJ Reject);

o  0x6数据确认(AK Data Acknowledgement);

o  0x7: TPDU错误(ER TPDU Error);

o  0x8断开请求(DR Disconnect Request);

o  0xC断开确认(DC Disconnect Confirm);

o  0xD连接确认(CC Connect Confirm);

o  0xE连接请求(CR Connect Request);

o  0xF数据传输(DT Data);

  • 2 (1 byte): opt,其中包括Extended formats、No explicit flow control,值都是Boolean类型。

举个例子,如图8所示:

图8 数据传输包

上图中,PDU类型为连接请求(0x0f),表示该数据包是一个数据传输的包。

OK,COTP的两中结构介绍完了,接下来的S7CommPlus协议才是本文的重点。

未完待续……

本文源自微信公众号:牵着蜗牛遛弯儿

人已赞赏
安全教程

某工厂驱动人生挖矿病毒应急响应分析报告

2020-2-16 4:29:16

安全教程

浅谈工控CTF中网络数据分析的思路

2020-2-16 4:30:01

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索