Тайна золотого ключика или Особенности системы лицензионных ключей, используемой компанией Software AG — Архив WASM.RU
Лицензионный ключ - штука весьма распространенная в современном компьютерном мире, а потому хорошо исследованы как методы защиты, так и нападения Эта статья не имеет своей целью обескуражить мир сообщением о принципиально новом методе подлома/подбора/обхода ключа. Основная цель немного другая
- Посмотреть, как реализована система лицензирования на примере довольно дорогих коммерческих продуктов от компании Software AG
- А также показать на реальном примере, что иногда вовсе не обязательно проводить все ночи напролет, закопавшись в отладчике или дизассемблере, чтобы корректно "поправить" лицензионный ключ (цели "правки" могут быть любыми), что иногда достаточно просто пошире открыть глаза…
Чтобы придать статье некую логическую последовательность, попробую дать ответы на вполне закономерные вопросы:
- Что же это за компания такая - "Software AG"?
- В чем суть пресловутой системы лицензионных ключей?
- И в чем, собственно, особенности этой системы?
Software AG
В те стародавние времена, когда компьютеры были большими, а программисту при поступлении на работу выдавался не навороченный комп в персональное пользование, а линейка, карандаши, ручка и график работы на "машине" (именно так любовно назывался монстр, стучащий копытом по фальшполу в машзале в окружении ленточных стоек и ЦПУ), эта немецкая компания была более известна, чем сейчас, благодаря своим довольно известным в СССР продуктам ADABAS (СУБД) и NATURAL (язык программирования). Сегодня же редкий специалист по ИТ сможет вспомнить, "что это за зверь, и с чем его едят".
Немного информации о компании (информация взята с ее официального сайта).
- Название - Software AG (принятое сокращение SAG)
- Официальный сайт - http://www.softwareag.com, http://www.softwareag.com/ru - на русском языке
- Год основания - 1969
- Головной офис - г. Дармштадт (Германия)
- Количество сотрудников - более 2 600 чел
- Валовой доход - 411 млн. евро (по 2004 г)
- Направление деятельности - "разработка, продажа, последующее обслуживание и сопровождение высокоэффективных программных продуктов, служащих основой для интеграции информационных систем предприятия".
- Дополнительно - более 3000 заказчиков (в более чем 60 странах мира)
Линейка основных программных продуктов:
- ADABAS - быстродействующая СУБД, предназначенная для использования в больших системах, работоспособность которых жизненно важна для предприятия
- NATURAL - мощный сервер приложений компании Software AG, позволяющий разработчикам быстро создавать критически важные приложения1
- ENTIREX - надежное, высокопроизводительное интеграционное программное обеспечение, позволяющее организациям использовать функциональность унаследованных систем при разработке новых приложений
- TAMINO XML Server - высокопроизводительный сервер для хранения, управления, публикации и обмена XML - документами
Перечень представительств есть на сайте компании. Если у вас по прочтении статьи возникнет непреодолимое желание познакомиться с продуктами SAG поближе, проще всего обратиться в ближайшее представительство - на сколько я знаю, проблем предоставлением ознакомительных версий нет. Второй вариант - залить дистрибутив с сайта компании.
Что ж, если верить тому что написано, перед нами вполне солидная компания… Похоже, есть что продавать (увы, не в России!), и значит, есть, что лицензировать… Так что там с системой лицензионных ключей?
Система лицензионных ключей
Прежде чем говорить про лицензионные ключи, хотелось бы отметить одну особенность - в продуктах SAG система лицензирования - это не система защиты от взлома. По мнению представителей компании, от взлома их защищают сам договор лицензии и закон. А система лицензирования - скорее средство оградить заказчика от установки продуктов "куда попало" - например, Natural for Windows 2000/XP не будет нормально работать под Windows98/ME (нечто подобное и с unix'ами).
Условности соблюдены, теперь за дело!
Продукты SAG в последнее время используют так называемый "файл лицензии", являющийся по сути xml-файлом, и содержащим информацию о продукте и об условиях его поставки. Именно здесь находится информация о сроке действия лицензии, об операционной системе, о доступных компонентах продукта и проч. Вполне логично, что он используется как при установке продукта (отсюда берется информация о том, какие компоненты устанавливать, а какие нет; проверяется "среда обитания" продукта ), так и при эксплуатации (проверяется "среда обитания" продукта). Проверка "Среды обитания" - проверяется заявленная и фактическая ОС, и проверяется срок действия лицензии.
Пример файла лицензии (взят из форума http://tamino.forums.softwareag.com2):
Код (Text):
<SoftwareAG_License> <Component Id="SalesInfo"> <SerialNumber>0000004680</SerialNumber> <LicenseKey>A7B77D8CC2B46E9C5821DEC41B9B9CE0</LicenseKey> <CustomerID>SAG</CustomerID> <CustomerName>Software AG</CustomerName> </Component> <Component Id="ProductInfo"> <ExpirationDate>30days</ExpirationDate> <OS>w2000p, w2000s, winxp_pro, winxp_per</OS> <ProductCode>INS</ProductCode> <ProductID>INS414FSETWIN</ProductID> <ProductName>Tamino XML Server</ProductName> <ProductVersion>4.1.4</ProductVersion> <Usage>XML Starter Kit 4</Usage> <RegistryDate>2005/06/30</RegistryDate> </Component> <Component Id="TaminoServer"> <XTension>yes</XTension> <ConcurrentSessions>3</ConcurrentSessions> <DatabaseSize>20</DatabaseSize> <CPU>1</CPU> <XML>yes</XML> <Logging>yes</Logging> <AdditionalTokenizedLanguages>chinese, japanese, korean</AdditionalTokenizedLanguages> <Readonly>no</Readonly> </Component> <Component Id="TaminoEnterprise"> <ExternalBackup>no</ExternalBackup> <Replication>yes</Replication> <SNMP>no</SNMP> </Component> <Component Id="TaminoXNode"> <DBMS>SQL Server, Microsoft SQL Server, ACCESS, Informix, DB2, Oracle, ADABAS, ADABAS D </DBMS> </Component> </SoftwareAG_License>Любая попытка модифицировать этот файл (например, продлить срок лицензии, изменить ОС и т.д.) заканчивается сообщением об "инвалидности файла лицензии" при запуске продукта.
Небольшое расследование показывает, что все функции, необходимые для работы с лицензионным файлом, собраны в одной библиотеке (очень удобно - и вашим и нашим!) с незатейливым именем saglic.dll, устанавливаемой в папку %CommonProgramFiles%\Software AG. Имена экспортируемых этой библиотекой функций весьма красноречивы. Пройдемся по ключевым функциям:
Код (Text):
LIC_read_Parameter LIC_checkExpiration LIC_checkOS LIC_checkSignature LIC_genSignature LIC_set_trace_levelLIC_read_Parameter
Прототип функции:
Код (Text):
int LIC_read_Parameter ( char *, // (in) указатель на имя файла лицензии char *, // (in) укзатель на название компонента char *, // (in) указатель на название поля в компоненте char **, // (out) адрес указателя на значение поля) )Назначение: Получить значение заданного поля.
Примечание: Необходимо иметь в виду, что LIC_read_Parameter() вызывает LIC_checkExpiration(), т.е. вначале проверяется валидность ключа.LIC_checkExpiration
Прототип функции:
Код (Text):
int LIC_ checkExpiration( char *, // (in) указатель на имя файла лицензии char * // (in) указатель на название компонента ("ProductInfo") )Назначение: Проверка срока действия лицензии.
Примечание: В этой функции "рабочей лошадкой" является полефайла лицензии. Функция считает поле "валидным", если его значение задано одним из трех способов:
- <ExpirationDate>Unlimited</ExpirationDate>
- <ExpirationDate>YYYY/MM/DD</ExpirationDate> (YYYY-год, ММ - месяц, DD - день, т.е. дата завершения лицензии)
- <ExpirationDate>Ndays</ExpirationDate> (N - количество дней действия лицензии)
При способе "Ndays" делается попытка найти значение
(задается в формате YYYY/MM/DD). Если поле отсутствует - берется текущая дата. Подсчитывается дата завершения действия лицензии и заносится в в формате YYYY/MM/DD. Производится пересчет . Т.е. такой способ задания значения "живет" до первого вызова LIC_checkExpiration, после которого превращается в способ "YYYY/MM/DD" LIC_checkOS
Прототип функции:
Код (Text):
int LIC_checkOS ( char *, // (in) указатель на имя файла лицензии char * // (in) указатель на название компонента ("ProductInfo") )Назначение: Проверка соответствия фактической операционной системы и заданной в лицензии.
Примечание: В этой функции "подопытным" является поле. Как можно увидеть из примера, в этом поле допустимо перечисление "лицензированных" операционных систем. Помимо явного задания допустимых ОС (например, w2000p - Windows 2000 Professional), возможно задать группу ОС (например, w2000). Чуть ниже я покажу простой способ определения ОС в идентификации SAG, отмечу лишь, что возможно использование ключевых слов "any" или "win" в этом поле (т.е., становится возможным эксплуатировать продукт SAG под любой - в первом случае - ОС, либо под ОС семейства Windows - во втором случае), но злоупотреблять, конечно же, этим не стоит
LIC_checkSignature
Прототип функции:
Код (Text):
int LIC_checkSignature ( char *, // (in) указатель на имя файла лицензии )Назначение: Проверка соответствия фактического хэш-значения файла лицензии и операционной системы и "эталонного" (хранящегося непосредственно в файле лицензии).
Примечание: В этой функции "козырным" является поле. Проверка осуществляется следующим образом. Лицензионный файл "хэшируется" (поле LicenseKey в этой процедуре не участвует) и происходит его сравнение (увы, операция сравнения производится в явном виде) со значением LicenseKey. По словам разработчиков и по отладочной информации можно предположить, что сей хэш рассчитывается по MD5-алгоритму. Может быть и так, не проверял. LIC_genSignature
Прототип функции:
Код (Text):
int LIC_genSignature ( char *, // (in) указатель на имя файла лицензии )Назначение: ???
Примечание: Исходя из названия, можно предположить, что это - функция генерации. Но нам остается только предполагать, т.к. в Public - версии библиотеки saglic.dll реализации функции отсутствует (вывод отладочной информации - не в счет! Об отладочной информации я расскажу чуть ниже) LIC_set_trace_level
Прототипы функции:
Код (Text):
int LIC_set_trace_level ( int , // (in) уровень трассировки char * // (in) указатель на имя трассируемой функции // (не используется) int // (in) номер строки // (не используется) ) int LIC_set_trace_level ( int // (in) уровень трассировки )Назначение: Установка уровня трассировки
Примечание: Этой функцией устанавливается "глобальный уровень трассировки" (название условно). Вся отладочная информация выводится функциями библиотеки не напрямую, а через специальную подпрограмму, одним из параметров которой является "локальный уровень трассировки". Эта подпрограмма сравнивает "глобальный уровень" и "локальный уровень", если "локальный уровень" не меньше "глобального", то информация выводится, иначе - нет.Коды возврата
- 0 LICENSE OK
- 1 ERROR - LICENSE KEY NOT FOUND
- 2 ERROR - INVALID (TAMPERED) LICENSE KEY
- 3 ERROR - INVALID (TAMPERED) LICENSE KEY (действительно повтор!)
- 4 ERROR - PARAMETER NOT FOUND IN LICENSE KEY
- 5 ERROR - COMPONENT NOT FOUND IN LICENSE KEY
- 6 ERROR - MISSING PARAMETER(S) - SEE FUNCTION USAGE
- 7 ERROR - MISSING WINSOCK DLL ON WIN32
- 8 ERROR - WRONG WINSOCK DLL (BELOW 1.0 ] ON WIN32
- 9 ERROR - SOCKET CANNOT BE OPENED
- 10 ERROR - HOST CANNOT BE FOUND IN HTTP ADDRESS
- 11 ERROR - HOST CANNOT BE OPENED IN HTTP ADDRESS
- 12 ERROR - HOST CANNOT BE OPENED IN HTTP ADDRESS
- 13 ERROR - CANNOT CREATE LICENSE USING EXTERNAL LIC VERSION
- 14 ERROR - CANNOT ALLOCATE MEMORY
- 15 ERROR - LICENSE EXPIRED
- 16 ERROR - INVALID LICENSE OS
- 17 ERROR - CANNOT CREATE FIRST WINDOWS REGISTRY KEY
- 18 ERROR - CANNOT ACCESS WINDOWS REGISTRY
- 19 ERROR - READING LICENSE KEY FILE
- 20 ERROR - TRIAL LICENSE KEY FILES must NOT be WRITE-PROTECTED and MUST be passed as a PATHNAME (not CONTEN TS).
- 21 ERROR - CONVERTING ASCII-TO-EBCDIC (OR VICE-VERSA)
- 22 ERROR - SYSTEM COMMAND (I.E., UNAME)
- 23 ERROR - CANNOT READ LOCAL SAG SECURITY PROFILE
- 24 ERROR - WRITING to LICENSE KEY FILE
Думаю, разбор потрохов пора завершать.
Если по-крупному, действительно защита отсутствует напрочь ("крутой" алгоритм хэширования не в счет!). Логика системы лицензирования понятна, и очень сильно облегчают понимание этой логики красноречивые имена экспортируемых функций не менее красноречивой saglic.dll, а также обилие отладочной информации.
"Тоже мне, диковина!" - воскликнет проницательный читатель. - "Да такие чудеса на каждом углу по 10 копеек кулек!"
Ну что ж, настало время десерта…
Особенности системы лицензионных ключей
Пикантность ситуации заключается в том, что вместе с установкой основного продукта, на ваш компьютер устанавливается и своеобразный бонус от Software AG в виде двух утилит, уютно разместившимся в папке %Common Files%Software AG (Вообще-то подарков больше, но нужно же знать меру!). Речь пойдет о sagver.exe и saglicExeWrapper.exe.
sagver.exe
Попробуем выполнить ее для начала без параметров (лучше из консольного файл-менеджера, и лучше перенаправить вывод потока в файл).
Что это? А это, дорогие читатели, ни что иное, как описание свойств файлов, содержащихся в текущей (%Common Files%Software AG) папке. Конечно, эту же информацию можно получить и из Проводника (правая кнопка мыши -> Свойства ->Вкладка "Версия"), но это долго и не очень удобно, если нужно просмотреть описание многих файлов.
Судя по всему, описания файлов довольно полные, а не попробовать ли нам поискать что-нибудь на лицензионную тему, по подстроке поиска, скажем, "lic"? Сказано - сделано! А вот и старый знакомый
Описание свойств saglic.dll:
Код (Text):
Software AG Version Information for .\saglic.dll Company - Software AG Description - Software AG Licensing Services API Product Version - 1.4.0 Internal Name - SAGLIC DLL Copyright - (C) Copyright Software AG 1995-2003. All rights reserved. Product Name - saglic Patch Level - 10 Build Number - 1 Release - Release File OS - Windows 32-Bit File Type - Dynamic Link Library Windows Numeric Version Info for .\saglic.dll File Version - 1.4.0.10 Product Version - 1.4.0.10 Windows String Version Info for .\saglic.dll Comments - Public-use DLL Company Name - Software AG File Description - Software AG Licensing Services API File Version - 1.4.0.10 Internal Name - SAGLIC DLL Legal Copyright - (C) Copyright Software AG 1995-2003. All rights reserved. Original Filename - saglic.dll Product Name - License System Product Version - 1.4.0 Special Build - PUBLIC(То же самое можно получить, набрав в командной строке sagver saglic.dll)
Итак, с sagver.exe более-менее понятно - эта утилита вытаскивает описание свойств заданного файла, а если файл не задан - сканирует библиотеку и выдает описание всех содержащихся в ней файлов. Правда, нужно отметить, что "подсунув" этой утилите "чужой" файл, мы разочаруемся - утилита не выдаст никакой информации. Фокус в том, что она (утилита) проверяет содержимое "подопытного" файла на присутствие определенной сигнатуры (или по образному выражению разработчиков SAG "EyeCatch"), которая является началом структуры, содержащей служебную информацию о файле (т.е. описание его свойств). Маленькая подсказка для любознательных - утилита sagver.exe тоже может вывести отладочную информацию, если ее хорошо попросить - например, создать переменную окружения SVRLOG со значением 0xFFFF.
Однако, помимо уже знакомой нам saglic.dll, мы наткнемся и на saglicExeWrapper.exe, тоже относящуюся к License System. А это что за чудо-утилита?
saglicExeWrapper.exe
Еще раз отдадим должное разработчикам SAG - название говорит само за себя! Эта утилита - обертка вокруг saglic.dll, в которой собраны все функции, связанные с системой лицензирования.
Попробуем ее выполнить без параметров.
Синтаксис вызова saglicExeWrapper.exe:
Код (Text):
PRODUCT NAME: saglicExeWrapper (SAGLIC EXE) (C) Copyright Software AG 1995-2003. All rights reserved. DESCRIPTION: Software AG Licensing Services API VERSION: 1.4.0 PATCH LEVEL: 10 BUILD TYPE: PUBLIC USAGE: saglicExeWrapper.exe 0 List LICLOG <trace_level> options saglicExeWrapper.exe 1 <xmlfile_in> <component> <parameter> [<trace_level>] LIC_read_parameter() called with the middle 3 parameters saglicExeWrapper.exe 2 <xmlfile_in> <xmlfile_out> [<trace_level>] LIC_genSignature() called with the middle 2 parameters saglicExeWrapper.exe 3 <xmlfile_in> [<trace_level>] LIC_checkSignature() called with the middle parameter saglicExeWrapper.exe 4 <xmlfile_in> <component> [<trace_level>] LIC_checkExpiration() called with the middle 2 parameters saglicExeWrapper.exe 5 <xmlfile_in> <component> [<trace_level>] LIC_checkOS() called with the middle 2 parameters saglicExeWrapper.exe 6 [<trace_level>] LIC_checkExpiration() called with DIRECT INPUT of an internal Trial ('90 Days') License Certificate. (THIS SHOULD FAIL!) saglicExeWrapper.exe 7 LIC_validOS() called with no parameters For example: saglicExeWrapper.exe 5 ino223.xml TaminoProduct CHECK_OSВзгляните, перед нами действительно практически все экспортируемые saglic.dll функции!
Думаю, не стоит повторяться с описанием параметров вызова saglicExeWrapper.exe - посмотрите описание экспортируемых функций saglic.dll, все то же самое. Единственное, на что хотелось бы обратить ваше внимание, на необязательный параметр trace_level.
Понятно, что он как-то связан с уровнем трассировки, используемым функциями saglic.dll, но как? Может быть, утилита нам сама подскажет?
Выполняем saglicExeWrapper.exe 0 /?.
Код (Text):
LICLOG <trace_level> DESCRIPTION --------------------------------------------------------- 0x0001 ERR Trace error conditions 0x0002 EXT Trace external LIC API functions 0x0004 INT Trace internal LIC functions 0x0008 DBG Trace debugging info 0x0010 CHECK_OS LIC_checkOS function only 0x0020 CHECK_EXP LIC_checkExpiration function only 0x0040 READ_PARM LIC_read_parameter function only 0x0080 CHECK_SIG LIC_checkSignature function only 0x0100 GEN_SIG LIC_genSignature function only 0x0200 FREE_PARM LIC_freeParameter function only 0x0400 SOCKETS Socket-related operations only 0x0800 UTILS Utility functions only 0x1000 MD5 MD5 (Message Digest) functions only 0x2000 UNUSED UNUSED 0x4000 LOG Trace LOG functions only 0x8000 LOG_FILE LOG to a local file in TMP directory 0x03f0 HIGH_LEVEL High Level (LIC) functions only 0x1c00 LOW_LEVEL Low Level operations only 0xffff LOG_ALL Log ALL Trace Levels Trace Level(s) may be set using TWO different methods: 1. Via the LICLOG environment variable when set to the SUM of the appropriate HEX value(s) shown above. For example, to trace the LIC_checkOS() and LIC_read_parameter() functions, set LICLOG = (0x0008 + 0x0010 + 0x0040) = 0x0058 (Set LICLOG directly to trace LIC functions called directly from applications such as Tamino.) 2. Via the optional <trace_level> argument in this executable Example 1: saglicExeWrapper 5 ino223.xml TaminoProduct CHECK_OS READ_PARM traces the LIC_checkOS() and LIC_read_parameter() functions. Example 2: saglicExeWrapper 5 ino223.xml TaminoProduct CHECK_OS LOG_FILE will send LIC_checkOS() Trace output to a temporary file.Хорошо, и что со всем этим "добром" делать?
Первое, что идет на ум, все же попробовать saglicExeWrapper.exe с параметром 2 ( LIC_genSignature() ). Понятно, что в saglic.dll эта функция "недореализована", но вдруг эта реализация есть в saglicExeWrapper.exe?
Итак: saglicExeWrapper.exe 2 ino414.xml test.xml
Похоже, чудо не случилось.
Код (Text):
LIC_genSignature()... License File (IN) = ino414.xml License File (OUT) = test.xml 13: ERROR - CANNOT CREATE LICENSE USING EXTERNAL LIC VERSIONТак, а что если попробовать saglicExeWrapper.exe с параметром 3 ( LIC_checkSignature() )? Да не просто так, а с полной трассировкой, авось что-нибудь выудим!
saglicExeWrapper.exe 3 ino414.xml LOG_ALL
(LOG_ALL - именно в верхнем регистре)После долгого мелькания отладочной информации должны получить нечто вроде такого
Код (Text):
MD5_memcpy(): { Encode(): { MD5_memset(): { SAG_certification(): aSig[0] = A7 SAG_certification(): aSig[1] = B7 SAG_certification(): aSig[2] = 7D SAG_certification(): aSig[3] = 8C SAG_certification(): aSig[4] = C2 SAG_certification(): aSig[5] = B4 SAG_certification(): aSig[6] = 6E SAG_certification(): aSig[7] = 9C SAG_certification(): aSig[8] = 58 SAG_certification(): aSig[9] = 21 SAG_certification(): aSig[10] = DE SAG_certification(): aSig[11] = C4 SAG_certification(): aSig[12] = 1B SAG_certification(): aSig[13] = 9B SAG_certification(): aSig[14] = 9C SAG_certification(): aSig[15] = E0 SAG_certification(): returned 0 SAG_certification(): } LIC_checkSignature(): returned 0 LIC_checkSignature(): } 0: LICENSE OKСмотрите, а ведь последовательность A7B77D8CC2B46E9C5821DEC41B9B9CE0 не что иное, как
нашего файла лицензии! Как минимум, любопытно… Но ведь не для того утилита долго что-то рассчитывала, чтобы в итоге выдать нам лицензионный ключ, прочитанный из файла лицензии!
Почему бы не попробовать модифицировать файл лицензии и посмотреть, изменится ли эта последовательность! Что ж, попробуем… Подкорректируем дату регистрации (
2006/01/01 ), сохраним его с именем _ino414.xml и "натравим" на него saglicExeWrapper.exesaglicExeWrapper.exe 3 _ino414.xml LOG_ALL
Код (Text):
MD5_memcpy(): { Encode(): { MD5_memset(): { SAG_certification(): aSig[0] = 9E SAG_certification(): aSig[1] = 1F SAG_certification(): aSig[2] = 58 SAG_certification(): aSig[3] = B4 SAG_certification(): aSig[4] = FB SAG_certification(): aSig[5] = 3B SAG_certification(): aSig[6] = D7 SAG_certification(): aSig[7] = 1D SAG_certification(): aSig[8] = D6 SAG_certification(): aSig[9] = 73 SAG_certification(): aSig[10] = 14 SAG_certification(): aSig[11] = 3B SAG_certification(): aSig[12] = 91 SAG_certification(): aSig[13] = D SAG_certification(): aSig[14] = 99 SAG_certification(): aSig[15] = 18 SAG_certification(): returned 0 SAG_certification(): } LIC_checkSignature(): returned 3 LIC_checkSignature(): } 3: ERROR - INVALID (TAMPERED) LICENSE KEYОднако, последовательность совсем другая! Может быть, это как раз то хэш-значение, с которым и сравнивается LicenseKey из файла лицензии? Если наши рассуждения верны, и это и есть "правильный" LicenseKey , то поставив заветную последовательность (не забывая про ведущий нолик для значений aSig[], меньших 0x10) в поле LicenseKey файла _ino414.xml, мы должны бы получить "0: LICENSE OK"
Пробуем!
Результат выполнения saglicExeWrapper.exe с параметром 3 (LIC_checkSignature):
Код (Text):
MD5_memcpy(): { Encode(): { MD5_memset(): { SAG_certification(): aSig[0] = 9E SAG_certification(): aSig[1] = 1F SAG_certification(): aSig[2] = 58 SAG_certification(): aSig[3] = B4 SAG_certification(): aSig[4] = FB SAG_certification(): aSig[5] = 3B SAG_certification(): aSig[6] = D7 SAG_certification(): aSig[7] = 1D SAG_certification(): aSig[8] = D6 SAG_certification(): aSig[9] = 73 SAG_certification(): aSig[10] = 14 SAG_certification(): aSig[11] = 3B SAG_certification(): aSig[12] = 91 SAG_certification(): aSig[13] = D SAG_certification(): aSig[14] = 99 SAG_certification(): aSig[15] = 18 SAG_certification(): returned 0 SAG_certification(): } LIC_checkSignature(): returned 0 LIC_checkSignature(): } 0: LICENSE OKОго! Работает!!!
Что ж, осталось собрать полученную информацию об "особенностях системы лицензирования" воедино.
Чтобы получить корректный файл лицензии после его модификации необходимо:
saglicExeWrapper.exe 3 lic_file.xml GEN_SIG 4. Полученную последовательность занести в поле "LicenseKey" файла лицензии (не забывая про ведущий ноль!) и проверить на отсутствие ошибок. saglicExeWrapper.exe 3 lic_file.xml
Убедиться, что наша ОС соответствует тому, что задано в файле лицензии. Для этого используем утилиту saglicExeWrapper.exe
saglicExeWrapper.exe 7
Если в файле лицензии нет ни одного из предложенных значений ОС - правим значение поля "OS" файла лицензии в соответствии с "рекомендациями" saglicExeWrapper.exe . Напомню, что самым общим является значение "any", менее общим для семейства Windows - "win". Это менее корректный вариант, но в этом случае необходимости использовать утилиту saglicExeWrapper.exe нет.
- Убедиться, что срок действия лицензии не истек. Если есть необходимость, правим значение поля "ExpirationDate". Напомню, здесь допустимо значение "Unlimited"
- Рассчитать новое значение LicenseKey, используя saglicExeWrapper.exe в режиме трассировки (достаточно уровня GEN_SIG)
В принципе, должно работать. Если получаете ошибку "3: ERROR - INVALID (TAMPERED) LICENSE KEY", проверьте еще разок, правильно ли переписали значение LicenseKey.
На эту процедуру у вас едва ли уйдет более 2 минут. Причем, заметьте, результат получается исключительно благодаря своей голове и замечательному подарку от компании Software AG в виде утилиты saglicExeWrapper.exe
Хорошо, а что делать, если вы устанавливаете самый первый продукт SAG (т.е. у вас нет ни папки %CommonProgramFiles%\Software AG, ни saglicExeWrapper.exe), а вам очень нужно "поправить" файл лицензии до инсталляции (например, вам нужно установить компонент, не входящий в демо-лицензию)? Проще всего найти на установочном диске папку Windows\BTY, а в ней - файл data1.cab. Нужно извлечь из этого архива 2 файла saglic.dll и saglicExeWrapper.exe (в архиве они находятся в весьма неприглядном виде, например, saglic.dll.44FFEB35_100E_11D6_A6C8_00300501EF6A, поэтому после извлечения переименуйте их так, как положено). Извлечь можно WinRar'ом, либо любым другим упаковщиком, понимающим формат .cab. В эту же папку скопируйте свой лицензионный файл и дальше действуйте по общей схеме.
Заключение
Вот некоторые замечания, которые пришли мне на ум, когда я разбирался с пресловутой "системой лицензирования":
- Как отмечалось выше, отсутствие защитных механизмов в системе лицензирования продуктов компании Software AG не делает им чести. И использование MD5- алгоритма сильно ситуацию не исправляет - как вы видите, вполне можно обойтись и без знания тонкостей хэширования, чтобы делать с лицензионным файлом все, что душа пожелает. Но если разработчики считают, что закон их оберегает надежнее, чем они сами себя - что ж, это их право.
- Возможность трассировки - штука несомненно полезная, но только не в системе защиты/лицензирования! По крайней мере, это просто не очень разумно.
- Наличие утилит для внутреннего служебного пользования (к которым без всякого сомнения относятся sagver.exe и saglicExeWrapper.exe) в дистрибутиве вообще не поддается разумному объяснению! Причем эти утилиты помещаются в дистрибутивы большинства продуктов SAGа из версии к версии…
Выявленные изъяны не стали неожиданностью для разработчиков Software AG. Остается только понадеется, что следующие версии продуктов Software AG станут более защищенными.
1 В настоящее время готовится к публикации описание p-кода, используемого в NATURAL (будем надеяться, что автор выполнит это обещание - прим.ред.).
2 Полный адрес http://tamino.forums.softwareag.com/download.php?id=774&sid=96bcb784da946a6dec504a291d84801d (для зарегистрированных пользователей). © Konstantin
Тайна золотого ключика или Особенности системы лицензионных ключей, используемой компанией Software AG
Дата публикации 6 мар 2006