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; // ... }
Этот пример не демонстрирует всех возможных вариантов исползования системы лицензирования, таких как использование версии лицензии или информации разработчика. Используя эти дополнительные поля вы можете, например, ограничить использование лицензий только с определенными версиями программного обеспечения или использовать информацию разработчика в качестве вектора инициализации при шифровании, тем самым делая функцию шифрования уникальной для каждого клиента.
Для всех наших клиентов система безопасного удаленного обновления и лицензирования предоставляется бесплатно!