Cоздание удобной, гибкой, и в то же время безопасной системы лицензирования и удаленного обновления данных является одной из основных задач при защите программного обеспечения. К сожалению, большинство уже существующих решений не удовлетворяют сразу всем этим условиям. В большинстве случаев слабым местом является защищенность самой системы и отсутствие реальной связи между результатом проверки лицензий и функционирования программы. У злоумышленника всегда есть возможность изменить функцию проверки лицензии (обычно для этого необходимо просто заставить ее возвращать "1" или "0") и этого будет достаточно, чтобы программа считала, что ее модуль или опция разрешены к использованию. А информацию для обновления электронных ключей легко подменить или изучить.
В созданной нами системе лицензирования и удаленного обновления для электронных ключей SenseLock (кроме модели NET-RTC) мы постарались устранить этот недостаток, сохранив при этом гибкость настроек и простоту использования.
Мастер-ключ
Для работы c системой лицензирования и создания пакетов удалённого обновления, необходимо наличие мастер-ключа. Только с его помощью могут быть созданы пакеты обновлений, лицензии и записаны данные в ключи пользователей. Мастер-ключ высылается нашей компанией всем клиентам, заказавшим систему автоматической защиты VMProtect SenseLock Edition (в этом случае будет создан единый мастер-ключ, который предоставляется бесплатно) или систему удаленного обновления и лицензирования (необходимо заказать дополнительный ключ SenseLock EL-STD 64). Доступ к мастер-ключу осуществляется посредством ввода пароля. Без правильного пароля создание ключей пользователя, лицензий и пакетов удаленного обновления будет невозможно.
Программирование пользовательских ключей
Этот модуль предназначен для создания ключей пользователей и записи в них исполняемых модулей системы удаленного обновления, лицензирования и VMProtect SE.

Модуль "Программирование ключей" также позволяет производить следующие действия:
- Настройка ПИН-кодов, которые будут установлены в ключе пользователя. ПИН-код пользователя должен совпадать с используемым в защищенной программе, ПИН-код разработчика может быть любым и должен храниться в надежном месте и не должен распространяться.
- Настройка системы автоматической защиты VMProtect SenseLock Edition, начальный номер обновления (рекомендуется устанавливать равным "1" для новых ключей), максимальное количество лицензий и режим работы исполняемых модулей.
- Установка идентификатора ATR, который будет установлен в ключе (может использоваться защищенной программой для опознания предназначенных для нее ключей), а также пакеты обновления и лицензий. Последние два параметра не являются обязательными.
Также при создании ключа пользователя в него сразу могут быть записаны пакет обновления с исполняемыми модулями защиты разработчика ПО и пакет лицензий.
Система удаленного обновления
Система безопасного удаленного обновления в первую очередь предназначена для дистанционного перепрограммирования содержимого ключа пользователя. Разработчик защиты может изменять любые файлы, как исполняемые, так и файлы данных на стороне пользователя, не опасаясь, что их содержимое станет известно третьим лицам.

Основные возможности системы удалённого обновления:
- Безопасное удаленное обновление исполняемых модулей и файлов с данными, расположенными в электронном ключе SenseLock.
- Возможность разрешить обновление только для электронного ключа с указанным идентификатором.
- Защита от обновления старыми данными.
Система лицензирования

Основные возможности системы лицензирования:
- Лицензии, функции по их проверке и результат находятся и выполняются в защищенном пространстве электронного ключа и не могут быть изменены злоумышленниками извне!
- Создание до 255 лицензий в одном электронном ключе. Каждая лицензия имеет собственные независимые настройки.
- Ограничение времени работы лицензии. Указывается начальная и конечная даты работы лицензии.
- Ограничение количества запросов на получение лицензии. Данная возможность позволяет ограничить запуск защищаемой функции на произвольное (от 1 до 65535) количество раз.
- Возможность безопасного удаленного обновления каждой лицензии.
- Возможность привязки обновления лицензии к уникальному идентификационному номеру электронного ключа SenseLock. Это исключит несанкционированное использование обновления с электронными ключами других пользователей защищенного программного обеспечения.
- Защита от обновления уже использованной в электронном ключе лицензией.
- Получение информации о текущем значении параметров лицензии.
- Возможность дальнейшего гибкого расширения функциональности системы лицензирования.
Принцип работы системы лицензирования
Использование модуля системы лицензирования с защищенным программным обеспечением происходит в два этапа:
Вызов исполняемого модуля лицензирования для получения и проверки лицензии

- Программа делает запрос в электронный ключ пользователя на получение необходимой лицензии.
- Исполняемый модуль лицензирования проверяет параметры лицензии.
- Устанавливается статус лицензии в зависимости от результата проверки. Статус проверки хранится в защищенном пространстве внутри электронного ключа пользователя и не может быть изменен извне.
- Результат проверки возвращается в защищенную программу. Данный результат носит исключительно информационный характер и никак не влияет на работу системы лицензирования в случае его изменения злоумышленником.
Вызов исполняемого модуля защищенного приложения для выполнения основных функций

- Защищенная программа вызывает записанный в электронный ключ пользователя исполняемый модуль разработчика с необходимыми параметрами.
- Исполняемый модуль перед выполнением защищенных функций производит проверку статуса лицензии. Это действие производится в защищенном пространстве электронного ключа пользователя и не может быть изменено извне.
После проверки статуса лицензии разработчик может его сбросить, чтобы для следующего вызова защищенной функции было опять необходимо получать лицензию. Поведение системы лицензирования полностью контролируется разработчиком и зависит от общей схемы защиты. - Результат работы защищенной функции или код ошибки возвращаются в программу.
Дополнительные функции системы лицензирования позволяют:
- Освобождение полученной лицензии из защищенной программы. В этом случае внутри электронного ключа сбрасывается статус полученной лицензии.
- Получение списка лицензий в электронном ключе пользователя.
- Получение полной информации о лицензии по ее идентификатору (описывается структурой LM_RECORD_t).
- Обновление лицензии в электронном ключе пользователя.
Пример использования
Пример получения лицензии и последующий вызов функции исполняемого модуля разработчика:
#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; // ... }
Этот пример не демонстрирует всех возможных вариантов исползования системы лицензирования, таких как использование версии лицензии или информации разработчика. Используя эти дополнительные поля вы можете, например, ограничить использование лицензий только с определенными версиями программного обеспечения или использовать информацию разработчика в качестве вектора инициализации при шифровании, тем самым делая функцию шифрования уникальной для каждого клиента.
Стоимость
Для всех наших клиентов система безопасного удаленного обновления и лицензирования предоставляется бесплатно!