前言
前面我們對ModbusRTU協(xié)議裕偿、ModbusTCP協(xié)議拢蛋、歐姆龍FinsTCP協(xié)議谆棱、三菱SLMP協(xié)議都做了說明:
今天我們來分享一下關(guān)于西門子S7協(xié)議的通信分析。
西門子作為一個老牌工控企業(yè)个从,在中國市場擁有很高的市場占有率。如果要說起西門子的通信協(xié)議奕污,相信大家多多少少能說出一些贾陷,比如MPI髓废、PPI、USS蒋譬、Profibus、Profinet剂买、S7等,但是西門子在協(xié)議的開放性方面還是相對要封閉一些,所以很多協(xié)議都是不開放的结胀。
在這里糟港,我主要是結(jié)合Wireshark抓包工具,跟大家去分享一下剥汤,如何是一步一步抓取西門子S7通信協(xié)議底層通信報文的,希望通過我一步一步地分析,讓大家都能夠?qū)ξ鏖T子S7協(xié)議有所了解的同時蠢沿,也學(xué)會基本的抓包操作與報文分析。
值得說明一下野宜,西門子S7協(xié)議非開放協(xié)議,以下內(nèi)容魔策,僅供學(xué)習(xí)參考匈子。
環(huán)境搭建
1、首先我們要準備要準備一個西門子的PLC闯袒,并保證PLC與PC之間的網(wǎng)絡(luò)連接正常。PS:對于手頭沒有PLC的小伙伴政敢,可以查看這篇文章:
基于S7-PLCSIM Advanced搭建S7通信仿真環(huán)境
2其徙、為了抓取到通信的報文,需要實現(xiàn)PC與PLC之間的通信喷户,這里我采用的方式是通過KepServer V6.4來實現(xiàn)
3唾那、安裝Wireshark抓包軟件。
4褪尝、認識S7協(xié)議的網(wǎng)絡(luò)模型闹获。
操作步驟
1、首先將KepServer與PLC之間的通信連接配置好恼五;
2昌罩、將Wireshark軟件打開,并處于監(jiān)控報文狀態(tài)灾馒;
3茎用、將KepServer進行連接PLC,此時Wireshark軟件中會出現(xiàn)報文的數(shù)據(jù)睬罗,將KepServer連接停止并關(guān)閉軟件轨功,同時將Wireshark的監(jiān)控停止,以便進行后續(xù)的報文分析容达;
協(xié)議分析
1古涧、我們發(fā)現(xiàn)西門子的S7通信并不是簡簡單單的TCP通信,在TCP執(zhí)行三次握手之后花盐,還需要發(fā)送兩次連接驗證羡滑,在兩次連接驗證之后菇爪,才進行真正的數(shù)據(jù)交互。
2柒昏、三次握手過程凳宙,如下圖所示:
3、S7連接第一次驗證职祷,如下圖所示:
4氏涩、S7連接第二次驗證,如下圖所示:
5有梆、四次揮手過程是尖,如下圖所示:
6、S7第一次驗證發(fā)送報文分析:
TPKT(第五層:會話層)
該層總共占4個字節(jié):
版本號:0x03
預(yù)留:0x00
長度:0x0016
COTP(第六層:表示層)
該層總共占用18個字節(jié):
長度:0x11
PDU類型(CR Connect Request 連接請求):0x0E
目標(biāo)引用:0x0000
源引用:0x0001
擴展格式/流控制:0x00
參數(shù)代碼 TPDU-Size:0xC0
參數(shù)長度:0x01
TPDU大心嘁:0x0A
參數(shù)代碼 SRC-TASP:0xC1
參數(shù)長度:0x02
源TSAP Source TSAP:0x0201
參數(shù)代碼 DST-TASP:0xC2
參數(shù)長度:0x02
目標(biāo)TSAP Destination TSAP:0x0201
7饺汹、S7第一次驗證返回報文
TPKT(第五層:會話層)
該層總共占4個字節(jié):
版本號:0x03
預(yù)留:0x00
長度:0x0016
COTP(第六層:表示層)
該層總共占18個字節(jié):
長度:0x11
PDU類型(CC Connect Confirm 連接確認):0x0D
目標(biāo)引用:0x0001
源引用:0x0006
擴展格式/流控制:0x00
參數(shù)代碼 TPDU-Size:0xC0
參數(shù)長度:0x01
TPDU大小:0x0A
參數(shù)代碼 SRC-TASP:0xC1
參數(shù)長度:0x02
Source TSAP:0x0201
參數(shù)代碼 DST-TASP:0xC2
參數(shù)長度:0x02
Destination TSAP:0x0201
8爆袍、S7第二次驗證發(fā)送報文
TPKT(第五層:會話層)
該層總共占4個字節(jié):
版本號:0x03
預(yù)留:0x00
長度:0x0019
COTP(第六層:表示層)
該層總共占3個字節(jié):
長度:0x02
PDU類型(DT Data):0XF0
目標(biāo)引用:0x80
S7 Communication(第七層:應(yīng)用層)
該層總用占18個字節(jié)首繁,并且分兩部分:
Header:
協(xié)議ID(Protocol ID):0x32
ROSCTR:0x01
預(yù)留:0x0000
協(xié)議數(shù)據(jù)單元引用:0x037C
參數(shù)長度:0x0008
數(shù)據(jù)長度:0x0000
Parameter:
功能碼:0xF0
預(yù)留:0x00
最大AmQ(Calling):0x0001
最大AmQ(Called):0x0001
PDU長度:0x03C0
9、S7第二次驗證返回報文
TPKT(第五層:會話層)
該層總共占4個字節(jié):
版本號:0x03
預(yù)留:0x00
長度:0x0019
COTP(第六層:表示層)
該層總共占3個字節(jié):
長度:0x02
PDU類型(DT Data):0XF0
目標(biāo)引用:0x80
S7 Communication(第七層:應(yīng)用層)
該層總用占20個字節(jié)陨囊,并且分兩部分:
Header:
協(xié)議ID(Protocol ID):0x32
Ack_Data:0x03
預(yù)留:0x0000
協(xié)議數(shù)據(jù)單元引用:0x037C
參數(shù)長度:0x0008
數(shù)據(jù)長度:0x0000
錯誤等級:0x00
錯誤代碼:0x00
Parameter:
功能碼:0xF0
預(yù)留:0x00
最大AmQ(Calling):0x0001
最大AmQ(Called):0x0001
PDU長度:0x00F0
10弦疮、讀取數(shù)據(jù)發(fā)送報文:讀取DB1.DBX0.0 開始的4個字節(jié)
TPKT(第五層:會話層)
該層總共占4個字節(jié):
版本號:0x03
預(yù)留:0x00
長度:0x001F
COTP(第六層:表示層)
該層總共占3個字節(jié):
長度:0x02
PDU類型(DT Data):0XF0
目標(biāo)引用:0x80
S7 Communication(第七層:應(yīng)用層)
該層總用占24個字節(jié),并且分兩部分:
Header:
協(xié)議ID(Protocol ID):0x32
Ack_Data:0x01
預(yù)留:0x0000
協(xié)議數(shù)據(jù)單元引用:0x037D
參數(shù)長度:0x000E
數(shù)據(jù)長度:0x0000
Parameter:
功能碼 Read Var:0x04
通信項數(shù):0x01
通信項1:
通信項Header
變量指定:0x12
地址長度:0x0A
Syntax ID:0x10
傳輸數(shù)據(jù)類型 byte:0x02
通信項Param
讀取長度:0x04
DB號:0x01
存儲區(qū)類型 DB存儲區(qū):0x84
開始字節(jié):0x000000
11蜘醋、 讀取數(shù)據(jù)返回報文
TPKT(第五層:會話層)
該層總共占4個字節(jié):
版本號:0x03
預(yù)留:0x00
長度:0x001D
COTP(第六層:表示層)
該層總共占3個字節(jié):
長度:0x02
PDU類型(DT Data):0XF0
目標(biāo)引用:0x80
S7 Communication(第七層:應(yīng)用層)
該層總用占22個字節(jié)胁塞,并且分兩部分:
Header:
協(xié)議ID(Protocol ID):0x32
Ack_Data:0x03
預(yù)留:0x0000
協(xié)議數(shù)據(jù)單元引用:0x037D
參數(shù)長度:0x0002
數(shù)據(jù)長度:0x0008
錯誤等級:0x00
錯誤代碼:0x00
Parameter:
功能碼 Read Var:0x04
通信項數(shù):0x01
通信項1:
返回結(jié)果Success:0xFF
傳輸數(shù)據(jù)類型 Byte/Word/DWord:0x04
長度:0x0020
數(shù)據(jù):0x00000000