Шаг 1.3: Получаем флаги состояния серийного номера

Удобная функция для печати флагов

Первым делом добавим в наш файл одну удобную функцию, которая будет печатать в человеческом виде значения флагов состояния серийного номера. Код функции приведен ниже:

#define PRINT_HELPER(state, flag) if (state & flag) printf("%s ", #flag)
void print_state(INT state)
{
        if (state == 0)
        {
                printf("state = 0\n");
                return;
        }

        printf("state = ");
        PRINT_HELPER(state, SERIAL_STATE_FLAG_CORRUPTED);
        PRINT_HELPER(state, SERIAL_STATE_FLAG_INVALID);
        PRINT_HELPER(state, SERIAL_STATE_FLAG_BLACKLISTED);
        PRINT_HELPER(state, SERIAL_STATE_FLAG_DATE_EXPIRED);
        PRINT_HELPER(state, SERIAL_STATE_FLAG_RUNNING_TIME_OVER);
        PRINT_HELPER(state, SERIAL_STATE_FLAG_BAD_HWID);
        PRINT_HELPER(state, SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED);
        printf("\n");
}

Несмотря на свой размер, функция очень простая - она последовательно проверяет все битовые флаги и печатает те, что присутствуют в переменной состояния. Заменим printf после проверки номера на вызов print_state, заодно временно поправим серийный номер, который подается в систему лицензирования:

char *serial = "Xserialnumber1"; // зададим номер непосредственно в коде для простоты
int res = VMProtectSetSerialNumber(serial);
print_state(res);

Если запустить эту программу, то на консоль выведется следующее:

state = SERIAL_STATE_FLAG_INVALID
please register!

Вернем теперь старый серийный номер, убрав "1", и запустим программу еще раз:

state = 0
We are registered.

Теперь, когда мы можем видеть флаги состояние серийного номера, перейдем к получению флагов и данных из серийного номера.

Получение состояния номера

Состояние номера можно получить тремя способами: вызвав VMProtectSetSerialNumber(), вызвав VMProtectGetSerialNumberState() и вызвав VMProtectGetSerialNumberData() - флаги состояния будут помещены в одно из полей структуры. Каждый из методов предназначен для использования в разное время. Первая проверка серийного номера происходит непосредственно при его установке. В этот момент нужно отсекать некорректные номера, номера с истекшим сроком действия, номера из черного списка и т.п. Некоторые ограничения - скажем, максимальное время работы продукта или срок действия номера, имеет смысл проверять и в процессе работы программы. Тут оптимально воспользоваться простым и быстрым методом VMProtectGetSerialNumberState(), а в случае, если нужно получить подробную информацию о данных в серийном номере, можно использовать более мощную функцию VMProtectGetSerialNumberData().


Следующий шаг




© 2006-2015 Copyright VMProtect Software