1. 程式人生 > >西門子S7comm協議解析 —— 利用Wireshark對報文逐位元組進行解析詳細解析S7comm所含功能碼以及UserData功能(path1)

西門子S7comm協議解析 —— 利用Wireshark對報文逐位元組進行解析詳細解析S7comm所含功能碼以及UserData功能(path1)

又一次成為懶蛋了,標題就這麼改了改又是一篇新文章。

網上也有很多S7comm協議的解析,但還是如同我上一篇一樣我只是做報文的解析對於S7comm的原理並進行闡述。

有些地方有錯誤的地方盡請大家指出,共同進步。

好了,言歸正題。我們開始吧。

我還是按照功能碼的順序進行介紹吧。

s7抓包分析

 TPKT層和COTP層我也不多做介紹了,有興趣的可以自己去了解。今天我們主要是解析S7comm這一層。

功能碼附錄:

0x00       CPU services CPU服務

0xf0        Setup communication  建立通訊

0x04       Read Var      讀取值

0x05       Write Var     寫入值

0x1a       Request download 請求下載

0x1b       Download block   下載塊

0x1c       Download ended   下載結束

0x1d       Start upload  開始上傳

0x1e       Upload   上傳

0x1f        End upload   上傳結束

0x28       PI-Service     程式呼叫服務

0x29       PLC Stop      關閉PLC

1、0xF0建立通訊

發包

 

我們來先看Header頭部分。

Byte[0] 32 為協議ID   一般指定為0x32

Byte[1] 01 為 PDU型別  一般有0x01 Job 主裝置發起請求 0x02 Ack 確認響應 0x03 Ack_data 確認資料響應一般作為確認0x01的請求 0x07 USERDATA     協議的擴充套件,引數欄位包含請求/響應ID

Byte[2]Byte[3] 00 00冗餘資料,通常為0×0000

Byte[4]Byte[5] 3e 02協議資料單元的參考、通過請求事件增加

Byte[6]Byte[7] 00 08引數的總長度也就是parameter的長度

Byte[8]Byte[9] 00 00資料的長度、也就是data部分資料的長度如果無即為0

繼續看Parmeter部分。

根據上面的length得知,我們的Parameter部分應該是8個位,數一數看看是不是8位

Byte[0] f0 為PDU的型別也就是功能碼

Byte[1] 00 冗餘資料,通常為0×0000

Byte[2] Byte[3]  傳送連線請求

Byte[4] Byte[5]  傳送通訊請求

Byte[6] Byte[7]  協商的PDU長度

回包

 

紅框內跟發包是一樣的,就不再描述了。

從Error Class開始。

Byte[10] 00 為錯誤型別 、錯誤型別也有很多種、以下是錯誤型別附錄。

0x00       No error 沒有錯誤

0x81       Application relationship     應用關係

0x82       Object definition  物件定義

0x83       No resources available 沒有可用資源

0x84       Error on service processing 服務處理中錯誤

0x85       Error on supplies 請求錯誤

0x87       Access error  訪問錯誤

Byte[11] 00 為錯誤碼   文章最後會附錄一下全部錯誤碼(很長不貼在這裡了,搜尋 附錄一)

這裡可以理解為 錯誤型別規定錯誤的大體方向而錯誤碼規定錯誤的具體事件。

接下來我們看Parameter這一部分

可以看出跟發包是完全一樣的,還是那句話百變不離其宗,協議嘛逃脫不了一發一收對吧。

Byte[0] f0 為PDU的型別也就是功能碼

Byte[1] 00 冗餘資料,通常為0×0000

Byte[2] Byte[3]  確認連線請求

Byte[4] Byte[5]  確認通訊請求

Byte[6] Byte[7]  協商的PDU長度

2、0x04 讀取資料

發包

Header頭部與之前都一樣的不再描述了

我們直接看Parameter部分吧。

Byte[0]  04 功能碼

Byte[1]  01 代表了Item的個數  為1 即為 一個

再繼續往下扒。

Item部分

Byte[0] 12 結構標識通常都為0x12,代表變數規範

Byte[1] 0a 長度規範、自此往後的長度

Byte[2] 10  IDS的地址規範的格式型別常見值如下表

0x10        S7ANY  Address data S7-Any pointer-like DB1.DBX10.2

0x13        PBC-R_ID    R_ID for PBC

0x15        ALARM_LOCKFREE Alarm lock/free dataset

0x16        ALARM_IND      Alarm indication dataset

0x19        ALARM_ACK     Alarm acknowledge message dataset

0x1a        ALARM_QUERYREQ      Alarm query request dataset

0x1c        NOTIFY_IND      Notify indication dataset

0xa2        DRIVEESANY    seen on Drive ES Starter with routing over S7

0xb2        1200SYM      Symbolic address mode of S7-1200

0xb0        DBREAD      Kind of DB block read, seen only at an S7-400

0x82        NCK      Sinumerik NCK HMI access

Byte[3] 02 為資料傳輸的大小、常見值如下表

0 NULL

3  BIT  bit access, len is in bits

4  BYTE/WORD/DWORD  byte/word/dword access, len is in bits

5  INTEGER  integer access, len is in bits

6  DINTEGER  integer access, len is in bytes

7  REAL  real access, len is in bytes

9  OCTET STRING  octet string, len is in bytes

Byte[4]Byte[5] 00 01 即資料的長度

Byte[6]byte[7] 00 01  即 DB 編號,如果訪問的不是DB區域,此處為0x0000

Byte[8] 84 即資料的區域常用的如下表

Byte[9] Byte[10]Byte[11]    要讀取資料的地址

圖示整體標註一下

 回包

 Header部分

除了紅框內的其他都與發包一致

Error class 即錯誤型別

Error code 即具體錯誤碼這兩個在上面已經介紹了都有哪些錯誤型別,沒有錯誤即0x00

Parameter部分

Byte[0] 04 功能碼 Byte[1] 01 代表一個Item

Data部分

Byte[0] FF 為返回碼  返回碼常用值如下表

0x00       Reserved 未定義,預留

0x01       Hardware error   硬體錯誤

0x03       Accessing the object not allowed 物件不允許訪問

0x05       Invalid address     無效地址,所需的地址超出此PLC的極限

0x06       Data type not supported     資料型別不支援

0x07       Data type inconsistent 日期型別不一致

0x0a       Object does not exist    物件不存在

0xff         Success  成功

Byte[1] 04  為資料傳輸大小 data資料傳輸大小值如下表

0     NULL

3     BIT bit access, len is in bits

4     BYTE/WORD/DWORD     byte/word/dword access, len is in bits

5     INTEGER    integer access, len is in bits

6     DINTEGER  integer access, len is in bytes

7     REAL    real access, len is in bytes

9     OCTET STRING octet string, len is in bytes

Byte[2]Byte[3]  為data資料的長度

Byte[4] 即資料

有時候會有填充資料即在byte[4]之後、如果資料長度不滿足length的話會填充0x00

列如 byte[2]byte[3] 的長度值為3 就會在byte[4]後填充兩個0x00

還是整體在圖示一遍吧

 好了,這個功能算是啃完了,其他的功能也大致都一樣,所以呢剩下的時候我可能會比較懶了哈哈。

3、0x05 寫入資料

這就很好理解了吧,有讀必有寫。那寫我們去推斷一下,是不是在發包的時候比讀資料會多一個Data段作為寫入的值呢。答案是肯定的!

發包

Header  都與讀取值一樣的就不在說了

Parameter也一樣圖示一次吧

 

 

 叮叮叮,Data段來了

 

Byte[0]  00 返回碼未定義就為00

Byte[1]  04 資料傳輸的大小

Byte[2]Byte[3] 資料的長度

Byte[4] 資料

是不是感覺這些都差不多一樣,

計算機跟人類也是一樣的。

我對你說“你好帥啊” 你是不是也會回我一句“你也好帥”,假設說你回了一句“我很帥,你很醜” 

這是不是不符合常理了,有可能你還要捱罵對吧。

那計算機也是啊,服務端傳送數值,客戶端不但不接受還罵服務端一句,那是不是服務端這邊要報錯呢。

可能例子不太恰當,意思到了就闊儀了。

言歸正傳,別愛我,沒結果。

回包

引用上面我舉的例子,那完全可以推斷出來回包會會什麼對吧。

發包寫入了資料,那我回包是不是要回複寫入成功或者失敗呢。

Header部分和parameter部分都一樣還是懶了些就不在描述了。

來看Data部分吧

Byte[0] FF 即為返回碼

 

上面介紹有返回碼的型別 整段的意思就是向0x000000地址寫入成功

還有好多個功能碼沒有寫,我會放到下一篇文章裡。

原因:懶了懶了懶了

未完待續....

&n