Как узнать пароль от программы S200 контроллера

Промышленные Логические Контроллеры SIMATIC S7-200/300/400
misha1
Posts: 19
Joined: Tue Aug 31, 2021 3:08 pm

Как узнать пароль от программы S200 контроллера

Post by misha1 »

Здравствуйте !

Есть технологическая линия китайского производства. В шкафу управления стоит контроллер S200 с программой под паролем внутри. Мне понадобился пароль, для манипуляций с программой. Как мне распаролить программу ? Может есть специальный софт для этого ?
andreyit
Posts: 224
Joined: Wed Dec 26, 2018 5:39 pm

Re: Как узнать пароль от программы S200 контроллера

Post by andreyit »

Есть софт, если версия прошивки ниже 2.0, и стоит именно 3-х уровненный пароль.
Хотя есть 4 уровень или версия 2.0 или выше - то тоже есть решение, которое на форуме не раз проскакивало.
Sam N
Posts: 13
Joined: Sun Aug 08, 2021 10:00 am

Re: Как узнать пароль от программы S200 контроллера

Post by Sam N »

считываешь память программы
устройством CH341A .
как расшифровать в дампе пароль стораз описано.
если 4 уровень защиты, то взлом аппаратный.
Serg70
Posts: 3
Joined: Fri Feb 03, 2023 5:17 am

Re: Как узнать пароль от программы S200 контроллера

Post by Serg70 »

pss7_v1.84a
Sam N
Posts: 13
Joined: Sun Aug 08, 2021 10:00 am

Re: Как узнать пароль от программы S200 контроллера

Post by Sam N »

Spoiler
Show

Code: Select all

#!/usr/bin/python3

def byte_char(hexstr):  # from "pass_for_s7.pdf"
  if  ( hexstr=='8a'): return ' ' #space
  if  ( hexstr=='8b'): return '!'
  if  ( hexstr=='88'): return '"'
  if  ( hexstr=='89'): return '#'
  if  ( hexstr=='8e'): return '$'
  if  ( hexstr=='8f'): return '%'
  if  ( hexstr=='8c'): return '&'
  if  ( hexstr=='8d'): return "'"
  if  ( hexstr=='82'): return '('
  if  ( hexstr=='83'): return ')'
  if  ( hexstr=='80'): return '*'
  if  ( hexstr=='81'): return '+'
  if  ( hexstr=='86'): return ','
  if  ( hexstr=='87'): return '-'
  if  ( hexstr=='84'): return '.'
  if  ( hexstr=='85'): return '/'

  if  ( hexstr=='9a'): return  '0'
  if  ( hexstr=='9b'): return  '1'
  if  ( hexstr=='98'): return  '2'
  if  ( hexstr=='99'): return  '3'
  if  ( hexstr=='9e'): return  '4'
  if  ( hexstr=='9f'): return  '5'
  if  ( hexstr=='9c'): return  '6'
  if  ( hexstr=='9d'): return  '7'
  if  ( hexstr=='92'): return  '8' 
  if  ( hexstr=='93'): return  '9'
  if  ( hexstr=='90'): return  ':' 
  if  ( hexstr=='91'): return  ';' 
  if  ( hexstr=='96'): return  '<' 
  if  ( hexstr=='97'): return  '=' 
  if  ( hexstr=='94'): return  '>' 
  if  ( hexstr=='95'): return  '?'

  
  if  ( hexstr=='ea'): return  '@' 
  if  ( hexstr=='eb'): return  'A' 
  if  ( hexstr=='e8'): return  'B' 
  if  ( hexstr=='e9'): return  'C' 
  if  ( hexstr=='ee'): return  'D' 
  if  ( hexstr=='ef'): return  'E' 
  if  ( hexstr=='ec'): return  'F' 
  if  ( hexstr=='ed'): return  'G' 
  if  ( hexstr=='e2'): return  'H' 
  if  ( hexstr=='e3'): return  'I' 
  if  ( hexstr=='e0'): return  'J'
  if  ( hexstr=='e1'): return  'K'
  if  ( hexstr=='e6'): return  'L'
  if  ( hexstr=='e7'): return  'M'
  if  ( hexstr=='e4'): return  'N'
  if  ( hexstr=='e5'): return  'O'
  
  if  ( hexstr=='fa'): return  'P'
  if  ( hexstr=='fb'): return  'Q'
  if  ( hexstr=='f8'): return  'R'
  if  ( hexstr=='f9'): return  'S'
  if  ( hexstr=='fe'): return  'T'
  if  ( hexstr=='ff'): return  'U'
  if  ( hexstr=='fc'): return  'V'
  if  ( hexstr=='fd'): return  'W'
  if  ( hexstr=='f2'): return  'X'
  if  ( hexstr=='f3'): return  'Y'
  if  ( hexstr=='f0'): return  'Z'
  if  ( hexstr=='f1'): return  '['
  if  ( hexstr=='f6'): return  '\\'
  if  ( hexstr=='f7'): return  ']'
  if  ( hexstr=='f4'): return  '^'
  if  ( hexstr=='f5'): return  '_'

  

#03 fc ef 04 07 ef f9 0c 6f
#   V   E  R  B  A  T  I  <
#   |      |
#         xor (fc,04) = f8

def xor_str(a,b):
    result = int(a, 16) ^ int(b, 16) # convert to integers and xor them
    return '{:x}'.format(result)     # convert back to hexadecimal
   
def byte_translate(_16byte_string):
 print ('_16byte_string',_16byte_string)
 hexstr=''
 i=0
 hexstr=[0,0,0,0,0,0,0,0,0]
 for j in range(0,16,2):
  code=''
  hexstr[i] = _16byte_string[j] + _16byte_string[j+1]
  if j<3:
        #print(j,'=jhexstr',hexstr[i],
        print('decoded char    ',  byte_char (hexstr[i])  )
        #if (byte_char (hexstr) == None): continue

  if j>2:
       print('decoded with XOR',  byte_char (xor_str(hexstr[i], hexstr[i-2] ) ))
  i=i+1     
 return 


with open('FILENAME.Bin', 'rb') as f:
    hexdata = f.read().hex()
f.close()
LenHex=len(hexdata)
if (LenHex<1000 or hexdata[0:12] != '4e4f44494e4e') : # in my case it was 4e4f44494e4e
     print (LenHex)
     print ("wrong file format")
     print ( hexdata[0:12])
     exit(0)
#if protection level=04
#decrease level down to 03
#change CRC

# if result None that means  here is wrong place for password

for i in range (0, LenHex - 15):  #in my case poiner was 48510
    if  ( hexdata[i]=='0' and ( hexdata[i+1]=='3' or  hexdata[i+1]=='4') ):
      if (hexdata[i+2]=='8' or hexdata[i+2]=='9' or  hexdata[i+2]=='e' or hexdata[i+2]=='f'):
           print ('pointer', i, hexdata[i:i+20])
           byte_translate( hexdata[i+2:i+18])
    i=i+18
      
exit(0)