Версия для печати

Анализ защиты регистрационным ключом в библиотеке S7-OPEN MODBUS/TCP

Дата: 2015-01-11

Добавлено: komatic

Тема: SCL




modbus



Разбираем вариант защиты программного обеспечения для контроллеров Siemens.




Содержание:

Описание

Получаем ключ отладкой

Выделяем код генерации ключа

Автономный генератор ключа



Описание


Защита применена в библиотеке COMM, функции MODBUSCP, предназначенной для обмена данными по протоколу S7-OPEN MODBUS/TCP.

Сама восстановленная функция MODBUSCP - здесь

Чтобы выполнить правильную регистрацию, необходимо выполнить следующие шаги (взято из официального руководтсва):



Если функция незарегистрирована, при работе контроллера получаем сообщения каждые 4 секунды, в буфере диагностики, об отсутствии лицензии и ошибки обращения к блоку данных.



modbus

Ошибка обращения к блоку данных, формируется строкой PT.IN:=DB0.DBX0.0;



Получаем ключ отладкой



Беглый обзор кода функции, показывает, что полученный REG_KEY сравнивается внутри кода посимвольно, что означает что правильный код генерируется внутри функции.
Попробуем найти этот сгенерированный код с помощью пошаговой отладки.



Получаем IDENT_CODE:





modbus

Задаем серийный номер как константу
(на симуляторе серийный номер CPU не читается).
Устанавливаем точку останова после генерации IDENT_CODE.



Находим IDENT_CODE в экземплярном блоке:





modbus

Копируем получившуюся строку.



Находим REG_KEY:





modbus

Устанавливаем точку останова после генерации лицензионного ключа tAlicenseKey
Изменяем немного участок кода, чтобы ключ копировался в удобную для обработки область sSTATUS_CODE



Копируем результат:





modbus

Эта строка и есть сгенерированный ключ.



Проверяем результат:





modbus

Создаем блок данных, в который прописываем этот ключ.



Подаем ключ на вход блока:





modbus

В ключе 17 символов.





Результат:





modbus

Ключ подходит.





Выделяем код генерации ключа



Анализируя код генерации и последовательно упрощая довольно запутанный код, получаем упрощенный вариант (вариант на PHP).



$serialn:='SC-W0VK37682008';
$tSProductID='MODCP2XV94501MB00';
  for ($i = 1; $i <=17; $i++)
  {
    $IDENT_CODE_arr[$i]=(($serialn_arr[$i] ^ $tSProductID_arr[$i]) % 13) + 65;
  }
$IDENT_CODE_arr[18]=50;
 

Генерация идентификационного кода IDENT_CODE



$sHoldingRegisterState_arr   =  ARRAY(0, 223, 32, 240, 67, 135, 170, 11, 0, 96, 159, 159, 33, 38, 64, 53, 0, 0, 1, 0, 0, 0, 0, 0 );
  for ($i = 1; $i <=17; $i++)
 {
    $tALicenseKey_arr[$i]=$IDENT_CODE_arr[$i] ^ ($sHoldingRegisterState_arr[$i-1] ^ ($i));
    $tALicenseKey_arr[$i]=($tALicenseKey_arr[$i] % 26) + 65;
 }
$tALicenseKey[18]=50;
 

Генерация регистрационного ключа REG_KEY



Как видно, ничего особо сложного нет.
Небольшой вывод: защита довольно слабая, хотя без шифрования кода функции и/или применения аппаратных ключей добиться большего вряд ли возможно.



Автономный генератор ключа



Введя здесь серийный номер вашего CPU можно получить код регистрации.







Enter serial number CPU


Enter Product ID


идентификационный код IDENT_CODE


регистрационный ключ REG_KEY






Просмотров: 53034

Комментарии к материалу

Добавлен: Paolo    Дата: 2015-01-17

Evaluation is pretty amazing,But it is better to be a key generator makes it possible to accept the "Product ID" as a variable

Добавлен: komatic    Дата: 2015-01-17

>Paolo
Good idea, done

Добавлен: Paolo    Дата: 2015-02-10

Is it valid for FB109 MB_PAC16?If 'yes' why it delete the " " and "." characters and wrong IDENT_CODE?

Добавлен: komatic    Дата: 2015-02-10

>Paolo
I think this generator incompatible with MB_PAC16, cause different product

Добавлен: Евгений    Дата: 2015-03-24

откуда взять serial number CPU и Product ID ?

Добавлен: komatic    Дата: 2015-03-25

серийный номер CPU легче всего посмотреть на самом CPU на этикетке,
Product ID это идентификатор библиотеки S7-OPEN MODBUS/TCP и конкретно для функций FB106,FB107,FB108 MB_CPCLI,MB_CPSRV,MODBUSCP он равен MODCP2XV94501MB00

Описанный генератор работает только для этого случая, для библиотек с другими Product ID подтверждений правильной работы пока не было.

Добавлен: Sergey    Дата: 2015-04-03

Не получается сгенерить правильный ключ. У меня CPU S7-315F. Серийный номер SC-E1TV7698. Идентификационный код расчитанный генератором ключа не совпадает с идентификационным ключем который можно посмотреть в DB108 'EHHGIDMABCMIDILEJ2'. Product IDMODCP2XV94501MB00.

Добавлен: Max    Дата: 2015-06-07

Опытным путём установил, что Product ID для новой версии MODPN2XV94501MB02 - в этом случае совпадает IDENT_CODE, который генерирует скрипт и блок в контроллере. А вот ключик не подошёл..

Добавлен: Zeta    Дата: 2015-08-26

Max, Sergey, the code above only works with the default product ID, because array [0, 223, 32, etc] is not a constant, but it's generated based on the product id, so it will be different with different products.
But you can do your own script (it's fun), starting from the real constants:
rcv_time = [1,2,4,8,16,32,64,128,1,2,4,8,16,32,64,128,1]
snd_time = [128,64,32,16,8,4,2,1,128,64,32,16,8,4,2,1,128]

also, putin suks

Добавлен: Max    Дата: 2015-09-04

Zeta, I'd tried to debug the new block, but didn't played with it enough time. The customer had bought the license :)

Maybe somewhen I'll finish it :)

Добавлен: Blendi    Дата: 2016-03-24

>komatic
Can you post your php source for pascal or delphi please ? Thanks.

Добавлен: Watchara    Дата: 2016-06-30

where to get the Product ID

Добавлен: Алексей    Дата: 2016-10-02

Все работает. Спасибо

Добавлен: x    Дата: 2016-11-18

Разобрался с генерацией лицензии для MODBUSPN, все получилось, блок принял лицензию.

От кода генерации MODBUSCP отличаются
1) Product ID = MODPN2XV94501MB02
2) HoldingRegisterState = (0,$DF,32,$E8,83,$97,$B2,3,0,96,$9F,$9F,33,38,64,53,0,0,1)

Вот тут набросал код генерации на паскале:
https://ideone.com/3ehALQ

Если кто будет пробовать, не забудьте ввести серийный номер в строке 13

Добавлен: dls.dls    Дата: 2017-09-22

Hello,
I am working with TIA V14;
I don't know where can i find the ident code.
The bloc name is: MODBUSPN, the version is V2.1
Could you help?
thank's

Добавлен: dls.dls    Дата: 2017-09-22

Sorry, i need the "Enter Product ID "

Добавлен: Александр    Дата: 2018-04-18

Х, а как сгенерировал HoldingRegisterState для Product ID?

Добавлен: saeed keihani    Дата: 2018-06-24

hi,
my cpu serial number is: SVPW4398273 and product ID:MODCP2XV94501MB11
but the license was genrated wrong.
IDENT_CODE which is genarated by your site is: EMHIEBGKJEFJKMBKK2 but when I have check in PLC the ID code is : EMCFCBGGLDGJKMBKK2.
for more information I use CPU 417 H and modebud TCP redundant more over I have to add this sentenced has been translated by GOOGLE Translate



Здравствуй,
мой серийный номер процессора: SVPW4398273 и идентификатор продукта: MODCP2XV94501MB11
но лицензия была изменена неправильно.
IDENT_CODE, который genarated вашим сайтом: EMHIEBGKJEFJKMBKK2, но когда у меня есть проверка PLC, код ID: EMCFCBGGLDGJKMBKK2.
для получения дополнительной информации я использую CPU 417 H и избыточность TCP-протокола modebud больше, чем я должен добавить, это приговор был переведен GOOGLE Translate

Добавлен: Petr    Дата: 2019-06-17

Здравствуйте.
Подскажите, как вы получили исходный код MODBUSCP в SCL?

Добавлен: BythE    Дата: 2019-11-03

Hello could you help me with tia portal v15
MODBUSCP V2
thanks

Добавлен: Jefferson    Дата: 2020-08-11

не нужен блок Modbus TCP CP Reg_ Key S7-300 с CP343-Lean. Я следую инструкциям, но не могу снять блокировку. Кто-нибудь может мне помочь?
Mne nuzhen blok Modbus TCP CP Reg_ Key S7-300 s CP343-Lean. YA sleduyu instruktsiyam, no ne mogu snyat' blokirovku. Kto-nibud' mozhet mne pomoch'?

Добавлен: Max    Дата: 2021-05-27

S C-W0VK37682008, this is the correct syntax for the serial number, the space character goes after the first letter, otherwise the script will generate the wrong license code

Добавлен: ROMAN    Дата: 2021-05-28

Огромное человеческое спасибо за ваш труд!

Добавлен: ROMAN    Дата: 2021-05-28

Вы очень помогли! Все работает на железяке !Проверено!

Добавлен: A    Дата: 2021-09-30

Использую TIA Portal v15.1, modbuspn (fb70)
Как найти ProductID для этого блока?
При вводе ProductID, приведенных выше, IDENT_CODE не совпадает с моим.

Добавлен: Pa_trick    Дата: 2021-10-06

There is a way to quickly brute-force the REG_KEY also for MODBUSPN ver. 4. Just look at a certain variable in the instance DB when in OB121...

Добавлен: L D[AR2,P#0.0]    Дата: 2021-12-15

Hi guys,
I was analyzing the protection of the 5.0 version of the FB905 MODBUSCP.
I noticed that it was encrypted.
How can I see which holding register arrays have been used?

Добавлен: L D[AR2,P#0.0]    Дата: 2021-12-23

@saeed keihani, your's is wrong cpu serial number, shuld be 16char.

Добавлен: Pa_trick    Дата: 2021-12-29

Hello
What I meant is this, look at this code taken from above:

FOR i:=0 TO 16 BY 1 DO
IF tALicenseCode[i]<>sACODE[i] THEN
licensed := FALSE;
EXIT
...

then (I suppose) they cause the programming error interrupt (OB121) to occur WITHOUT resetting i which is a STATIC var. so in OB121 you can cycle each char of the REG_KEY independently from the others based on the value of i and thus you can quickly make the PLC itself brute-force the correct key. I dont know if in the latest versions they corrected this or not.

Добавить комментарий

Ваше имя:

Текст комментария (4000 max):

Введите сумму с картинки: