接着上一篇來繼續。html
西門子S7comm協議解析 —— 利用Wireshark對報文逐字節進行解析詳細解析S7comm所含功能碼以及UserData功能(path1)網絡
這一篇把常見的功能碼所有解析一遍吧,把UserData這一塊放到最後一篇以及模擬器和抓取pacp的包。函數
咱們基本上也能夠推斷出來這個報文都會有什麼內容。工具
要下載什麼東西,要下載東西的地址,要下載的東西的屬性。八九不離十。post
發包url
頭部都是同樣的 我就不在貼圖了,咱們看參數部分。spa
Byte[0] 1a 功能碼翻譯
Byte[1] 00 即功能狀態,包含錯誤是否發生、是否使用另外一個檢索塊/文件來請求的更多數據網絡狀態3d
Byte[2] Byte[3] 01 00沒什麼意義指針
Byte[4] 到 Byte[7] 沒什麼意義通常都爲0x00000000
Byte[8] 09爲文件名的長度
Byte[9]到 Byte[17] 爲文件名
而後咱們把Filename展開解析這一塊。
Filename部分
Byte[0] 5f 文件標識符
Byte[1] Byte[2] 30 41 塊類型
Byte[3] 到Byte[7] 30 30 30 30 31 即請求的塊編號
Byte[8] 50 即請求目標的文件系統,有三種如下表
P(Passive (copied, but not chained) module):被動文件系統
A (Active embedded module):主動文件系統
B (Active as well as passive module):既主既被文件系統種
接着參數部分繼續往下看
Byte[18] 0d 參數第二部分的長度、即爲接下來數據的長度
Byte[19] 31即加載mem以前的未知字符
Byte[20] 到 Byte[25] 即裝載長度
Byte[26] 到 Byte[31] 即 MC7 代碼長度
整個意思就是請求下載(請求的標識是 5f 、請求的塊類型是 DB 塊的編號是0001 、目標塊文件系統是P、因此文件名爲_0A00001P,用於將DB1複製到被動文件系統或從被動文件系統複製。)
對於發包咱們基本上也是能猜到他會作什麼吧。
不少時候計算機跟我們生活的小事其實挺類似的,舉個不太恰當的例子。
我們吃飯是否是就直接拿着筷子去吃就完了,可是你把步驟分解分解翻譯成機器語言。
筷子 —— 指針 米 —— 數據 吃 —— 處理數據 上廁所 —— 排除垃圾數據。
回包
頭部不用說了參數部分只回復了1a 表明確認請求了確認請求以後就會進行下載塊(功能碼爲:1b)
那麼咱們再去推斷一下 這個報文裏面都會有什麼,要多多思考哈~
發包
紅框內都同樣(其餘的也都同樣)從length開始加深一下吧
Byte[0] 09 表示以後的數據長度
Byte[1] 5f 文件標識符
Byte[2] 30 41 塊類型
Byte[3] 30 30 30 30 31 塊編號
Byte[4] 50 請求目標的文件系統
回包
與發包相比較只多了個data部分介紹data部分就好了
這個就簡單易懂了吧,不用說也能猜到了吧。
Byte[0] Byte[1] 00 de data數據內容的長度
Byte[2] Byte[3] 00 fb 未知字節
Byte[4]到尾都是數據內容
發包
與0x1a和0x1b都同樣少了裝載長度和MC7長度意思就是結束下載了這裏就不作描述了
回包
也很簡單參數部分只回復了個1c 就是下載結束的意思了
發包
能夠看到,開始上傳的結構和請求下載的前部分結構一致,如上圖所示的內容,其實就是告訴 PLC 一個文件名,文件標識是_ (Complete Module),塊類型爲0B(SDB),塊的編號爲00000,目標塊的文件系統是A (Active embedded module),因此文件名爲_0B00000A
基本與請求下載都同樣 Fliename就是文件名長度UploadID即爲會話ID的意思
回包
Byte[0] 1d功能碼 Byte[1] 00 功能狀態
Byte[2] Byte[3] 01 00 即即blockcontrol中的全部未知字節
Byte[4] Byte[7] 會話ID
Byte[8] 即自此以後的數據長度
Byte[9]到尾完整上傳快的長度(以字節爲單位)、能夠拆分爲多個PDU
發包
這個就不作介紹了 UploadID與1d 協商的ID 是對照的
回包
如以前的同樣、不作介紹了。
Length,數據內容長度。Unknown byte(s) in blockcontrol,未知字節。Data,數據。
發包
都同樣不描述了其中只是多了個錯誤代碼 Errorcode
回包
只回復了個1f 是上傳結束了
發包
Byte[0] 28功能碼
Byte[1]到byte[7] 00 00 00 00 00 00 fd 未知字節
Byte[8]byte[9] 00 02 Parameter block的長度
Byte[10]byte[11] 45 50 即參數塊
Byte[12] 05 即PI程序調用服務名的數據長度
Byte[13]到尾 5f 4d 4f 44 55爲程序調用服務名(經常使用的我貼到最後吧貼這裏太長了搜附錄一)
回包
Header頭不講,parameter只回復了 0x28 就是說明確認請求成功
這個跟以前的都同樣、我再總體的圖示一下吧,不一個字節一個字節說了
發包
回包
好了,基本上功能這方面的介紹完了,下一篇把Userdata再說一下也就完活了。
仍是那句話一通百通,不少東西你明白一條基本上其餘的也能猜個八九不離十。
善於思考。
附錄一:程序調用服務名
UNKNOWN PI-Service目前不詳
_INSE PI-Service _INSE(激活PLC模塊)
_DELE PI-Service _DELE(從PLC的被動文件系統中刪除模塊)
P_PROGRAM PI-Service P_PROGRAM(PLC啓動/中止)
_MODU PI-Service _MODU(PLC Copy Ram to Rom)
_GARB PI-Service _GARB(壓縮PLC內存)
_NLOGIN PI-Service _NLOGIN(登陸)
_N_LOGOUT PI-Service _N_LOGOUT(退出)
_N_CANCEL PI-Service _N_CANCEL(取消NC報警)
_N_DASAVE PI-Service _N_DASAVE(用於將數據從SRAM複製到FLASH的PI-Service)
_N_DIGIOF P I-Service _N_DIGIOF(關閉數字化)
_N_DIGION PI-Service _N_DIGION(打開數字化)
_NDZERO PI-Service _NDZERO(設置全部D nos。對於函數無效\「惟一D號。\」)
_N_ENDEXT PI-Service _N_ENDEXT()
_N_F_OPER PI-Service _N_F_OPER(以只讀方式打開文件)
_N_OST_OF PI-Service _N_OST_OF(Overstore OFF)
_N_OST_ON PI-Service _N_OST_ON(Overstore ON)
_NSCALE PI-Service _NSCALE(測量單位設置(公制< - > INCH))
_N_SETUFR PI-Service _N_SETUFR(激活用戶幀)
_N_STRTLK PI-Service _N_STRTLK(設置全局啓動禁用)
_N_STRTUL PI-Service _N_STRTUL(重置全局啓動禁用)
_N_TMRASS PI-Service _N_TMRASS(重置活動狀態)
_N_F_DELE PI-Service _N_F_DELE(刪除文件)
_N_EXTERN PI-Service _N_EXTERN(選擇外部程序執行)
_N_EXTMOD PI-Service _N_EXTMOD(選擇外部程序執行)
_N_F_DELR PI-Service _N_F_DELR(即便沒有訪問權限也刪除文件)
_N_F_XFER PI-Service _N_F_XFER(選擇要上傳的文件)
_NLOCKE PI-Service _NLOCKE(鎖定活動文件以進行編輯)
_N_SELECT PI-Service _N_SELECT(選擇要執行的程序)
_N_SRTEXT PI-Service _N_SRTEXT(文件正在/ _N_EXT_DIR中標記)
_N_F_CLOS PI-Service _N_F_CLOS(關閉文件)
_N_F_OPEN PI-Service _N_F_OPEN(打開文件)
_N_F_SEEK PI-Service _N_F_SEEK(定位文件搜索指針)
_N_ASUP PI-Service _N_ASUP (分配中斷)
_N_CHEKDM PI-Service _N_CHEKDM(對D號碼啓動惟一性檢查)
_N_CHKDNO PI-Service _N_CHKDNO(檢查工具是否具備惟一的D編號)
_N_CONFIG PI-Service _N_CONFIG(從新配置機器數據)
_N_CRCEDN PI-Service _N_CRCEDN(經過指定邊數來建立切削刃)
_N_DELECE PI-Service _N_DELECE(刪除最前沿)
_N_CREACE PI-Service _N_CREACE(創造最前沿)
_N_CREATO PI-Service _N_CREATO(建立工具)
_N_DELETO PI-Service _N_DELETO(刪除工具)
_N_CRTOCE PI-Service _N_CRTOCE(生成具備指定邊數的工具)
_N_DELVAR PI-Service _N_DELVAR(刪除數據塊)
_N_F_COPY PI-Service _N_F_COPY(複製NCK中的文件)
_N_F_DMDA PI-Service _N_F_DMDA(刪除MDA內存)
_N_F_PROT PI-Service _N_F_PROT(爲文件指定保護級別)
_N_F_RENA PI-Service _N_F_RENA(重命名文件)
_N_FINDBL PI-Service _N_FINDBL(激活搜索)
_N_IBN_SS PI-Service _N_IBN_SS(設置設置開關)
_N_MMCSEM PI-Service _N_MMCSEM(MMC-Semaphore)
_N_NCKMOD PI-Service _N_NCKMOD(正在設置NCK工做的模式)
_N_NEWPWD PI-Service _N_NEWPWD(新密碼)
_N_SEL_BL PI-Service _N_SEL_BL(選擇新塊)
_N_SETTST PI-Service _N_SETTST(激活替換工具組的工具)
_N_TMAWCO PI-Service _N_TMAWCO(在一個雜誌中設置有效磨損組)
_N_TMCRTC PI-Service _N_TMCRTC(建立具備指定邊數的工具)
_N_TMCRTO PI-Service _N_TMCRTO(在工具管理中建立工具)
_N_TMFDPL PI-Service _N_TMFDPL(搜索空白處加載)
_N_TMFPBP PI-Service _N_TMFPBP(搜索空位)
_N_TMGETT PI-Service _N_TMGETT(使用Duplono肯定特定工具ID的T編號)
_N_TMMVTL PI-Service _N_TMMVTL(加載或卸載工具)
_N_TMPCIT PI-Service _N_TMPCIT(設置計件器的增量值)
_N_TMPOSM PI-Service _N_TMPOSM(定位雜誌或工具)
_N_TRESMO PI-Service _N_TRESMO(重置監控值)
_N_TSEARC PI-Service _N_TSEARC(經過搜索屏幕進行復雜搜索)