今天給大家分享的是:西門子02版與CN版PLC解密,老版的S7-200 PLC都被網友解密出來了,新出來02版和CN版的都用軟件讀不到密碼,我們也嘗試了很多種方法,對PPI協儀也進行了深入了解,下面把我監控的PPI協儀給大家分享。
讀命令分析:一次讀一條數據
SD LE LER SD DA SA FC DASP SSAP DU FCS ED
SD:(Start Delimiter)開始定界符(68H)
LE:(Length)報文數據長度
LER:(Repeated Length)重復數據長度
SD: (Start Delimiter)開始定界符(68H)
SA:(Source Address)目標地址,指該地址的指針,為地址值乘以8
DA:(Destination Address)本地地址,指該地址的指針,為地址值乘以8
FC:(Function Code)功能碼
DSAP:(Destination Service Access Point)目的服務存取點
SSAP:(Source Service Access Point)源服務存取點
DU:(Data Unit)數據單元
FCS:(Frame Check Sequence)校驗碼
ED:(End Delimiter)結束分界符(16H)
報文數據長度和重復數據長度為自DA至DU的數據長度,校驗碼為DA至DU數據的和校驗,只取其中的末字節值關于這個校驗碼的計算方法同上面說明。
在讀寫PLC的變量數據中,讀數據的功能碼為 6CH,寫數據的功能碼為 7CH。
對于一次讀取一個數據,讀命令都是33個字節。前面的0—21字節是相同的,為 :
因為是PC上發的讀PLC數據的命令,SA=00,DA=02,如果有b多個站,DA要改成相應的站號。讀命令中從DA到DU的長度為1B即27個字節。從22字節開始根據讀取數據的類型、位置不同而不同。表一是讀不同存儲器命令的Byte22—32。
表一讀命令的Byte22-32從表中我們可以得出以下結果:
Byte 22 讀取數據的長度
01:1 Bit 02:1 Byte
04:1 Word 06:Double Word
Byte 24數據個數,這里是01 ,一次讀多個數據時見下面的說明。
Byte 26 存儲器類型,01:V存儲器 00:其它
Byte 27 存儲器類型
04:S 05:SM 06:AI 07:AQ 1E: C
81:I 82:Q 83:M 84:V 1F: T
Byte 28,29,30存儲器偏移量指針(存儲器地址*8),如:VB100,存儲器地址為100,偏移量指針為800,轉換成16進制就是320H,則Byte 28—29這三個字節就是:00 03 20。
Byte 31 校驗和,前面已說到這是從(DA+SA+DSAP+SSAP+DU) Mod 256 。
一次讀多條數據
對于一次讀多個數據的情況,前21Byte與上面相似只是長度LD,LDr及Byte 14不同:
Byte 14 數據塊占位字節,它指明數據塊占用的字節數。與數據塊數量有關,長度=4+數據塊數*10,如:一條數據時為4+10=0E(H);同時讀M,V,Q三個不同的數據塊時為4+3*10=22(H)。
Byte 22 總是02 即以Byte為單位。
Byte 24 以字節為單位,連續讀取的字節數。如讀2個VD則Byte24=8
Byte 19---30 按上述一次讀一個數據的格式依次列出,
Byte 31---42 另一類型的數據,也是按上述格式給出。
以此類推,一次最多讀取222個字節的數據。
寫命令分析:一次寫一個Double Word類型的數據,寫命令是40個字節,其余為38個字節。寫一個Double Word類型的數據,前面的0—21字節為 :
68 23 23 68 02 00 6C 32 01 00 00 00 00 00 0E 00 00 04 01 12 0A 10
寫一個其它類型的數據,前面的0—21字節為 :(與上面比較,只是長度字節發生變化)
68 21 21 68 02 00 6C 32 01 00 00 00 00 00 0E 00 00 04 01 12 0A 10
從22字節開始根據寫入數據的值和位置不同而變化。表二是幾個寫命令的Byte22—40。表二 寫命令的Byte22—40
經分析我們可以得出以下結果:
Byte 22-- Byte 30 寫入數據的長度、存儲器類型、存儲器偏移量與讀命令相同。T,C等不能用寫命令寫入。
Byte 32 如果寫入的是位數據這一字節為03,其它則為04
Byte 34 寫入數據的位數
01: 1 Bit 08: 1 Byte 10H: 1 Word 20H: 1 Double Word
Byte 35--40值、校驗碼、結束符
如果寫入的是位、字節數據,Byte35就是寫入的值,Byte36=00,Byte37=檢驗碼,Byte38=16H,結束。如果寫個的是字數據(雙字節),Byte35,Byte36就是寫入的值, Byte37=檢驗碼,Byte38=16H,結束。如果寫個的是雙字數據(四字節),Byte35—38就是寫入的值, Byte39=檢驗碼,Byte40=16H,結束。
看完上面的指令分析我們現在就舉例幾個常用的PPI協議來分析一下:
PC尋呼:10 02 00 49 4B 16
PLC返回:10 00 02 02 04 16
PC發送:10 02 00 5C 5E 16
PLC返回: E5
我們先來看看西門子S7-200PLC的讀取密碼指令:
請用串口軟件以16進制發送,端口設置9600;e;8;1
發送:68 1B 1B 68 02 00 6C 32 01 00 00 00 00 00 0E 00 00 04 01 12 0A 10 02 00 08 00 00 03 00 05 E0 D2 16 意思:要求傳送系統存儲區05E0位開始的8個字符(這就是8個密碼數值)。
如果通訊無誤,PLC會返回 E5,意思:已經收到
那么這時上位機再次發送指令 10 02 00 5C 5E 16 意思:請執行命令。(說到這里打住一下,PLC返回E5指令后上位機PC要在很短的時間內發送確認指令,晚了剛才的指令就無效了具體多長時間我也沒測準,反正1 2秒時間是沒有問題的。)
那么這時PLC就真的執行命令了返回如下字符:68 1D 1D 68 00 02 08 32 03 00 00 00 00 00 02 00 0C 00 00 04 01 FF 04 00 40 9B 98 02 06 9D 9A 00 76 7D 16
好了,說到這里就此停止,大家看看密碼是多少啊!你如果真正明白了PPI協議就不難看出密碼了,你多做實驗一定能得出結果的。
下面再看一個讀取PLC版本號的指令:
我們在解密中首先要確定的是PLC的版本號。就是要看看是老版本還是02版的,也好做出加解密方案。他的通訊源碼是這樣的:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
68 1B 1B 68 02 00 7C 32 01 00 00 00 00 00 0E 00 00 04 01 12 0A 10 02 00 14 00 00 03 00 00 00 09 16
發送完上面數據PLC返回E5.
再次發送確認指令:10 02 00 5C 5E 16
這時plc的版本號就返回來了。看下面:
68 29 29 68 00 02 08 32 03 00 00 00 00 00 02 00 18 00 00 04 01 FF 04 00 A0 43 50 55 20 32 32 36 20 43 4E
20 20 20 20 20 20 30 32 30 31 D7 16
你看這一段:43 50 55 20 32 32 36 20 43 4E 20 20 20 20 20 20 30 32 30 31 就是plc版本號的ASCII碼。用ASC方式顯示就會看的更明白上面數據是:C P U SP 2 2 6 SP C N 0 2 0 1 (sp就是空格)
再一個就是讀TD200密碼指令:
68 1B 1B 68 02 00 6C 32 01 00 00 00 00 00 0E 00 00 04 01 12 0A 10 02 00 02 00 01 84 00 00 50 B9 16
(VW10)
通過對上面協儀分析,成功找到西門子S7-200CN解密方法,好了,今天的西門子02版與CN版PLC解密經驗分享就到這里了,希望大家多支持,我們將繼續突破更多更復雜的PLC解密技術。