一、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
建立通信,这样设备间的通信才正式建立完毕了。
总结:还是做不出来,等工作的时候,有条件,在打工业杯。