API системы лицензирования является продолжением API VMProtect и входит в его SDK. API позволяет задать серийный номер и получить информацию о нем: подходит он к программе или нет, истек ли срок действия, на кого зарегистрирован продукт и т.п. Также API позволяет получить идентификатор оборудования, на котором выполняется программа.
VMProtectSetSerialNumberФункция предназначена для загрузки серийного номера в систему лицензирования. Полный формат вызова представлен ниже:
int VMProtectSetSerialNumber(const char *SerialNumber);
Входной параметр SerialNumber должен содержать указатель на текстовую строку с серийным номером в кодировке base-64 и завершаемую нулем ('\0'). Функция возвращает битовую маску флагов состояния серийного номера, аналогичную той, что возвращает VMProtectGetSerialNumberState(), подробнее о флагах будет написано ниже. Серийный номер считается "хорошим", если функция вернула значение 0.
Функция возвращает флаги состояния серийного номера, предварительно установленного вызовом VMProtectSetSerialNumber().
int VMProtectGetSerialNumberState();
Наличие хотя бы одного установленного флага говорит о проблемах с серийным номером: программа не должна работать, если установлен хотя бы один бит. Подробные значениях флагов описаны в таблице:
Флаг | Значение | Описание |
---|---|---|
SERIAL_STATE_FLAG_CORRUPTED | 0x00000001 | Система лицензирования повреждена. Возможные причины: некорректная настройка проекта защиты, попытка взлома программы. |
SERIAL_STATE_FLAG_INVALID | 0x00000002 | Серийный номер некорректен. Флаг выставляется, если система лицензирования не может расшифровать серийный номер. |
SERIAL_STATE_FLAG_BLACKLISTED | 0x00000004 | Серийный номер подходит к продукту, однако занесен в черный список в VMProtect. |
SERIAL_STATE_FLAG_DATE_EXPIRED | 0x00000008 | Срок действия серийного номера истек. Подробную информацию о сроке действия можно получить вызовом VMProtectGetSerialNumberData() |
SERIAL_STATE_FLAG_RUNNING_TIME_OVER | 0x00000010 | Время работы программы истекло. Подробную информацию о времени работы программы можно получить вызовом VMProtectGetSerialNumberData() |
SERIAL_STATE_FLAG_BAD_HWID | 0x00000020 | Идентификатор оборудования не совпадает с тем, что записан в серийном номере. |
SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED | 0x00000040 | Серийный номер не предназначен для работы с этой версией защищаемой программы. Максимальную дату сборки программы, к которой подходит этот серийный номер, можно узнать вызовом VMProtectGetSerialNumberData(). |
Функция предназначена для получения информации о содержимом серийного номера, установленного вызовом VMProtectSetSerialNumber(). Формат вызова представлен ниже:
bool VMProtectGetSerialNumberData(VMProtectSerialNumberData *Data, int Size);
Первый параметр - указатель на структуру VMProtectSerialNumberData, в которую будет записана вся необходимая информация. Второй параметр - размер структуры, передаваемой в первом параметре - служит для контроля формата структуры. Функция возвращает FALSE в случаях, если система лицензирования повреждена (см. флаг состояния SERIAL_STATE_FLAG_CORRUPTED), если на вход подан нулевой адрес структуры или если переданный размер структуры некорректен. Во всех остальных случаях функция возвращает TRUE и записывает всю информацию о серийном номере по указанном адресу. Ниже описываются все элементы структуры:
Элемент | Тип | Описание |
---|---|---|
nState | int | Битовая маска флагов проверки ключа. Аналогична той, что возвращает VMProtectGetSerialNumberState(). |
wUserName | wchar_t[256] | Имя покупателя в кодировке UNICODE, завершаемое нулем. |
wEMail | wchar_t[256] | E-Mail покупателя в кодировке UNICODE, завершаемый нулем. |
dtExpire | VMProtectDate | Дата окончания срока действия ключа. Формат структуры VMProtectDate описан ниже. |
dtMaxBuild | VMProtectDate | Максимальная дата сборки продукта, с которой будет работать этот ключ. Формат структуры VMProtectDate описан ниже. |
bRunningTime | int | Количество минут, которое программа будет работать (максимальная длина сессии). Измеряется в минутах, отсчитывается с момента запуска программы. |
nUserDataLength | unsigned char | Длина пользовательских данных, размещенных в поле bUserData. |
bUserData | unsigned char[255] | Пользовательские данные, записанные в ключ. Количество актуальных байт указано в поле nUserDataLength. |
Структура VMProtectDate предназначена для компактного хранения даты. Ее поля описаны в таблице:
Элемент | Тип | Описание |
---|---|---|
wYear | unsigned short | Год. |
bMonth | unsigned char | Месяц, нумерация начинается с единицы. |
bDay | unsigned char | День, нумерация начинается с единицы. |
Функция предназначена для получения идентификатора оборудования, на котором работает программа. Формат вызова следующий:
int VMProtectGetCurrentHWID(char * HWID, int Size);
Первый параметр - указатель на область памяти, куда будет записан идентификатор. Второй параметр - размер области данных. Функция возвращает количество записанных байт с учетом завершающего нуля ('\0'). Если вместо первого параметра подать NULL, то функция вернет необходимое количество байт для записи номера. Наиболее правильный способ вызова функции следующий:
int nSize = VMProtectGetCurrentHWID(NULL, 0); // получим необходимый размер буфера char *pBuf = new char[nSize]; // выделим буфер VMProtectGetCurrentHWID(pBuf, nSize); // получим идентификатор // используем его delete [] pBuf; // освободим память