一、S7comm
,西门子为了它生产的PLC
、SCADA
与PLC
之间的通信而设计的专属私有协议。
在应用层组织的数据经过COTP
协议、TPKT
协议的进一步处理后,最终通过TCP
进行传输。
数据包逻辑上是由高层进行封装再一步步的转递给较低层,但我们接收到包后是低层一层层拆卸交给上层,基于逆向思维,我们之后的分析应该是由低向高展开的。TPKT
协议是一个传输服务协议,它为上层的COPT
和下层TCP
进行了过渡。CR
和CC
其实分别是connect request
和connet confirm
。
连接建立成功后,发送DT
包,也就是data
,是在发送数据。COPT
连接包: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
,翻译过来应该叫源的端到端传输;0xc2
,dst-tsap
,同上,之后我们再探索;length
,长度,对应的数据。COPT
功能包,其实个人感觉这两种包可以归为一种,length
,1byte
,长度PDU type
,1 byte
,图中为0x0f
,即为数据传输,此外的type
都不太常用。option
,1byte
,以位为单位划分:
第一位,标识是否为最后一个数据包(从这可以看出,COPT
协议当数据较多时,会分为几个单元传输;
后七位,标识TPDU
的number
。
数据包里SNOPCCxxxx
,叫做S7
优化连接,它规定了src-tsap
为SNOPCC000x000xxx
,第一个x笔者没有搞明白代表了什么,第二个是连接数,图中即为有一个连接,而在dst-tsap
必须为SIMATIC-ROOT-OTH
。刚好也和我们的数据包对应。所以我们分析的数据包应该是一个单向连接,连接的数目是一个。
二、S7comm
协议Header
,主要是数据的描述性信息,最重要的是要表明PDU
的类型;Parameter
,参数,随着不同类型的PDU
会有不同的参数;Data
,具体的数据;Header
:Protocol id
,1 byte
,即协议的id
,为0x32
;ROSCTR,1byte,pdu
的类型,一般由以下几种:0x01
,job
,就是开工干活的意思,主设备通过job
向从设备发出“干活”的命令,具体是读取数据还是写数据由parameter决定;parameter
:0x02
,ack
,0x02
,确认;0x03
,ack
data
,从设备回应主设备的job
;Reserved
,2byte
,保留;PDU reference
,pdu
的参考;parameter length
,参数的长度;error class
,错误类型,像是图中的0x00
就是没有错误的意思,而常见的请求错误则是0x85
;error code
,错误码,结合错误类型来确定错误,图中的0x00
同样是没有错误的意思;parameter
:function
是0x04
的read
;item count
意思是后续跟了几个item
,该pdu
就一个,所以为1。item
的结构:variable specification
,1byte
,一般就是0x12
;
长度,Length of following address specification
,数据的长度;Syntax Id
,符号id
,一个标志,决定了一些格式性问题,这里是0x10
,是Address data S7-Any pointer-like DBx.DBXx.x
的意思,主要就是对于后续的寻址起到了一定的限定;
传输大小,也可以认为是传输类型,在这是4,也就是WORD
;DB number
,就是数据块编号的意思,0就代表要找的东西不在数据块里;area
,要操作的“东西”,比如0x82
,就是读设备的输出,通过这一位也可以看到,我们要读的数据不在DB
里,所以DB number
为0,如果为DB
的话,这1byte
应该为0x84
;address
,具体的地址,如下图所示,前五位没用到,第六位到第二十一位是Byte
地址,最后三位是Bit的地址;Data
部分就是传回来的具体数据了;return code
是返回码,用来标识job
让干活的结果,这里是0xff
,代表的是成功的意思;data
的长度(是真的data
的长度,不包含前面)。
Sender MAC address: Siemens-_83:a8:37 (28:63:36:83:a8:37)
Sender IP address: 192.168.0.111
Target MAC address: 00:00:00_00:00:00 (00:00:00:00:00:00)
Target IP address: 192.168.0.1
如何看设备间的通信是否建立:
经过TCP
握手、COPT
建立连接、S7comm
建立通信,这样设备间的通信才正式建立完毕了。
总结:还是做不出来,等工作的时候,有条件,在打工业杯。