回复:西门子通信协议S7COMM【转载】

已锁定

荧惑mars

  • 帖子

    156
  • 精华

    6
  • 被关注

    33

论坛等级:侠士

注册时间:2014-02-13

普通 普通 如何晋级?

发布于 2020-04-02 10:01:00

2楼

工控协议——S7通讯协议

S7协议简介

2. TPKT协议

3.COTP协议

S7通信支持两种方式

S7comm协议

S7comm的结构主要分为三部分:

Header:

S7协议简介

S7以太网协议本身也是TCP/IP协议簇的一员,S7协议在OSI中的位置相当于将物理层和数据链路层之上的协议进行了定义,S7comm的协议栈修改程度更高,在应用层组织的数据经过COTP协议、TPKT协议的进一步处理后,最终通过TCP进行传输


S7协议与TCP/IP其中的对应关系:


ISO-OSI参考模型 TCP/IP模型 S7以太网协议模型

7-应用层 4-应用层 6-S7 Communication

6-表示层 5-S7 Communication (COTP)

5-会话层 4- S7 Communication (TPKT)

4-传输层 3-传输层 3-TCP(102端口)

3-网络层 2-网络层 2-IP

2-数据链路层 1-网络接口层 1-工业以太网

1-物理层

备注:这里的S7模型并不是说S7是独立于TCP/IP的,只是为了标出S7模型下比较有代表性的内容,事实上S7就是TCP的一种定制,是TCP协议簇的一种


在进行报文分析前,我们首先把s7的大概分析如下:


2. TPKT协议

TPKT(Transport Service ontop of the TCP):通过TCP的传输服务。介于TCP和COTP之间。属于传输服务类的协议,它为上层的COTP和下层TCP进行了过渡。功能为在COTP和TCP之间建立桥梁,其内容包含了上层协议数据包的长度。一般与COTP一起发送,当作Header段。我们常用的RDP协议(remote desktop protocol,windows的远程桌面协议)也是基于TPKT的,TPKT的默认TCP端口为102(RDP为3389),其实它本身为payload增加的数据并不多,主要就是以下几个:


version,1byte,表明版本信息

reserved,1byte,看到这个名字就知道是保留的了

length,2byte,包括payload和这三部分在内的总长度


接下我们用2018工控比赛流量包来实际看一眼:


可以看到,版本号是3号,长度为31,除此之外该层并没有什么有用信息了


3.COTP协议

COTP协议的全称是(Connection-Oriented Transport Protocol),即面向连接的传输协议,从这个名字就可以看出,它的传输必然是依赖于连接的,所以在传输数据前必然有类似TCP握手建立链接的操作。


接下来我们看看具体的流量包:

1


首先是TCP的三次握手,在192.168.25.146与192.168.25.139间建立了TCP连接,之后是两个COTP的包,注意,这里wireshark为我们标注出了CR和CC,后面的COTP包都是DT,这里的CR和CC其实分别是connect request(请求连接)和connect confirm(确认连接)的,也就是建立连接的过程,之后连接建立成功后,发送DT包,也就是data ,是在发送数据。

(备注:wireshark是网络封包分析软件:下载地址为:https://www.wireshark.org/download.html有兴趣的可以去下载了解一下)


接下来我们看看他们所携带的数据:


可以看到,DT包和连接包有着明显的不同,连接包明显多了一堆内容,这其实是COPT包的两种形态,COTP连接包(COTP Connection Packet)和COTP功能包(COTP Fuction Packet)


首先来看COPT连接包,通过上面的wireshark的分析我们可以看到,主要有以下几个字段:


length,1byte,数据的长度,但并不包含length这个字段(至于为什么这样,不清楚)

PDU type,1 byte,标识类型,图中的0x0d即为连接确认的类型,常有的还有

0xe,连接请求

0x0d,连接确认

0x08,断开请求

0x0c,断开确认

0x05,拒绝

DST reference,2byte,目标的引用,可以认为是用来唯一标识目标

SRC reference,2byte,源的引用,同上

option,1byte,可以看到wireshark将8位拆为了前四位和后两位:

前四位标识class,也就是标识类别

倒数第二位对应Extended formats,是否使用拓展样式

倒数第一位对应No explicit flow control,是否有明确的指定流控制

parameter,附加的参数字段,参数可以有多个,每个参数又由以下几个字段构成:

code,1byte,标识类型,主要有:

0xc0,tpdu的size,tpdu即传送协议数据单元,也就是传输的数据的大小(是否和前面的length有重复之处?)

0xc1,src-tsap,翻译过来应该叫源的端到端传输(在完整的TCP/IP协议栈中,这个字段代表的是应用与应用之间的通信,我这里猜测可能是为了),但从西门子给的手册来看,它标记的应该是机架号,可是不管我怎么查,也没有找到wireshark解析出的字符串。那么逆向我们找不到答案,就只能正向来了,在parameter字段的最后我们再来详细说这到底是个啥。


0xc2,dst-tsap,同上,之后我们再探索

length,长度

对应的数据

接着COPT功能包,其实个人感觉这两种包可以归为一种,但是看到文献都是分为两种的,那我们也就划分为两种吧

length,1byte,长度

PDU type,1 byte,图中为0x0f,即为数据传输,此外的type都不太常用,这里不再提了(其实是我没找到相关的流量包……有这方面流量的大佬希望补全以下)

option,1byte,以位为单位划分:

第一位,标识是否为最后一个数据包(从这可以看出,COPT协议当数据较多时,会分为几个单元传输

后七位,标识TPDU的number

到这COPT包我们就算是分析的彻彻底底了,当然,上面还留了个小问题,parameter里的tsap到底是个什么东西?

S7通信支持两种方式

1.基于客户端(Client)/服务器(Server)的单边通信;

客户端(Client)/服务器(Server)模式是最常用的通信方式,也称作S7单边通信。在该模式中,只需要在客户端一侧进行配置和编程;服务器一侧只需要准备好需要被访问的数据,不需要任何编程(服务器的“服务”功能是硬件提供的,不需要用户软件的任何设置)。

2.基于伙伴(Partner)/伙伴(Partner)的双边通信;

有时候,我们需要双向的数据操作,这就要使用伙伴(Partner)/伙伴(Partner)通信模式。

伙伴(Partner)/伙伴(Partner)通信模式也称为S7双边通信,也有人称其为客户端(Client)—客户端(Client)模式。不管是什么名字,该通信方式有如下几个特点:


通信双方都需要进行配置和编程;

通信需要先建立连接。主动请求建立连接的是主动伙伴(Active Partner),被动等 待建立连接的是被动伙伴(Passive Partner);

当通信建立后,通信双方都可以发送或接受数据;

举例:在S7-300中,使用FB12(BSend)/FB13(BRecv)进行发送和接收。当一方调用发送指令时,另一方必须同时调用接收指令才能完成数据的传输。


S7comm协议

S7comm的结构主要分为三部分:

Header

Header:主要是数据的描述性信息,包含长度信息,PDU参考和消息类型常量,最重要的是要表明PDU的类型

Parameter:参数,随着不同类型的PDU会有不同的参数

Data:数据,该数据是一个可选字段来携带数据,例如存储器值,块代码,固件数据等。

如下图:



Header:



Protocol id 1 byte,即协议的id,始终设置为0x32

ROSCTR 1byte,pdu(协议数据单元(Protocol Data Unit))的类型,一般由以下几种:


0x01-job:开工干活的意思,主设备通过job向从设备发出“干活”的命令,具体是读取数据还是写数据由parameter决定

0x02-ack:确认 确认有没有数据字段

0x03-ack-data:从设备回应主设备的job

0x07-Userdata:原始协议的扩展,参数字段包含请求/响应id,(用于编程/调试,SZL读取,安全功能,时间设置,循环读取…)

Reserved:2byte,保留,始终设置为0x0000

PDU reference:|pdu的参考–由主站生成,每次新传输递增,用于链接对其请求的响应,Little-Endian(注意:这是WinCC,Step7和其他西门子程序的行为,它可能是随机的生成后,PLC只将其复制到回复中)

parameter length:参数的长度

error class:错误类型,像是图中的0x00就是没有错误的意思,而常见的请求错误则是0x85

error code:错误码,结合错误类型来确定错误,图中的0x00同样是没有错误的意思

关于具体的错误类型和错误码的信息大家可以自行搜索,因为太多了这里就不再展开说明了。

推荐地址:https://www.jianshu.com/p/19798f2768e1


Parameter:取决于不同的pdu类型,

下面来看看具体的流量包


可以看到该pdu为job,也就是主设备在发号施令,而通过parameter可以看到,function是0x04的read,也就是读取数据,item count意思是后续跟了几个item,该pdu就一个,所以为1。


而这个item的结构就有要单独说说了:

variable specification,1byte,一般就是0x12

Length:Length of following address specification,数据的长度

Syntax Id:符号id,一个标志,决定了一些格式性问题,这里是0x10是Address data S7-Any pointer-like DBx.DBXx.x的意思,具体意思我们下面再提,详细的大家还是可以去自己看看,主要就是对于后续的寻址起到了一定的限定

Transport size: 传输大小,也可以认为是传输类型,在这是4,也就是WORD

DB number: 就是数据块编号的意思,0就代表要找的东西不在数据块里

Area: 要操作的“东西”,比如0x82,就是读设备的输出,通过这一位也可以看到,我们要读的数据不在DB里,所以DB number为0,如果为DB的话,这1byte应该为0x84

Address: 具体的地址,如下图所示,前五位没用到,第六位到第二十一位是Byte地址,最后三位是Bit的地址


首先,它定义了格式为Address data S7-Any pointer-like DBx.DBXx.x,然后指定了读取的”东西“为设备的输出,读取的大小为word,其实到这里这个pdu的全部信息就已经分析完了,为了更好的理解上面定义的格式,我们还是继续看一下。


它读的DB number是0那么根据格式就是DB0.DBXx.x,而读取的address是Byte为0,Bit为0,也就是DB0.DBX0.0,如果我们指定的”东西“为数据块的话,就按照这种格式读取。这就是格式的意思,再比如说0xb2,描述为Symbolic address mode of S7-1200,实际上格式就是符号地址,就不再是这样的组织形式了。


再来看看上个pdu的相应,这里截图没截到header,header最值得关注的是pdu的类型,这里是0x03,也就是我们之前提到过的对于job的相应

而paramter部分可以看到,function是与job pdu的相同的。Data部分就是传回来的具体数据了,return code是返回码,用来标识job让干活的结果,这里是0xff,代表的是成功的意思,除了这个,还有以下几种:

0x01,硬件错误

0x03,想访问的东西不让访问

0x05,地址越界了

0x06,你请求的数据类型和请求的”东西“的数据类型不一致

接着是data的长度(是真的data的长度,不包含前面),最后就是具体的data了,可以看到,这里读到的是0x0000。


下面结合具体案例分析

工业协议数据流量包分析


可以看到一大堆的协议,不过整体思路还是刚才清晰的,首先是ARP协议去找mac地址(不知道arp的,补一下计算机网络的知识吧……),接着是标准的TCP三次握手,接着是COTP的建立连接(要不以后我叫他两次握手?),接着就到了S7comm和modbus来具体干活了。

思路体现如下:

ARP–>mac地址–>TCP三次握手–>COTP建立连接–>S7comm干活


我们可以看到这个job和我们之前的并不一样,打开仔细瞧瞧


我们看到parameter中的funtion为0xf0,是建立通信的意思,这其实是和上面的TCP、COPT有些相似的,都是在两个设备之间建立通信,而参数的主要信息是MAX AMQ calling和MAX AMQ called。

下面一个ack_data的pdu自然是相应建立通信的意思了,经过TCP握手、COPT建立连接、S7comm建立通信,这样设备间的通信才正式建立完毕了。

往后的S7comm可以看到是read,也就是在读数据,数据包和上面提到的一样,

总结

S7comm作为一个私有协议,它的可出题点其实更多,而且由于是私有协议,很多地方都还有挖掘的空间,这篇文章只是带大家按照我的思路,从无到有的分析了S7comm的各个部分,肯定有不完全正确的地方,也肯定有细节没有考虑到,希望大家能更进一步,探索更多的秘密。

数据来源:https://github.com/w3h/icsmaster/tree/master/pcap


2.S7 协议工作流程


client与server通过socket建立连接,过程是标准的TCP连接方式,这一步完成连接的建立

client发送COTP,请求连接PLC,报文中包含CR Connect Request和Destination TSAP,从而标识出CPU的机架号和槽号

PLC返回COTP,确认连接,报文中包含CC Connect Confirm,此时server已经明确client与哪个CPU进行通讯

client发送S7 Communication给server,报文中包含Setup communication,即通讯请求

server返回S7

Communication给client,报文的ROSCTR为ACK_DATA,有确认的意思,包含了对作业请求的回复

client与server发送交换数据的报文,仍以S7 Communication完成

注:2-5的步骤中,2与3完成数据传输前连接的功能,4与5则完成连接之后的通讯请求,如果绕过通讯请求的建立,在有TCP时就进行数据交换,服务器一般会直接断连

另外推荐几个有用的协议网站

开源通信库snap7:http://snap7.sourceforge.net/

S7 wireshark解析器:https://sourceforge.net/projects/s7commwireshark/

S7捕获包:https://github.com/gymgit/s7-pcaps

PLC4X: http://plc4x.apache.org/protocols/s7/index.html

————————————————

版权声明:本文为CSDN博主「闲鱼!!!」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_43158056/article/details/104298156


活到老,学到老。
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

通信与网络组件

共有4452条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。