senselock
Cоздание удобной, гибкой, и в то же время безопасной системы лицензирования и удаленного обновления данных является одной из основных задач при защите программного обеспечения. К сожалению, большинство уже существующих решений не удовлетворяют сразу всем этим условиям. В большинстве случаев слабым местом является защищенность самой системы и отсутствие реальной связи между результатом проверки лицензий и функционирования программы. У злоумышленника всегда есть возможность изменить функцию проверки лицензии (обычно для этого необходимо просто заставить ее возвращать “1” или “0”) и этого будет достаточно, чтобы программа считала, что ее модуль или опция разрешены к использованию. А информацию для обновления электронных ключей легко подменить или изучить.
В созданной нами системе лицензирования и удаленного обновления для электронных ключей SenseLock серии EL4 (кроме модели EL4-NET-RTC) мы постарались устранить этот недостаток, сохранив при этом гибкость настроек и простоту использования.
Для работы c системой лицензирования и создания пакетов удалённого обновления, необходимо наличие мастер-ключа. Только с его помощью могут быть созданы пакеты обновлений, лицензии и записаны данные в ключи пользователей. Мастер-ключ предоставляется клиентам нашей компании по запросу. Доступ к мастер-ключу осуществляется посредством ввода пароля. Без правильного пароля создание ключей пользователя, лицензий и пакетов удаленного обновления будет невозможно.
Этот модуль предназначен для создания ключей пользователей и записи в них исполняемых модулей системы удаленного обновления и лицензирования .
Модуль “Программирование ключей” также позволяет производить следующие действия:
Также при создании ключа пользователя в него сразу могут быть записаны пакет обновления с исполняемыми модулями защиты разработчика ПО и пакет лицензий.
Система безопасного удаленного обновления в первую очередь предназначена для дистанционного перепрограммирования содержимого ключа пользователя. Разработчик защиты может изменять любые файлы, как исполняемые, так и файлы данных на стороне пользователя, не опасаясь, что их содержимое станет известно третьим лицам.
Основные возможности системы удалённого обновления:
Основные возможности системы лицензирования:
Использование модуля системы лицензирования с защищенным программным обеспечением происходит в два этапа:
Вызов исполняемого модуля лицензирования для получения и проверки лицензии
Вызов исполняемого модуля защищенного приложения для выполнения основных функций
Дополнительные функции системы лицензирования позволяют:
Пример получения лицензии и последующий вызов функции исполняемого модуля разработчика:
#define LIC_MODULE_1 0x01
#define LIC_MODULE_1_VER 0x0100
// Код программы ...
/* Получение лицензии */
error = SLM_LicCheckout(&s4ctx, LIC_MODULE_1, LIC_MODULE_1_VER);
if (error != ERR_LM_SUCCESS)
{
printf("Ошибка получения лицензии: %08X\n", error); return -1;
}
/* Выполнение защищённой функции в электронном ключе */
error = ProtectedFunction1(param1, param2, &result);
if (error != 0)
{
printf("Ошибка выполнения функции: %08X\n", error);
} else
{
printf("Результат выполнения: %08X\n", result);
}
// Код программы ...
/* Освобождение полученной лицензии */
SLM_LicCheckin(&s4ctx, LIC_MODULE_1);
Пример проверки статуса лицензии в исполняемом модуле разработчика:
DEFINE_AT(LM_STATUS_t, lic_stat, 0x0400, RAM_EXT);
DEFINE_AT(unsigned char, reserved[150], 0x040B, RAM_EXT);
IO_PKT_t *input = (IO_PKT_t*)pbInBuff;
// Переменные, определения и код защищаемых функций ...
void main()
{
switch (input->tag)
{
// Функция #1
case CMD_FUNC1 :
{ // Проверка соответствия идентификатора полученной // лицензии
if (lic_stat.id != 1)
{
error = ERR_LICENSE_NOT_CHECKOUT;
break;
}
// Проверка статуса полученной лицензии
if (lic_stat.status != LIC_STAT_VALID)
{
error = ERR_LICENSE_NOT_VALID;
input->buff = lic_stat.status;
break;
}
// Выполнение защищенной функции, если лицензия получена
error = func1(input->buff);
}
break;
// Функция #2
case CMD_FUNC2 :
{ // Проверка соответствия идентификатора полученной лицензии
if (lic_stat.id != 2)
{
error = ERR_LICENSE_NOT_CHECKOUT;
break;
}
// Проверка статуса полученной лицензии
if (lic_stat.status != LIC_STAT_VALID)
{
error = ERR_LICENSE_NOT_VALID;
input->buff = lic_stat.status; break;
}
// Выполнение защищенной функции, если лицензия получена
error = func2(input->buff);
}
break;
default :
error = ERR_INVALID_FUNCTION;
break;
}
// Установка возвращаемого кода ошибки input->tag = error;
// ...
}
Этот пример не демонстрирует всех возможных вариантов исползования системы лицензирования, таких как использование версии лицензии или информации разработчика. Используя эти дополнительные поля вы можете, например, ограничить использование лицензий только с определенными версиями программного обеспечения или использовать информацию разработчика в качестве вектора инициализации при шифровании, тем самым делая функцию шифрования уникальной для каждого клиента.
Для всех наших клиентов система безопасного удаленного обновления и лицензирования предоставляется бесплатно!