Анализ защиты регистрационным ключом в библиотеке S7-OPEN MODBUS/TCP
Дата: 2015-01-11
Добавлено: komatic
Тема: SCL
Разбираем вариант защиты программного обеспечения для контроллеров Siemens.
Содержание:
Описание
Получаем ключ отладкой
Выделяем код генерации ключа
Автономный генератор ключа
Описание
Защита применена в библиотеке COMM, функции MODBUSCP, предназначенной для обмена данными по протоколу S7-OPEN MODBUS/TCP.
Сама восстановленная функция MODBUSCP - здесь
Чтобы выполнить правильную регистрацию, необходимо выполнить следующие шаги (взято из официального руководтсва):
- Вызываем функцию MODBUSCP в организационном блоке регистрируемого CPU, открываем экземплярный блок данных, переходим в онлайн Ctrl+F3 и копируем строку IDENT_CODE.
- Посылаем эту строку по адресу [email protected] (попробовал проделать эту операцию, получил письмо с текстом "Your email is not read and not processed." и просьбой перейти по ссылке, неоднократно переходя по которой упираешься в надпись "Unfortunately there might be a temporary problem in accessing the data, but we are making every effort to clear any faults as quickly as possible. Please try again in a few minutes.
We apologize for any inconvenience."
Тупик вообщем :) - Получаем в ответ регистрационный ключ, который подаем на вход функции REG_KEY
- Регистрация закончена.
Если функция незарегистрирована, при работе контроллера получаем сообщения каждые 4 секунды, в буфере диагностики, об отсутствии лицензии и ошибки обращения к блоку данных.
Ошибка обращения к блоку данных, формируется строкой PT.IN:=DB0.DBX0.0;
Получаем ключ отладкой
Беглый обзор кода функции, показывает, что полученный REG_KEY сравнивается внутри кода посимвольно, что означает что правильный код генерируется внутри функции.
Попробуем найти этот сгенерированный код с помощью пошаговой отладки.
Получаем IDENT_CODE:
Задаем серийный номер как константу
(на симуляторе серийный номер CPU не читается).
Устанавливаем точку останова после генерации IDENT_CODE.
Находим IDENT_CODE в экземплярном блоке:
Находим REG_KEY:
Устанавливаем точку останова после генерации лицензионного ключа tAlicenseKey
Изменяем немного участок кода, чтобы ключ копировался в удобную для обработки область sSTATUS_CODE
Копируем результат:
Эта строка и есть сгенерированный ключ.
Проверяем результат:
Создаем блок данных, в который прописываем этот ключ.
Подаем ключ на вход блока:
Результат:
Выделяем код генерации ключа
Анализируя код генерации и последовательно упрощая довольно запутанный код, получаем упрощенный вариант (вариант на 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 можно получить код регистрации.
Просмотров: 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.
Добавить комментарий