VMProtect/help/ru/manager/usage/step13_flags.htm
VNGhostMans 5ec92ee05e first commit
Version 3.x.x
2023-05-14 20:21:09 +07:00

97 lines
4.9 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<link rel="Stylesheet" type="text/css" href=
"../../default.css" />
<meta http-equiv="Content-Type" content=
"text/html; charset=utf-8" />
<title>Шаг 1.3: Получаем флаги состояния серийного номера</title>
</head>
<body>
<h1>Шаг 1.3: Получаем флаги состояния серийного
номера</h1><strong>Удобная функция для печати флагов</strong>
<p>Первым делом добавим в наш файл одну удобную функцию, которая
будет печатать в человеческом виде значения флагов состояния
серийного номера. Код функции приведен ниже:</p>
<pre class="code">#define PRINT_HELPER(state, flag) if (state &amp; 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");
}
</pre>
<p>Несмотря на свой размер, функция очень простая - она
последовательно проверяет все битовые флаги и печатает те, что
присутствуют в переменной состояния. Заменим
<strong>printf</strong> после проверки номера на вызов
<strong>print_state</strong>, заодно временно поправим серийный
номер, который подается в систему лицензирования:</p>
<pre class="code">char *serial = "Xserialnumber1"; // зададим номер непосредственно в коде для простоты
int res = VMProtectSetSerialNumber(serial);
print_state(res);
</pre>
<p>Если запустить эту программу, то на консоль выведется
следующее:</p>
<pre class="code">state = SERIAL_STATE_FLAG_INVALID
please register!
</pre>
<p>Вернем теперь старый серийный номер, убрав "1", и запустим
программу еще раз:</p>
<pre class="code">state = 0
We are registered.
</pre>
<p>Теперь, когда мы можем видеть флаги состояние серийного
номера, перейдем к получению флагов и данных из серийного
номера.</p><strong>Получение состояния номера</strong>
<p>Состояние номера можно получить тремя способами: вызвав
<strong>VMProtectSetSerialNumber()</strong>, вызвав
<strong>VMProtectGetSerialNumberState()</strong> и вызвав
<strong>VMProtectGetSerialNumberData()</strong> - флаги состояния
будут помещены в одно из полей структуры. Каждый из методов
предназначен для использования в разное время. Первая проверка
серийного номера происходит непосредственно при его установке. В
этот момент нужно отсекать некорректные номера, номера с истекшим
сроком действия, номера из черного списка и т.п. Некоторые
ограничения - скажем, максимальное время работы продукта или срок
действия номера, имеет смысл проверять и в процессе работы
программы. Тут оптимально воспользоваться простым и быстрым
методом <strong>VMProtectGetSerialNumberState()</strong>, а в
случае, если нужно получить подробную информацию о данных в
серийном номере, можно использовать более мощную функцию
<strong>VMProtectGetSerialNumberData()</strong>.</p><br />
<a href="step14_name.htm">Следующий шаг</a>
<br />
<br />
<br />
<br />
<hr noshade="noshade" size="1" />
<div align="center">
© 2006-2015 Copyright VMProtect Software
</div>
</body>
</html>