mirror of
https://github.com/Obfuscator-Collections/VMProtect.git
synced 2025-08-02 19:40:11 +03:00
first commit
Version 3.x.x
This commit is contained in:
89
help/ru/manager/activation.htm
Normal file
89
help/ru/manager/activation.htm
Normal file
@@ -0,0 +1,89 @@
|
||||
<!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>Система Активации</title>
|
||||
<style type="text/css">
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Система Активации</h1>
|
||||
|
||||
<h3>Что Это?</h3>
|
||||
|
||||
<p>Активация - это двухэтапный процесс регистрации приложения. На
|
||||
первом этапе (обычно после покупки) покупатель получает код
|
||||
активации (выглядит как XXXX-YYYY-ZZZZ). На втором этапе
|
||||
покупатель вводит этот код в приложение, приложение соединяется
|
||||
через Интернет с сервером производителя ПО, сервер проверяет код
|
||||
активации и выдает приложению серийный номер, связанный с этим
|
||||
кодом активации и обычно привязанный к оборудованию
|
||||
пользователя.</p>
|
||||
|
||||
<p>Такой подход позволяет контролировать использование лицензий
|
||||
покупателями, предотвращать утечки лицензий, а также многое
|
||||
другое, например демо-лицензии или надежные триальные
|
||||
периоды.</p>
|
||||
|
||||
<h3>Зачем Она Мне Нужна?</h3>
|
||||
|
||||
<p>Система активации дает производителю ПО достаточно широкие
|
||||
возможности, например:</p>
|
||||
|
||||
<ul>
|
||||
<li><strong>Короткие серийные номера</strong> - длинные
|
||||
серийные номера хороши всем, кроме длины. Пользователи могут
|
||||
ошибиться при вводе, почтовые программы иногда портят некоторые
|
||||
символы, однако только длинные серийные номера позволяют хранить
|
||||
достаточный объем дополнительной информации. Коды активации
|
||||
позволяют решить все проблемы длинных серийных номеров, не
|
||||
влияя на их положительные стороны.</li>
|
||||
|
||||
<li><strong>Контроль количества инсталляций</strong> - все
|
||||
активации доступны производителю онлайн в реальном времени. Их
|
||||
можно отслеживать, анализировать, блокировать, оказывать
|
||||
поддержку пользователям и т.д.</li>
|
||||
|
||||
<li><strong>Триалы</strong> - можно создавать серийные номера,
|
||||
ограниченные по времени, используя "режимы" продуктов -
|
||||
"modes".</li>
|
||||
|
||||
<li><strong>Подписки</strong> - подписки похожи на триалы,
|
||||
однако стоят денег. Вы можете продавать пользователю право
|
||||
работать с программой в течение определенного времени, как это
|
||||
делают производители антивирусов - просто продавайте коды
|
||||
активации на очередной год обслуживания.</li>
|
||||
</ul>
|
||||
|
||||
<p>Более подробная информация о системе активации доступна в
|
||||
соответствующем <a href=
|
||||
"http://vmpsoft.com/products/web-license-manager/" target=
|
||||
"_blank">разделе</a> нашего сайта.</p>
|
||||
|
||||
<h3>Что Потребуется Сделать?</h3>
|
||||
|
||||
<p>VMProtect Ultimate дополнен несколькими <a href=
|
||||
"activation/api.htm">функциями</a>, которые позволяют
|
||||
сравнительно легко реализовать как онлайн, так и оффлайн
|
||||
активацию. Вам также потребуется установленный на сервере
|
||||
<a href="activation/weblm.htm">Web License Manager</a>. Наконец,
|
||||
потребуется <a href="activation/vmprotect.htm">настроить</a>
|
||||
проект защиты в VMProtect, чтобы модуль активации знал адрес
|
||||
сервера WebLM.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
223
help/ru/manager/activation/api.htm
Normal file
223
help/ru/manager/activation/api.htm
Normal file
@@ -0,0 +1,223 @@
|
||||
<!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>API Активации</title>
|
||||
<style type="text/css">
|
||||
/*<![CDATA[*/
|
||||
th {text-align:left;}
|
||||
table {border-collapse:collapse; margin-top: 4px;}
|
||||
td,th {border: 1px solid #B0B0B0; padding-left:10;padding-right:10;}
|
||||
/*]]>*/
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>API Активации</h1>
|
||||
|
||||
<p>API Активации содержит всего 4 функции. Две предназначены для
|
||||
онлайн-активации и две для оффлайн, когда на компьютере
|
||||
отсутствует доступ в Интернет. API Активации предназначено для
|
||||
взаимодействия с Web License Manager, так что разработчику все
|
||||
равно необходимо вызывать API системы лицензирования, чтобы
|
||||
использовать серийные номера, полученные от WebLM.</p><strong id=
|
||||
"VMProtectActivateLicense">VMProtectActivateLicense</strong>
|
||||
|
||||
<p>Функция передает код активации на сервер и возвращает серийный
|
||||
номер, подходящий для этого конкретного компьютера. В противном
|
||||
случае возвращается <a href="#codes">код ошибки</a>.</p>
|
||||
<pre class="code">int VMProtectActivateLicense(const char *code, char *serial, int size);
|
||||
</pre>
|
||||
|
||||
<p>Параметр <strong>code</strong> содержит код активации, который
|
||||
получен от Web License Manager в процессе покупки лицензии.
|
||||
Параметр <strong>serial</strong> указывает на блок памяти размера
|
||||
<strong>size</strong>, в который будет помещен сгенерированный
|
||||
WebLM серийный номер.</p><strong id=
|
||||
"VMProtectDeactivateLicense">VMProtectDeactivateLicense</strong>
|
||||
|
||||
<p>Функция передает серийный номер на сервер для деактивации.
|
||||
Возможные коды возврата перечислены <a href=
|
||||
"#codes">ниже</a>.</p>
|
||||
<pre class="code">int VMProtectDeactivateLicense(const char *serial);
|
||||
</pre>
|
||||
|
||||
<p>Параметр <strong>serial</strong> содержит серийный номер (не
|
||||
код активации), полученный ранее от WebLM в процессе
|
||||
активации.</p><strong id=
|
||||
"VMProtectGetOfflineActivationString">VMProtectGetOfflineActivationString</strong><br />
|
||||
|
||||
<strong id=
|
||||
"VMProtectGetOfflineDeactivationString">VMProtectGetOfflineDeactivationString</strong>
|
||||
|
||||
<p>Эти две функции работают практически аналогично двум
|
||||
предыдущим с той лишь разницей, что они не пытаются подключиться
|
||||
к серверу WebLM. Вместо этого они возвращают блок текста, который
|
||||
необходимо скопировать на компьютер где есть доступ в Интернет,
|
||||
открыть там форму оффлайн-активации WebLM и вставить туда этот
|
||||
текст.</p>
|
||||
<pre class="code">int VMProtectGetOfflineActivationString(const char *code, char *buf, int size);
|
||||
int VMProtectGetOfflineDeactivationString(const char *serial, char *buf, int size);
|
||||
</pre>
|
||||
|
||||
<p>Параметры <strong>code</strong> и <strong>serial</strong>
|
||||
аналогичны параметрам онлайн-версий функций, параметр
|
||||
<strong>buf</strong> должен указывать на буфер размером 1000 байт
|
||||
или больше, туда будет скопирован текстовый блок для формы
|
||||
оффлайн-активации. Возможные коды ошибок перечислены <a href=
|
||||
"#codes">ниже</a>.</p>
|
||||
|
||||
<h3 id="codes">Возможные Коды Ошибок</h3>
|
||||
|
||||
<table border="1" cellspacing="0" cellpadding="2">
|
||||
<tr>
|
||||
<th>Код</th>
|
||||
|
||||
<th>Значение</th>
|
||||
|
||||
<th>Описание</th>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>ACTIVATION_OK</td>
|
||||
|
||||
<td>0</td>
|
||||
|
||||
<td>Активация прошла успешно, переменная
|
||||
<strong>serial</strong> содержит серийный номер.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>ACTIVATION_SMALL_BUFFER</td>
|
||||
|
||||
<td>1</td>
|
||||
|
||||
<td>Буфер для серийного номера слишком маленький. Минимальный
|
||||
размер буфера вычисляется по формуле: bits / 8 * 3 / 2 + N,
|
||||
где bits - длина RSA ключа в битах, а N - "константа
|
||||
безопасности" - дополнительное количество байт на случай
|
||||
переносов строк и прочих спец-символов. Рекомендуется
|
||||
использовать как минимум 10.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>ACTIVATION_NO_CONNECTION</td>
|
||||
|
||||
<td>2</td>
|
||||
|
||||
<td>Модуль активации не смог подключиться к Web License
|
||||
Manager.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>ACTIVATION_BAD_REPLY</td>
|
||||
|
||||
<td>3</td>
|
||||
|
||||
<td>Сервер активации вернул неожиданный результат. Это
|
||||
означает проблемы конфигурации сервера, неправильный url
|
||||
сервера активации или попытку взлома.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>ACTIVATION_BANNED</td>
|
||||
|
||||
<td>4</td>
|
||||
|
||||
<td>Этот код активации заблокирован на сервере производителем
|
||||
ПО через интерфейс WebLM (например, из-за
|
||||
утечки кода активации с пиратской копией). Не путать с ACTIVATION_ALREADY_USED.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>ACTIVATION_CORRUPTED</td>
|
||||
|
||||
<td>5</td>
|
||||
|
||||
<td>Что-то пошло совсем не так. Ошибка выдается системой
|
||||
самопроверки модуля активации и с высокой вероятностью
|
||||
означает попытку взлома. В случае получения этой ошибки
|
||||
дальнейшие операции с серийными номерами и активацией не
|
||||
могут считаться безопасными.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>ACTIVATION_BAD_CODE</td>
|
||||
|
||||
<td>6</td>
|
||||
|
||||
<td>Данный код не найден в базе данных сервера активаций.
|
||||
Возможно пользователь ошибся при вводе кода, так что можно
|
||||
попросить его проверить правильность ввода данных.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>ACTIVATION_ALREADY_USED</td>
|
||||
|
||||
<td>7</td>
|
||||
|
||||
<td>Счетчик активаций этого кода дошел до нуля и дальнейшие
|
||||
активации невозможны. Это не обозначает, что код плохой или
|
||||
заблокирован - код хороший. Пользователю нужно связаться с
|
||||
производителем ПО и докупить необходимое количество лицензий
|
||||
или же деинсталлировать программу на других компьютерах,
|
||||
чтобы увеличить значение счетчика в базе данных.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>ACTIVATION_SERIAL_UNKNOWN</td>
|
||||
|
||||
<td>8</td>
|
||||
|
||||
<td>Ошибка деактивации. Означает, что данный серийный
|
||||
номер не найден в базе данных сервера. Соответственно,
|
||||
деактивация не может быть проведена успешно.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>ACTIVATION_EXPIRED</td>
|
||||
|
||||
<td>9</td>
|
||||
|
||||
<td>Ошибка активации. Означает, что период действия кода активации истек.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>ACTIVATION_NOT_AVAILABLE</td>
|
||||
|
||||
<td>10</td>
|
||||
|
||||
<td>Ошибка означает, что активация/деактивация недоступна.</td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
|
||||
<h3>Маленькие хитрости</h3>
|
||||
|
||||
<p>API Активации достаточно простое, так что с ним не должно
|
||||
возникнуть сложностей. Не забудьте предоставить пользователям
|
||||
интерфейс для оффлайн-активации, если онлайн-активация
|
||||
завершилась неудачей из-за проблем с доступом в интернет. Также
|
||||
не забывайте, что API Активации не сохраняет полученный серийный
|
||||
номер и не передает его модулю лицензирования - это задача
|
||||
разработчика. Нет необходимости вызывать API Активации при каждом
|
||||
запуске приложения - достаточно вызвать его один раз, получить
|
||||
серийный номер от WebLM, сохранить его в удобном месте и в
|
||||
дальнейшем использовать только его.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
38
help/ru/manager/activation/vmprotect.htm
Normal file
38
help/ru/manager/activation/vmprotect.htm
Normal file
@@ -0,0 +1,38 @@
|
||||
<!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>Настройка Активации в VMProtect</title>
|
||||
<style type="text/css">
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Настройка Активации в VMProtect</h1>
|
||||
|
||||
<p>Для работы <a href="api.htm">API Активации</a> требуется адрес
|
||||
сервера WebLM, так что необходимо задать его в настройках проекта
|
||||
VMProtect. Чтобы сделать это, запустите VMProtect и перейдите в
|
||||
раздел настроек:</p><br /><img src="../../images/activation_setup.png" alt="Настройка сервера активации" />
|
||||
|
||||
<p>Введите адрес в поле "Сервер активации". Адрес должен
|
||||
выглядеть так: http://<em>yourserver</em>/<em>weblm
|
||||
path</em>/activate.php. Это первое место, которое следует проверить, если в дальнейшем Вы столкнетесь
|
||||
с ошибками в процессе онлайн-активации.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
55
help/ru/manager/activation/weblm.htm
Normal file
55
help/ru/manager/activation/weblm.htm
Normal file
@@ -0,0 +1,55 @@
|
||||
<!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>Поддержка Активации в Web License Manager</title>
|
||||
<style type="text/css">
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Поддержка Активации в Web License Manager</h1>
|
||||
|
||||
<p>Подробно Web License Manager описан <a href=
|
||||
"http://vmpsoft.com/products/web-license-manager/" target=
|
||||
"_blank">на сайте</a>, здесь даны минимальные инструкции по
|
||||
созданию кода активации для последующего использования с API
|
||||
Активации.</p>
|
||||
|
||||
<p>Для начала войдите в Web License Manager (можно использовать
|
||||
демо-версию на нашем сайте) и создайте продукт. Затем
|
||||
экспортируйте продукт как проект VMProtect, чтобы иметь
|
||||
возможность использовать его для настроек лицензирования и
|
||||
активации. После того как проект настроен, необходимые проверки
|
||||
добавлены в код и исполняемый файл защищен, нажмите ссылку "Add
|
||||
New Code" в левой панели WebLM:</p>
|
||||
<p><img src="../../images/weblm_1.png" /></p>
|
||||
|
||||
<p>Выберите нужный продукт в верхнем выпадающем списке и
|
||||
заполните остальные поля формы данными, которые Вы хотите
|
||||
поместить в серийный номер. Затем нажмите кнопку "Save". Вы
|
||||
увидите код активации, который можно использовать для отладки API
|
||||
Активации.</p>
|
||||
<p><img src="../../images/weblm_2.png" /></p>
|
||||
|
||||
<p>Множество других возможностей Web License Manager (таких, как интеграция с регистраторами или
|
||||
автоматическая генерация кодов активации) можно подробно изучить в <a href=
|
||||
"http://vmpsoft.com/products/web-license-manager/" target=
|
||||
"_blank">онлайн-версии руководства пользователя</a>.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
138
help/ru/manager/features.htm
Normal file
138
help/ru/manager/features.htm
Normal file
@@ -0,0 +1,138 @@
|
||||
<!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>Возможности системы лицензирования VMProtect</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Возможности системы лицензирования VMProtect</h1>
|
||||
|
||||
<h3>Надежные серийные номера</h3>
|
||||
|
||||
<p>Система лицензирования использует асимметричные алгоритмы для
|
||||
шифрования серийных номеров. Номер шифруется приватным ключом,
|
||||
который хранится только у разработчика продукта. Защищаемый
|
||||
продукт расшифровывает номер публичным ключом и проверяет его. В
|
||||
силу длины используемых ключей (от 1024 бит для RSA) практически
|
||||
невозможно подобрать закрытый ключ и создать генератор ключей для
|
||||
продукта.</p>
|
||||
|
||||
<h3 id="lock">Привязка кода к серийному номеру</h3>
|
||||
|
||||
<p>VMProtect позволяет исполнять часть кода программы на
|
||||
виртуальной машине. Набор команд виртуальной машины меняется при
|
||||
каждой сборке защищаемой программы. Система лицензирования
|
||||
позволяет зашифровать часть команд виртуальной машины ключом,
|
||||
который хранится в серийном номере. Таким образом, даже если
|
||||
хакер исправит условный переход в программе, код все равно не
|
||||
будет работать без корректного серийного номера. А так как
|
||||
расшифровка кода также происходит под управлением виртуальной
|
||||
машины, то даже наличие серийного номера не дает возможности
|
||||
легко проанализировать алгоритм
|
||||
расшифровки.</p>
|
||||
|
||||
<h3>Ограничение периода бесплатных обновлений</h3>
|
||||
|
||||
<p>Система лицензирования позволяет записать в ключ такую дату,
|
||||
что версии приложения, собранные после этой даты, не будут
|
||||
работать с этим ключом. Это позволяет ограничивать период
|
||||
бесплатных обновлений продукта. Например при продаже в ключ
|
||||
записывается текущая дата плюс один год и пользователь может
|
||||
скачивать с сайта новые версии в течение года. Ключ будет
|
||||
работать в этих версиях. По истечение года у пользователя будет
|
||||
выбор: пользоваться последней "рабочей" версией программы или
|
||||
купить обновление еще на один год.</p>
|
||||
|
||||
<h3>Срок годности ключа</h3>
|
||||
|
||||
<p>Система лицензирования позволяет записать в ключ дату, после
|
||||
которой ключ перестает работать. Это удобно для продажи
|
||||
продуктов, требующих периодического обновления. Например при
|
||||
продаже в серийный номер помещается текущая дата плюс год и
|
||||
программа будет работать у пользователя в течение года. В отличие
|
||||
от ограничения периода бесплатных обновлений, в этом случае у
|
||||
пользователя нет выбора - ему придется купить новую лицензию,
|
||||
если он хочет продолжать пользоваться
|
||||
программой.</p>
|
||||
|
||||
<h3>Ограничение времени работы программы</h3>
|
||||
|
||||
<p>Система лицензирования позволяет ограничить время работы
|
||||
экземпляра программы. Это бывает полезно для демонстрационных
|
||||
задач. Например покупатель хочет получить для тестирования
|
||||
полноценную копию программы. В этом случае можно передать ему
|
||||
серийный номер, который ограничит время работы программы, скажем,
|
||||
десятью минутами. По истечение этого времени программа прекратит
|
||||
свою работу. Такая схема подходит для демонстрационных версий
|
||||
различных серверных приложений, где простой перезапуск приложения
|
||||
будет неудобен.</p>
|
||||
|
||||
<h3>Привязка к оборудованию</h3>
|
||||
|
||||
<p>Система лицензирования позволяет получить идентификатор
|
||||
оборудования пользователя на основе процессора, сетевых плат и
|
||||
информации операционной системы. Серийный номер может быть создан
|
||||
так, что он будет работать только на оборудовании с этим
|
||||
идентификатором. Это позволяет ограничить использование одной
|
||||
лицензии на нескольких компьютерах.</p>
|
||||
|
||||
<h3>Черный список</h3>
|
||||
|
||||
<p>В случае дискредитации серийного номера, система
|
||||
лицензирования позволяет занести такой номер в черный список,
|
||||
после чего номер не будет работать в следующих версиях
|
||||
приложения.</p>
|
||||
|
||||
<h3>Хранение данных</h3>
|
||||
|
||||
<p>Система лицензирования позволяет хранить в серийном номере и
|
||||
выдавать защищаемой программе следующие данные: имя пользователя,
|
||||
e-mail, а также до 255 байт произвольных данных (т.н. "данные
|
||||
пользователя"). Это может быть использовано для показа в диалоге
|
||||
"О Программе", для реализации дополнительных проверок серийного
|
||||
номера, для хранения констант, доступных только в
|
||||
зарегистрированной версии продукта и т.п.</p>
|
||||
|
||||
<h3>Ограниченние работы демо-версии по времени</h3>
|
||||
|
||||
<p>Используя систему <a href="activation.htm">активации</a>
|
||||
производитель ПО может автоматически создавать ограниченные по времени и привязанные к оборудованию
|
||||
пользователя серийные номера. Это позволяет организовать надежно защищенный
|
||||
демо-период для приложения, так как VMProtect не прячет триальные
|
||||
метки на компьютере пользователя, а вместо этого генерирует
|
||||
полноценный, но ограниченный по времени серийный номер. Активация
|
||||
обычно производится непосредственно через интернет, но в API активации предусмотрен
|
||||
и оффлайновый режим.</p><br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<h1>Чего система лицензирования не умеет и
|
||||
почему?</h1>
|
||||
|
||||
<h3>100%-но надежная привязка к оборудованию</h3>
|
||||
|
||||
<p>Несмотря на то, что система лицензирования позволяет
|
||||
привязаться к идентификатору оборудования, следует понимать, что
|
||||
большинство данных об оборудовании получается средствами
|
||||
операционной системы, которые могут быть перехвачены хакером с
|
||||
целью изменения данных. Система лицензирования применяет ряд
|
||||
схем, позволяющих минимизировать такие риски, однако если вам
|
||||
требуется 100%-но надежная привязка к оборудованию, мы
|
||||
рекомендуем воспользоваться решением на базе USB-ключей, с
|
||||
которыми также может работать VMProtect.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
61
help/ru/manager/howitworks.htm
Normal file
61
help/ru/manager/howitworks.htm
Normal file
@@ -0,0 +1,61 @@
|
||||
<!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>Как работает система лицензирования?</title>
|
||||
<style type="text/css">
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Как работает система лицензирования?</h1>
|
||||
|
||||
<h3>Защита приложения</h3>
|
||||
|
||||
<p>VMProtect в процессе защиты приложения интегрирует в него код
|
||||
проверки серийных номеров. При этом используется информация,
|
||||
указанная в секции "Лицензии" раздела "Проект". В приложение помещается
|
||||
публичный ключ продукта, при помощи которого будет осуществляться
|
||||
расшифровка серийных номеров. Также в приложение помещается дата
|
||||
защиты и ряд дополнительных данных, необходимых для работы
|
||||
системы лицензирования.</p>
|
||||
|
||||
<h3>Создание серийных номеров</h3>
|
||||
|
||||
<p>Серийные номера могут быть созданы в секции <a href=
|
||||
"licenses.htm">"Лицензии"</a> раздела "Проект" или при помощи отдельных приложений
|
||||
- <a href="keygen/index.htm">генераторов ключей</a>. Серийный
|
||||
номер - это набор данных о покупателе, зашифрованный асимметричным
|
||||
алгоритмом. Серийный номер передается покупателю, тот вводит его
|
||||
в программу, после чего он проверяется модулем
|
||||
лицензирования.</p>
|
||||
|
||||
<h3>Проверка серийного номера в программе</h3>
|
||||
|
||||
<p>Модуль лицензирования предоставляет защищаемой программе
|
||||
<a href="usage/api.htm">несколько функций</a> для работы с
|
||||
серийными номерами. Программа передает модулю лицензирования
|
||||
серийный номер и запрашивает информацию о нем. Модуль
|
||||
лицензирования выдает краткое состояние серийного номера
|
||||
(рабочий/нерабочий и почему), а также может выдать подробную
|
||||
информацию о серийном номере, такую как имя пользователя, e-mail,
|
||||
срок действия номера и т.д. Защищаемая программа анализирует
|
||||
информацию о серийном номере и принимает решение о продолжении
|
||||
или завершении работы, а также об ограничениях
|
||||
функционала.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
43
help/ru/manager/index.htm
Normal file
43
help/ru/manager/index.htm
Normal file
@@ -0,0 +1,43 @@
|
||||
<!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>Система лицензирования</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Система лицензирования</h1>
|
||||
|
||||
<p>Система лицензирования решает задачи создания и проверки
|
||||
серийных номеров. Поддерживаются ограничения работы защищаемого
|
||||
ПО по дате и времени, привязка к оборудованию, шифрование кода
|
||||
серийным номером, ограничение периода бесплатных обновлений и
|
||||
многое другое. Система построена на асимметричных алгоритмах
|
||||
шифрования, что минимизирует вероятность создания генераторов
|
||||
серийных номеров. Для защиты системы лицензирования применяется
|
||||
виртуализация VMProtect, что минимизирует вероятность взлома на
|
||||
уровне кода и создания патчей.</p>
|
||||
|
||||
<ul>
|
||||
<li><a href="features.htm">Возможности системы лицензирования</a></li>
|
||||
<li><a href="howitworks.htm">Схема работы системы лицензирования</a></li>
|
||||
<li><a href="licenses.htm">Управление лицензиями: создание, изменение, блокировка и т.п.</a></li>
|
||||
<li><a href="usage/index.htm">Пример интеграции в приложение</a></li>
|
||||
<li><a href="keygen/index.htm">Автоматическое создание серийных номеров</a></li>
|
||||
</ul>
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
79
help/ru/manager/keygen/algorithms.htm
Normal file
79
help/ru/manager/keygen/algorithms.htm
Normal file
@@ -0,0 +1,79 @@
|
||||
<!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>Алгоритмы шифрования серийных номеров</title>
|
||||
<style type="text/css">
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Алгоритмы шифрования серийных номеров</h1>
|
||||
|
||||
<p>Надежность ключей системы лицензирования основывается на
|
||||
применении асимметричных алгоритмов шифрования. В текущей версии
|
||||
реализован алгоритм RSA с длиной ключа от 1024 до 16384 бит. В
|
||||
будущих версиях планируется добавление других алгоритмов,
|
||||
основанных на ECC, а также схем, совмещающих симметричные и
|
||||
асимметричные шифры.</p>
|
||||
|
||||
<p>Используемый алгоритм уникален для каждого продукта. Ключи,
|
||||
созданные с одним алгоритмом, не подойдут к другому, поэтому
|
||||
смена алгоритмов после создания хоть одной лицензии не
|
||||
допускается. Модуль защиты, располагающийся в защищаемой
|
||||
программе, "знает" каким алгоритмом должен быть зашифрован
|
||||
серийный номер и не примет ключ, созданный другим алгоритмом или
|
||||
тем же алгоритмом, но с другими параметрами (скажем, с другой
|
||||
длиной ключа).</p>
|
||||
|
||||
<h3>Алгоритм RSA</h3>
|
||||
|
||||
<p>Шифрование серийного номера алгоритмом RSA происходит по
|
||||
следующей схеме:</p>
|
||||
|
||||
<ul>
|
||||
<li><strong>Добавление случайных данных в начало
|
||||
номера</strong> - метод основывается на RFC2313, однако
|
||||
реализация немного отличается от описаной там. В начало
|
||||
серийного номера добавляютя байты: 00 02 NN...NN 00, где NN..NN
|
||||
- от 8 до 16 случайных ненулевых байт. Количество байт
|
||||
выбирается случайным, однако принимается во внимание длина
|
||||
серийного номера и максимальная вместительность ключа.</li>
|
||||
|
||||
<li><strong>Добавление случайных данных в конец номера</strong>
|
||||
- окончательное количество байт в серийном номере должно
|
||||
равняться количеству бит в ключах алгоритма, деленному на 8.
|
||||
Серийный номер дополняется до этого числа байт случайными
|
||||
данными. В результате получается следующий формат серийного
|
||||
номера: 00 02 NN..NN 00 DD..DD MM..MM, где NN - набор случайных
|
||||
ненулевых байтов, DD - исходный серийный номер, MM -набор
|
||||
случайных байтов (в т.ч. и нулевых). Суммарная длина
|
||||
последовательности должна равняться количеству бит,
|
||||
применяемому в алгоритме, деленному на 8.</li>
|
||||
|
||||
<li><strong>Шифрование</strong> - производится по стандатной
|
||||
схеме, реализованной во многих библиотеках, работающих с
|
||||
большими числами. Генератор на PHP содержит всю необходимую
|
||||
информацию в открытом виде.</li>
|
||||
|
||||
<li><strong>Упаковка</strong> - полученный после шифрования
|
||||
набор байт кодируется в base-64 - это и есть серийный номер,
|
||||
который отправляется покупателю.</li>
|
||||
</ul><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
121
help/ru/manager/keygen/index.htm
Normal file
121
help/ru/manager/keygen/index.htm
Normal file
@@ -0,0 +1,121 @@
|
||||
<!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>Генераторы ключей</title>
|
||||
<style type="text/css">
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Генераторы ключей</h1><strong>Зачем они нужны?</strong>
|
||||
|
||||
<p>Помимо VMProtect, серийные номера могут генерироваться другими
|
||||
программами - генераторами. Это нужно для автоматизации выдачи
|
||||
номеров без участия человека. Покупатель покупает продукт,
|
||||
регистратор делает HTTP-запрос на сайт производителя, там
|
||||
запускается программа-генератор и на основе данных о покупателе
|
||||
формирует серийный номер. Номер отправляется покупателю и
|
||||
производителю. Производитель вносит его в базу VMProtect вручную,
|
||||
через окно импорта лицензий.</p><strong>Принцип работы</strong>
|
||||
|
||||
<p>Система лицензирования VMProtect построена на асимметричных
|
||||
алгоритмах, поэтому для генерации серийных номеров требуется
|
||||
секретный ключ продукта. Этот ключ можно экспортировать в окне
|
||||
свойств продукта и передать программе-генератору подходящим для
|
||||
нее способом.</p>
|
||||
|
||||
<p>Программа-генератор вызывается регистратором через
|
||||
HTTP-запрос. Генератор на PHP может быть вызван напрямую,
|
||||
генератор в виде DLL - косвенно, но алгоритм остается одним и тем
|
||||
же:</p>
|
||||
|
||||
<ul>
|
||||
<li>Получить данные о пользователе от регистратора</li>
|
||||
|
||||
<li>Добавить необходимую информацию, которую указал
|
||||
производитель</li>
|
||||
|
||||
<li>Сформировать серийный номер</li>
|
||||
|
||||
<li>Зашифровать его одним из алгоритмов</li>
|
||||
|
||||
<li>Передать результат регистратору</li>
|
||||
</ul><strong>Существуют ли готовые генераторы?</strong>
|
||||
|
||||
<p>С системой лицензирования поставляется три готовых генератора
|
||||
серийных номеров <a href="keygen_dll.htm">в виде DLL</a>,
|
||||
<a href="keygen_net.htm">для платформы .Net</a> и <a href=
|
||||
"keygen_php.htm">реализованный на PHP</a>.</p><strong>Можно ли
|
||||
сделать свой генератор?</strong>
|
||||
|
||||
<p>Можно. Формат серийного номера находится <a href=
|
||||
"serial_format.htm">здесь</a>, алгоритмы шифрования серийного
|
||||
номера описаны <a href=
|
||||
"algorithms.htm">здесь</a>.</p><strong>Насколько это
|
||||
безопасно?</strong>
|
||||
|
||||
<p>В общем случае - вполне безопасно. Однако есть несколько
|
||||
рекомендаций, которым стоит следовать:</p>
|
||||
|
||||
<ul>
|
||||
<li><strong>Используйте протокол HTTPS</strong> - если ваш
|
||||
регистратор умеет делать запрос по HTTPS, а ваш хостинг
|
||||
позволяет отвечать на такие запросы, то этот вариант
|
||||
предпочтительнее обычного HTTP, т.к. поток данных будет
|
||||
зашифрован и сгенерированный серийный номер сможет получить
|
||||
только регистратор.</li>
|
||||
|
||||
<li><strong>"Спрячьте" генератор</strong> - убедитесь, что
|
||||
генератор нельзя вызвать случайно. Адрес
|
||||
www.site.com/keygen.php - плохая идея. А вот
|
||||
www.site.com/abc123.php - уже лучше. Убедитесь, что на
|
||||
генератор нет внешних ссылок, что он не показывается при
|
||||
просмотре содержимого директории сайта и не помещайте его в
|
||||
служебные файлы типа robots.txt. Чем меньше известно о
|
||||
расположении генератора - тем лучше. Как вариант - можно
|
||||
вынести генератор на другой сайт.</li>
|
||||
|
||||
<li><strong>Убедитесь, что вас вызывает регистратор</strong> -
|
||||
в программе, обрабатывающей запрос от регистратора, необходимо
|
||||
проверить IP-адрес вызывающей стороны. Обычно регистраторы
|
||||
публикуют список адресов, с которых они могут вызвать
|
||||
генератор. Найдите такой у вашего регистратора и добавьте
|
||||
проверку. В случае несовпадения адреса, лучше не выдавать
|
||||
понятных ошибок. Не возвращайте ничего или верните ошибку 404.
|
||||
Не давайте повода понять, почему вызов оказался неудачен.</li>
|
||||
|
||||
<li><strong>Проверяйте входные параметры</strong> - в
|
||||
настройках продукта у регистратора обычно дается возможность
|
||||
указать строку запроса, который регистратор будет делать для
|
||||
получения лицензии. Скажем, вы хотите получать имя
|
||||
пользователя, адрес его электронной почты, дату продажи и номер
|
||||
заказа. Убедитесь при получении запроса, что все параметры
|
||||
переданы и что все они имеют корректный формат. Не отвечайте на
|
||||
запросы с ошибками. О любых ошибках уведомляйте себя отправкой
|
||||
e-mail со всеми параметрами, с которыми был вызван генератор.
|
||||
Это поможет разобраться в причинах проблемы.</li>
|
||||
|
||||
<li><strong>Добавьте "пароль"</strong> - укажите в запросе,
|
||||
посылаемом регистратором, дополнительный параметр - пароль. С
|
||||
неочевидным именем и значением. Проверяйте его на принимающей
|
||||
стороне. В случае несовпадения или отсутствия - не генерируйте
|
||||
номер.</li>
|
||||
</ul><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
284
help/ru/manager/keygen/keygen_dll.htm
Normal file
284
help/ru/manager/keygen/keygen_dll.htm
Normal file
@@ -0,0 +1,284 @@
|
||||
<!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>Генератор ключей: Windows-версия</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Генераторы ключей: Windows-версия</h1>
|
||||
|
||||
<h3>Описание</h3>
|
||||
|
||||
<p>Генератор для Windows представляет собой DLL-файлы для
|
||||
платформ x86 и x64, заголовочный файл языка C и lib-файл,
|
||||
совместимый с MSVC. Таким образом, библиотека может быть как слинкована статически, так
|
||||
и загружаться динамически.</p>
|
||||
|
||||
<p>Все файлы генератора находятся в каталоге
|
||||
<strong>Keygen\DLL</strong>, там же находится тестовое
|
||||
приложение, которое генерирует серийные номера.</p>
|
||||
|
||||
<h3>API генератора</h3>
|
||||
|
||||
<p>Генератор экспортирует всего две функции: одна непосредственно
|
||||
генерирует серийный номер, вторая - освобождает память,
|
||||
выделенную первой. Начнем с первой и основной функции:</p>
|
||||
<pre class="code"><strong>VMProtectErrors</strong> __stdcall <strong>VMProtectGenerateSerialNumber</strong>(
|
||||
<strong>VMProtectProductInfo *</strong> pProductInfo,
|
||||
<strong>VMProtectSerialNumberInfo *</strong> pSerialInfo,
|
||||
<strong>char **</strong> pSerialNumber
|
||||
);
|
||||
</pre>
|
||||
|
||||
<p>Первый параметр - указатель на структуру
|
||||
<strong>VMProtectProductInfo</strong>, содержимое которой
|
||||
выгружается в VMProtect (см. <a href=
|
||||
"../licenses.htm#export">Экспорт параметров продукта</a>).
|
||||
Структура содержит приватный ключ продукта, используемый алгоритм
|
||||
и количество бит, а также идентификатор продукта. Подробнее о
|
||||
заполнении этой структуры написано ниже.</p>
|
||||
|
||||
<p>Второй параметр - указатель на структуру
|
||||
<strong>VMProtectSerialNumberInfo</strong>, содержимое которой
|
||||
переносится в генерируемый серийный номер. Структура содержит все
|
||||
поля серийного номера, а также битовую маску, определяющую какие
|
||||
именно поля должны быть записаны в серийный номер.</p>
|
||||
<pre class="code">struct <strong>VMProtectSerialNumberInfo</strong>
|
||||
{
|
||||
<strong>INT</strong> flags;
|
||||
<strong>wchar_t *</strong> pUserName;
|
||||
<strong>wchar_t *</strong> pEMail;
|
||||
<strong>DWORD</strong> dwExpDate;
|
||||
<strong>DWORD</strong> dwMaxBuildDate;
|
||||
<strong>BYTE</strong> nRunningTimeLimit;
|
||||
<strong>char *</strong> pHardwareID;
|
||||
<strong>size_t</strong> nUserDataLength;
|
||||
<strong>BYTE *</strong> pUserData;
|
||||
};
|
||||
</pre>
|
||||
|
||||
<p>Поле <strong>flags</strong> содержит битовые флаги из набора
|
||||
<strong>VMProtectSerialNumberFlags</strong>, описанного перед
|
||||
структурой:</p>
|
||||
|
||||
<ul>
|
||||
<li><strong>HAS_USER_NAME</strong> - поместить в серийный номер
|
||||
имя пользователя, находящееся в переменной
|
||||
<strong>pUserName</strong>.</li>
|
||||
|
||||
<li><strong>HAS_EMAIL</strong> - поместить в серийный номер
|
||||
e-mail пользователя, находящийся в переменной
|
||||
<strong>pEMail</strong>.</li>
|
||||
|
||||
<li><strong>HAS_EXP_DATE</strong> - серийный номер перестанет
|
||||
действовать поле окончания дня, указанного в переменной
|
||||
<strong>dwExpDate</strong>.</li>
|
||||
|
||||
<li><strong>HAS_MAX_BUILD_DATE</strong> - серийный номер будет
|
||||
подходить только к версиям продукта, созданным до даты,
|
||||
указанной в переменной <strong>dwMaxBuildDate</strong>.</li>
|
||||
|
||||
<li><strong>HAS_TIME_LIMIT</strong> - программа перестанет
|
||||
работать по истечении времени, указанного в переменной
|
||||
<strong>nRunningTimeLimit</strong> (время указывается в минутах
|
||||
и не может превышать 255).</li>
|
||||
|
||||
<li><strong>HAS_HARDWARE_ID</strong> - программа будет работать
|
||||
только на оборудовании с идентификатором, указанным в
|
||||
переменной <strong>pHardwareID</strong>.</li>
|
||||
|
||||
<li><strong>HAS_USER_DATA</strong> - поместить в серийный номер
|
||||
пользовательские данные длинной
|
||||
<strong>nUserDataLength</strong>, расположенные по адресу,
|
||||
указанному в переменной <strong>pUserData</strong>.</li>
|
||||
</ul>
|
||||
|
||||
<p>Третий параметр - указатель на указатель. Туда будет записан
|
||||
адрес сгенерированного серийного номера. После генерации номер
|
||||
необходимо скопировать, а адрес передать во вторую функцию API
|
||||
генератора, которая освободит занимаемую серийным номером
|
||||
память.</p>
|
||||
<pre class="code"><strong>void</strong> __stdcall <strong>VMProtectFreeSerialNumberMemory</strong>(<strong>char *</strong> pSerialNumber);
|
||||
</pre>
|
||||
|
||||
<p>Функция <strong>VMProtectGenerateSerialNumber</strong>
|
||||
возвращает значение типа <strong>VMProtectErrors</strong>,
|
||||
содержащее 0 в случае успешной генерации номера или код ошибки в
|
||||
противном случае. Возможны следующие коды ошибок:</p>
|
||||
|
||||
<ul>
|
||||
<li><strong>ALL_RIGHT</strong> - ошибок нет, номер сгенерирован
|
||||
успешно.</li>
|
||||
|
||||
<li><strong>UNSUPPORTED_ALGORITHM</strong> - в первом параметре
|
||||
функции передан некорректный алгоритм шифрования ключа.</li>
|
||||
|
||||
<li><strong>UNSUPPORTED_NUMBER_OF_BITS</strong> - в первом
|
||||
параметре функции передано некорректное количество бит в
|
||||
ключе.</li>
|
||||
|
||||
<li><strong>USER_NAME_IS_TOO_LONG</strong> - длина имени
|
||||
пользователя в кодировке UTF-8 превысила 255 байт.</li>
|
||||
|
||||
<li><strong>EMAIL_IS_TOO_LONG</strong> - длина e-mail
|
||||
пользователя в кодировке UTF-8 превысила 255 байт.</li>
|
||||
|
||||
<li><strong>USER_DATA_IS_TOO_LONG</strong> - длина
|
||||
пользовательских данных превышает 255 байт.</li>
|
||||
|
||||
<li><strong>HWID_HAS_BAD_SIZE</strong> - идентификатор
|
||||
оборудования имеет некорректный размер.</li>
|
||||
|
||||
<li><strong>PRODUCT_CODE_HAS_BAD_SIZE</strong> - идентификатор
|
||||
продукта, переданный в первом параметре функции, имеет неверный
|
||||
размер.</li>
|
||||
|
||||
<li><strong>SERIAL_NUMBER_TOO_LONG</strong> - серийный номер
|
||||
слишком длинный и не помещается в указанное в алгоритме количество
|
||||
бит.</li>
|
||||
|
||||
<li><strong>BAD_PRODUCT_INFO</strong> - первый параметр функции
|
||||
некорректен или NULL.</li>
|
||||
|
||||
<li><strong>BAD_SERIAL_NUMBER_INFO</strong> - второй параметр
|
||||
функции некорректен или NULL.</li>
|
||||
|
||||
<li><strong>BAD_SERIAL_NUMBER_CONTAINER</strong> - третий
|
||||
параметр функции не указывает на ячейку памяти для записи
|
||||
адреса серийного номера.</li>
|
||||
|
||||
<li><strong>NOT_EMPTY_SERIAL_NUMBER_CONTAINER</strong> - третий
|
||||
параметр функции не указывает на пустую ячейку, в ячейке должно
|
||||
быть значение NULL.</li>
|
||||
|
||||
<li><strong>BAD_PRIVATE_EXPONENT</strong> - значение приватной
|
||||
экспоненты в первом параметре функции некорректно.</li>
|
||||
|
||||
<li><strong>BAD_MODULUS</strong> - значение модуля в первом
|
||||
параметре функции некорректно.</li>
|
||||
</ul>
|
||||
|
||||
<p>Ошибки делятся на две категории: те, что связаны с
|
||||
некорректными параметрами или с содержимым первого параметра
|
||||
функции, и все остальные. Ошибки первой категории редки и
|
||||
являются признаком некорректной настройки структуры. Имеет смысл
|
||||
выгрузить информацию о продукте повторно и убедиться, что
|
||||
структура заполняется правильно. Пример правильного заполнения
|
||||
приведен ниже.</p>
|
||||
|
||||
<p>Ошибки второй категории связаны с попыткой вместить в ключ
|
||||
больше данных, чем это возможно ввиду его размера. В таком случае
|
||||
разумно будет отправить регистратору вместо ключа текст "Ключ
|
||||
будет выслан в течение суток", а всю необходимую информацию
|
||||
отправить себе по почте. Ключ в таком случае генерируется в
|
||||
VMProtect в ручном режиме, какие-то данные обрезаются, чтобы
|
||||
уместить все необходимое в максимальный размер
|
||||
ключа.</p>
|
||||
|
||||
<h3>Пример использования</h3>
|
||||
|
||||
<p>Ниже приведен пример кода, который вызывает две вышеописанные
|
||||
функции и генерирует серийный номер. Обратите внимание на блок
|
||||
кода, расположенный в самом начале. Пример не будет работать пока
|
||||
вы не замените его на блок, выгруженный для продукта из
|
||||
VMProtect:</p>
|
||||
<pre class="code">//////////////////////////////////////////////////////////////////////////
|
||||
// !!! this block should be generated by VMProtect !!! ///
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
<strong>VMProtectAlgorithms</strong> g_Algorithm = ALGORITHM_RSA;
|
||||
<strong>size_t</strong> g_nBits = 0;
|
||||
<strong>byte</strong> g_vModulus[1];
|
||||
<strong>byte</strong> g_vPrivate[1];
|
||||
<strong>byte</strong> g_vProductCode[1];
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
<strong>int</strong> _tmain(<strong>int</strong> argc, <strong>_TCHAR*</strong> argv[])
|
||||
{
|
||||
<strong>VMProtectProductInfo</strong> pi;
|
||||
pi.algorithm = g_Algorithm;
|
||||
pi.nBits = g_nBits;
|
||||
pi.nModulusSize = sizeof(g_vModulus);
|
||||
pi.pModulus = g_vModulus;
|
||||
pi.nPrivateSize = sizeof(g_vPrivate);
|
||||
pi.pPrivate = g_vPrivate;
|
||||
pi.nProductCodeSize = sizeof(g_vProductCode);
|
||||
pi.pProductCode = g_vProductCode;
|
||||
|
||||
<strong>VMProtectSerialNumberInfo</strong> si = {0};
|
||||
si.flags = HAS_USER_NAME | HAS_EMAIL;
|
||||
si.pUserName = L"John Doe";
|
||||
si.pEMail = L"john@doe.com";
|
||||
<strong>char *</strong> pBuf = NULL;
|
||||
<strong>VMProtectErrors</strong> res = <strong>VMProtectGenerateSerialNumber</strong>(&pi, &si, &pBuf);
|
||||
<strong>if</strong> (res == ALL_RIGHT)
|
||||
{
|
||||
<strong>printf</strong>("Serial number:\n%s\n", pBuf);
|
||||
<strong>VMProtectFreeSerialNumberMemory</strong>(pBuf);
|
||||
}
|
||||
else
|
||||
{
|
||||
<strong>printf</strong>("Error: %d\n", res);
|
||||
}
|
||||
|
||||
<strong>return</strong> 0;
|
||||
}
|
||||
</pre>
|
||||
|
||||
<p>Этот пример с проектом для Microsoft Visual Studio находится в
|
||||
каталоге <strong>Keygen\DLL\Example</strong>, ниже будут описаны
|
||||
наиболее интересные места кода.</p>
|
||||
|
||||
<p>Первые строчки функции <strong>main</strong> заполняют
|
||||
структуру <strong>VMProtectProductInfo</strong> данными,
|
||||
выгруженными из VMProtect. Этот код стандартен, его не следует
|
||||
менять во избежание появления ошибок. Далее создается структура
|
||||
<strong>VMProtectSerialNumberInfo</strong>, в поле флагов
|
||||
выставляется комбинация из битов имени пользователя и e-mail.
|
||||
Строчкой ниже в соответствующие поля структуры заносятся значения
|
||||
имени пользователя и пароля. Обратите внимание, что значения
|
||||
принимаются в кодировке UNICODE. Генератор ключей внутри
|
||||
преобразует их в кодировку UTF-8.</p>
|
||||
|
||||
<p>Далее описывается переменная-указатель, куда будет записан
|
||||
адрес сгенерированного ключа, и вызывается функция
|
||||
<strong>VMProtectGenerateSerialNumber</strong>, после чего
|
||||
анализируется код возврата. Если ошибок нет, то сгенерированный
|
||||
номер печатается на консоль и вызывается функция осовобождения
|
||||
памяти.</p>
|
||||
|
||||
<h3>Остальные поля структуры VMprotectSerialNumberInfo</h3>
|
||||
|
||||
<p>Некоторые поля структуры требуют дополнительных поясненений. К
|
||||
примеру, поля <strong>dwExpDate</strong> и
|
||||
<strong>dwMaxBuildDate</strong> содержат даты в определенном
|
||||
формате: <strong>0xYYYYMMDD</strong>, т.е. год хранится в старшем
|
||||
слове, а месяц и день в старшем и младшем байтах младшего слова.
|
||||
Для формирования такого числа описан макрос <strong>MAKEDATE(y,
|
||||
m, d)</strong>, который можно вызвать так: <strong>MAKEDATE(2010,
|
||||
05, 12)</strong>.</p>
|
||||
|
||||
<p>В поле <strong>pHardwareID</strong> должен быть записан
|
||||
указатель на строку, которую вернул метод
|
||||
<strong>VMProtectGetCurrentHWID</strong> из SDK
|
||||
лицензирования.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
115
help/ru/manager/keygen/keygen_net.htm
Normal file
115
help/ru/manager/keygen/keygen_net.htm
Normal file
@@ -0,0 +1,115 @@
|
||||
<!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>Генератор ключей: .Net-версия</title>
|
||||
<style type="text/css">
|
||||
/*<![CDATA[*/
|
||||
div.c2 {text-align: center}
|
||||
p.c1 {color:red;}
|
||||
/*]]>*/
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Генераторы ключей: .Net-версия</h1>
|
||||
|
||||
<h3>Описание</h3>
|
||||
|
||||
<p>.Net-версия генератора ключей преставляет собой сборку,
|
||||
содержащую все необходимое для генерации серийных номеров.
|
||||
Исходные коды находятся в каталоге <strong>Keygen\Net</strong> в
|
||||
виде двух проектов: KeyGen (непосредственно генератор серийных
|
||||
номеров) и Usage (пример использования генератора).</p>
|
||||
|
||||
<p class="c1">Генератор поставляется в исходных кодах, чтобы
|
||||
иметь возможность пересобрать его под нужную версию .Net
|
||||
Framework, однако крайне не рекомендуется вносить изменения в его
|
||||
код. В будущих версиях VMProtect возможно добавление новых
|
||||
возможностей в генератор, что приведет к необходимости повторной
|
||||
модификации кода. Также возможно появление трудноуловимых ошибок.
|
||||
В случае нахождения ошибки в оригинальном коде генератора или
|
||||
пожеланий по его улучшению - обращайтесь в службу
|
||||
поддержки.</p>
|
||||
|
||||
<h3>Использование генератора</h3>
|
||||
|
||||
<p>Возьмите за основу код из проекта <strong>Usage</strong>,
|
||||
добавьте в Ваш проект ссылку на сборку VMProtect.KeyGen.dll,
|
||||
после чего Вы сможете генерировать серийные номера в вашем
|
||||
приложении. Для нормальной работы генератор должен понимать,
|
||||
к какому продукту Вы собираетесь генерировать серийные номера.
|
||||
Для этого на закладке "Лицензии" VMProtect нажмите кнопку
|
||||
«Экспорт» и в выпадающем списке выберите «Параметры для
|
||||
KeyGen.Net». В текстовом поле ниже появятся несколько строк
|
||||
текста, которые необходимо скопировать и перенести в Ваше
|
||||
приложение в виде строковой константы.</p>
|
||||
|
||||
<p>Пример вызова генератора представлен ниже:</p>
|
||||
<pre>
|
||||
try
|
||||
{
|
||||
string data = @""; // put the exported data here
|
||||
Generator g = new Generator(data);
|
||||
g.UserName = "John Doe";
|
||||
g.EMail = "john@doe.com";
|
||||
g.ExpirationDate = DateTime.Now.AddMonths(1);
|
||||
g.MaxBuildDate = DateTime.Now.AddYears(1);
|
||||
g.RunningTimeLimit = 15;
|
||||
g.HardwareID = "AQIDBAgHBgU=";
|
||||
g.UserData = new byte[] { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
|
||||
string serial = g.Generate();
|
||||
Console.WriteLine("Serial number:\n{0}\n", serial);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine("Error: {0}", ex);
|
||||
}
|
||||
|
||||
</pre>
|
||||
|
||||
<p>Строку, скопированную в окне экспорта VMProtect, необходимо
|
||||
поместить в переменную <strong>data</strong>, которая будет
|
||||
передана параметром в конструктор класса генератора серийных
|
||||
номеров. В случае каких-либо проблем с разбором данных продукта,
|
||||
конструктор выбросит исключение с описанием проблемы. Если
|
||||
конструктор отработал успешно, то генератор готов к созданию
|
||||
серийных номеров.</p>
|
||||
|
||||
<p>Серийный номер может содержать различную информацию, которая
|
||||
задается через свойства генератора. Пример выше показывает, как
|
||||
заполнить абсолютно все поля серийного номера. Отдельные поля
|
||||
имеют ограничения. Например, поля <strong>User Name</strong> и
|
||||
<strong>E-Mail</strong> не могут принять строки, которые в
|
||||
кодировке UTF-8 будут иметь длину, превышающую 255 символов. В
|
||||
случае подачи некорректных данных, свойства выбрасывают исключения с
|
||||
описанием проблемы.</p>
|
||||
|
||||
<p>По окончании настройки генератора вызывается метод
|
||||
<strong>Generate()</strong>, который и создает серийный номер. На
|
||||
этом этапе происходит компоновка всех данных номера, подсчет
|
||||
контрольных сумм и, непосредственно, шифрование. В случае, если
|
||||
объем данных превышает максимально допустимую длину, метод выбросит
|
||||
исключение.</p>
|
||||
|
||||
<p>В случае, если необходимо сгенерировать несколько серийных
|
||||
номеров, можно использовать класс генератора несколько раз, не
|
||||
пересоздавая его. Чтобы "очистить" любое из свойств генератора,
|
||||
ему нужно присвоить значение <strong>null</strong>.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
143
help/ru/manager/keygen/keygen_php.htm
Normal file
143
help/ru/manager/keygen/keygen_php.htm
Normal file
@@ -0,0 +1,143 @@
|
||||
<!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>Генератор ключей: UNIX-версия</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Генераторы ключей: UNIX-версия</h1>
|
||||
|
||||
<h3>Описание</h3>
|
||||
|
||||
<p>UNIX-версия генератора ключей преставляет собой PHP-файл,
|
||||
содержащий все необходимое для генерации серийных номеров. Файл
|
||||
находится в каталоге <strong>Keygen\PHP</strong>, ниже
|
||||
рассмотрены основные моменты его
|
||||
использования.</p>
|
||||
|
||||
<h3>Настройка генератора</h3>
|
||||
|
||||
<p>В самом начале PHP-файла располагается код настройки
|
||||
генератора:</p>
|
||||
<pre class="code">//////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// The following lines should be generated by VMProtect License Manager
|
||||
$exported_algorithm = "RSA";
|
||||
$exported_bits = 2048;
|
||||
$exported_private = "PJvj4kEpoQMIpYK+9wEt......xKeiSZgzdiln8Q==";
|
||||
$exported_modulus = "rOlny/3QgZb/VmGr3CmY......I6ESAUmtQ+RBqQ==";
|
||||
$exported_product_code = "oLQdGUn8kVk=";
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////
|
||||
</pre>
|
||||
|
||||
<p>Этот код генерируется автоматически в VMProtect (см. <a href=
|
||||
"../licenses.htm#export">Экспорт параметров продукта</a>) и
|
||||
уникален для каждого конкретного продукта. Очень важно
|
||||
скопировать его без ошибок, в противном случае генератор будет
|
||||
работать некорректно.</p><strong>Содержимое ключа</strong>
|
||||
|
||||
<p>Далее в генераторе задается содержимое серийного номера.
|
||||
Содержимое задается массивом, ниже задаются все возможные
|
||||
параметры ключа, однако в реальных условиях часть из них может
|
||||
отсутствовать:</p>
|
||||
<pre class="code">$params = <strong>array</strong>(
|
||||
user_name => "John Doe", // UTF-8!
|
||||
email => "john@doe.com",
|
||||
hwid => "vHGMdMRvGCPjWcCQ", // Exactly as returned by VMProtectGetCurrentHWID
|
||||
expire_date => <strong>array</strong>(year => 2009, month => 10, day => 1),
|
||||
maxbuild_date => <strong>array</strong>(year => 2009, month => 10, day => 1),
|
||||
time_limit => 10,
|
||||
user_data => <strong>base64_decode</strong>("CGCvRvMWcPHGdMjQ"), // string of bytes
|
||||
);
|
||||
</pre>
|
||||
|
||||
<h3>Функция обработки успешной генерации</h3>
|
||||
|
||||
<p>Ниже расположена простейшая реализация функции, которая
|
||||
вызывается при успешной генерации серийного номера. Единственным
|
||||
параметром она получает строку с номером. Функция должна передать
|
||||
номер вызывающей стороне (регистратору), обычно это делается при
|
||||
помощи команды <strong>echo</strong>. Предварительно строка
|
||||
разбивается на подстроки длиной 75 символов для удобства. Также
|
||||
эта функция может отправлять сгенерированный номер по почте
|
||||
производителю программы или заносить его в базу данных.</p>
|
||||
<pre class="code">function <strong>OnSerialGenerated</strong>($serial)
|
||||
{
|
||||
$serial = <strong>wordwrap</strong>($serial, 75, "\n", true);
|
||||
<strong>echo</strong> $serial;
|
||||
}
|
||||
</pre>
|
||||
|
||||
<h3>Функция обработки ошибок генерации</h3>
|
||||
|
||||
<p>Последний участок кода, требующий внимания - это функция,
|
||||
которая вызывается в случае возникновения проблем. Функция
|
||||
получает в виде параметра строку с текстом ошибки, а после ее
|
||||
завершения вызывается функция <strong>die()</strong>. Функция
|
||||
должна сделать две вещи: вернуть регистратору вместо ключа текст
|
||||
о том, что ключ будет выслан вручную, а также выслать
|
||||
производителю программы всю необходимую информацию для устранения
|
||||
ошибки и ручной генерации ключа.</p>
|
||||
<pre class="code">function <strong>OnSerialGenerationFailed</strong>($details)
|
||||
{
|
||||
<strong>echo</strong> "You will receive serial number in the next 24 hours"; // message to the customer
|
||||
// mail("support@vendor.com", "Houston, we have a problem", $details); // message to vendor
|
||||
}
|
||||
</pre>
|
||||
|
||||
<p>Причин возникновения ошибки может быть несколько: некорректные
|
||||
параметры алгоритма, некорректные параметры ключа, слишком
|
||||
длинное имя пользователя или e-mail. Слишком длинный серийный
|
||||
номер, который не влезает в количество бит, указанное в
|
||||
алгоритме. Поэтому функция
|
||||
<strong>OnSerialGenerationFailed</strong> должна отправить
|
||||
производителю максимально подробную информацию о случившемся,
|
||||
дабы тот мог вручную сгенерировать серийный номер и отправить его
|
||||
покупателю.</p>
|
||||
|
||||
<h3>На что еще следует обратить внимание</h3>
|
||||
|
||||
<p>Генератор ключей в примерах максимально упрощен. Он не
|
||||
учитывает рекомендации по разработке веб-генераторов, данные
|
||||
<a href="index.htm">здесь</a>. Он не проверяет IP-адрес
|
||||
вызывающей стороны и не анализирует входные параметры. Имейте это
|
||||
в виду, когда будете создавать свой собственный генератор на
|
||||
основе этого.</p>
|
||||
|
||||
<p>Имя пользователя и e-mail должны быть переданы в кодировке
|
||||
UTF-8. Уточните у вашего регистратора, в какой кодировке он
|
||||
передает информацию о покупателе и, при необходимости, проведите
|
||||
конвертацию. Неправильная кодировка не приведет к
|
||||
неработоспособности серийного номера, однако номер будет
|
||||
содержать совершенно другое имя пользователя и он может быть
|
||||
удивлен, если вы показываете его, скажем, в окне "О
|
||||
Программе".</p>
|
||||
|
||||
<p>Асимметричное шифрование - достаточно сложный в математическом
|
||||
плане процесс. Если он реализован на чистом PHP, без применения
|
||||
сторонних библиотек, то генерация серийного номера может занять
|
||||
десятки секунд. Генератор использует функции
|
||||
<strong>gmp_powm</strong>, <strong>bi_powmod</strong>,
|
||||
<strong>bcpowod</strong> в случае их наличия. Все эти функции
|
||||
имеют разную скорость. Если генерация ключей на вашем хостинге
|
||||
занимает слишком большое время, рекомендуется пообщаться со
|
||||
службой поддержки на предмет подключения описаных выше функций. К
|
||||
примеру, функция <strong>gmp_powm</strong> работает в десятки раз быстрее
|
||||
функции <strong>bcpowmod</strong>.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
260
help/ru/manager/keygen/serial_format.htm
Normal file
260
help/ru/manager/keygen/serial_format.htm
Normal file
@@ -0,0 +1,260 @@
|
||||
<!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>Формат серийного номера</title>
|
||||
<style type="text/css">
|
||||
/*<![CDATA[*/
|
||||
th {text-align:left;}
|
||||
table {border-collapse:collapse; margin-top: 4px;}
|
||||
td,th {border: 1px solid #B0B0B0; padding-left:10;padding-right:10;}
|
||||
/*]]>*/
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Формат серийного номера</h1>
|
||||
|
||||
<h3>Структура серийного номера</h3>
|
||||
|
||||
<p>Серийный номер состоит из блоков. Каждый блок
|
||||
начинается с байта идентификатора, который определяет его
|
||||
содержимое и, возможно, длину. Последним всегда идет блок с
|
||||
идентификатором 255, содержащий контрольную сумму всего серийного
|
||||
номера, за исключением последнего блока.</p>
|
||||
|
||||
<p>В зависимости от типа блока, он может иметь фиксированную или
|
||||
переменную длину. Во втором случае обычно длина идет в следующем
|
||||
за идентификатором блока байте. Подробно формат каждого блока
|
||||
описан ниже.</p>
|
||||
|
||||
<h3>Формат блоков</h3>
|
||||
|
||||
<table border="1" cellspacing="0" cellpadding="2">
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
|
||||
<th>Название</th>
|
||||
|
||||
<th>Размер (байт)</th>
|
||||
|
||||
<th>Описание</th>
|
||||
|
||||
<th>Пример</th>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>0x01</td>
|
||||
|
||||
<td>Версия</td>
|
||||
|
||||
<td>1</td>
|
||||
|
||||
<td>Блок содержит версию серийного номера размером в 1 байт.
|
||||
Версия должна быть равна 1.</td>
|
||||
|
||||
<td>01 01</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>0x02</td>
|
||||
|
||||
<td>Имя пользователя</td>
|
||||
|
||||
<td>1 + N</td>
|
||||
|
||||
<td>Блок содержит имя пользователя в кодировке UTF-8. Перед
|
||||
именем пользователя располагается 1 байт длины имени. Таким
|
||||
образом, длина имени пользователя не может превышать 255
|
||||
байт. Завершающий 0 не требуется.</td>
|
||||
|
||||
<td>02 04 4A 5F 48 4E</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>0x03</td>
|
||||
|
||||
<td>E-Mail</td>
|
||||
|
||||
<td>1 + N</td>
|
||||
|
||||
<td>Блок содержит e-mail пользователя в кодировке UTF-8.
|
||||
Перед e-mail'ом располагается 1 байт длины. Таким образом,
|
||||
длина e-mail не может превышать 255 байт. Завершающий 0 не
|
||||
требуется.</td>
|
||||
|
||||
<td>03 07 61 40 62 2E 63 6F 6D</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>0x04</td>
|
||||
|
||||
<td>Идентификатор оборудования</td>
|
||||
|
||||
<td>1 + N</td>
|
||||
|
||||
<td>Блок содержит идентификатор оборудования, возвращенный
|
||||
функцией <strong>VMProtectGetCurrentHWID()</strong>. Функция
|
||||
возвращает строку в кодировке base-64, в серийный номер
|
||||
помещается раскодированный вариант строки. Длина блока данных
|
||||
должна быть кратна 4. Перед блоком данных располагается байт
|
||||
длины. Максимальная длина блока - 32 байта.</td>
|
||||
|
||||
<td>04 08 E1 E2 E3 E4 A1 A2 A3 A4</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>0x05</td>
|
||||
|
||||
<td>Дата окончания лицензии</td>
|
||||
|
||||
<td>4</td>
|
||||
|
||||
<td>Блок содержит дату окончания действия серийного номера.
|
||||
Формат хранения даты описан ниже.</td>
|
||||
|
||||
<td>05 01 0A 07 DA</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>0x06</td>
|
||||
|
||||
<td>Максимальное время работы</td>
|
||||
|
||||
<td>1</td>
|
||||
|
||||
<td>Блок содержит 1 байт с временем работы программы в
|
||||
минутах. Максимальное время работы, таким образом, может
|
||||
составлять 255 минут.</td>
|
||||
|
||||
<td>06 05</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>0x07</td>
|
||||
|
||||
<td>Код продукта</td>
|
||||
|
||||
<td>8</td>
|
||||
|
||||
<td>Блок содержит код продукта - 8 байт, которые создаются
|
||||
VMProtect и выгружаются при экспорте параметров продукта.
|
||||
Выгружаются они в кодировке base-64, перед помещением в
|
||||
серийный номер строку необходимо преобразовать в массив байт.
|
||||
Размер массива должен быть строго равен 8 байтам.
|
||||
<strong>Этот блок является обязательным, без него защищенная
|
||||
программа будет работать некорректно!</strong></td>
|
||||
|
||||
<td>07 01 02 03 04 05 06 07 08</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>0x08</td>
|
||||
|
||||
<td>Данные пользователя</td>
|
||||
|
||||
<td>1 + N</td>
|
||||
|
||||
<td>Блок содержит до 255 байт пользовательских данных.
|
||||
Система лицензирования не анализирует эти данные и возвращает
|
||||
их при вызове функции
|
||||
<strong>VMProtectGetSerialNumberData()</strong>. Перед блоком
|
||||
данных располагается байт, содержащий размер пользовательских
|
||||
данных.</td>
|
||||
|
||||
<td>08 05 01 02 03 04 05</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>0x09</td>
|
||||
|
||||
<td>Максимальная дата сборки</td>
|
||||
|
||||
<td>4</td>
|
||||
|
||||
<td>Блок содержит максимальную дату сборки приложения, с
|
||||
которым будет работать этот серийный номер. Формат хранения
|
||||
даты описан ниже.</td>
|
||||
|
||||
<td>09 01 0A 07 DA</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>0xFF</td>
|
||||
|
||||
<td>Контрольная сумма</td>
|
||||
|
||||
<td>4</td>
|
||||
|
||||
<td>Блок содержит контрольную сумму серийного номера. Блок
|
||||
располагается последним и контрольная сумма считается для
|
||||
всех блоков, идущих перед этим. Подробнее о расчете
|
||||
контрольной суммы написано ниже.</td>
|
||||
|
||||
<td>FF 01 02 03 04</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<h3>Формат хранения даты</h3>
|
||||
|
||||
<p>Даты в серийном номере хранятся в виде двойного слова -
|
||||
0xYYYYMMDD. Старшее слово содержит год, а младшее - день и месяц.
|
||||
Байты расположены в порядке Little Endian - от младшего к
|
||||
старшему. В случае, если имеется указатель на первый байт записи,
|
||||
то дата может быть считана и записана следующим кодом:</p>
|
||||
<pre class="code"><strong>byte *</strong>pDate = 0xNNNNNN; // адрес даты
|
||||
<strong>*</strong>(<strong>DWORD *</strong>)pDate = (2010 << 16) | (10 << 8) | 1; // October 1, 2010
|
||||
<strong>DWORD</strong> dwExp = *(<strong>DWORD *</strong>)pDate;
|
||||
</pre>
|
||||
|
||||
<h3>Подсчет контрольной суммы</h3>
|
||||
|
||||
<p>Контрольная сумма серийного номера вычисляется при помощи
|
||||
алгоритма хеширования SHA-1. Результатом работы алгоритма
|
||||
являются пять 32-битных слов. Первое слово используется в
|
||||
качестве контрольной суммы серийного номера. <strong>Обратите
|
||||
внимание:</strong> слово записывается в формате Little Endian (от
|
||||
младшего байта к старшему). В строковом представлении хеша SHA-1
|
||||
используется формат Big Endian - числа записываются от старшего
|
||||
байта к младшему, поэтому если SHA-1 генерируется функцией,
|
||||
которая возвращает строку (как в PHP), то первые четыре байта
|
||||
хеша необходимо предварительно
|
||||
развернуть.</p>
|
||||
|
||||
<h3>Дополнительная информация</h3>
|
||||
|
||||
<p>Блоки с номерами, отличными от описанных выше, игнорируются
|
||||
системой лицензирования. Возможно появление новых блоков в
|
||||
будущих версиях. <strong>Не рекомендуется создавать свои блоки,
|
||||
используя свободные идентификаторы!</strong> Во-первых, это может
|
||||
привести к неработоспособности ключа с новыми версиями системы
|
||||
лицензирования. А во-вторых, защищаемая программа все равно не
|
||||
сможет прочитать значения этих блоков. Для хранения какой-либо
|
||||
информации в ключе нужно использовать поле <strong>User
|
||||
Data</strong>, которое предназначено именно для этого.</p>
|
||||
|
||||
<p>Серийный номер не содержит "соли" (SALT) - случайной
|
||||
информации, предназначенной для того, чтобы ключи для одних и тех
|
||||
же данных получались разными. Эта задача возлагается на алгоритм
|
||||
шифрования. Если необходимы отличия на уровне серийных номеров,
|
||||
скажем для серии ключей, проданных в организацию, можно записать
|
||||
номер ключа строкой в поле имени пользователя (ООО "Компания",
|
||||
ключ 1 из 10) или занести эту информацию в поле <strong>User
|
||||
Data</strong> в любом удобном для разработчика формате.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
112
help/ru/manager/licenses.htm
Normal file
112
help/ru/manager/licenses.htm
Normal file
@@ -0,0 +1,112 @@
|
||||
<!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>Управление лицензиями</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Управление лицензиями</h1>
|
||||
|
||||
<h3>Инициализация</h3>
|
||||
|
||||
<p>По умолчанию функции лицензирования выключены. Чтобы включить
|
||||
их, нужно перейти в секцию "Лицензии" раздела "Проект" и создать пару ключей. В
|
||||
случае, если проект ссылается на базу данных менеджера лицензий
|
||||
(в старых версиях VMProtect лицензии управлялись отдельной
|
||||
программой), то будет предложено импортировать эти лицензии в
|
||||
проект. По окончании инициализации будут доступны опции привязки
|
||||
кода к серийному номеру, а также появится возможность создавать и
|
||||
обрабатывать серийные номера.</p>
|
||||
|
||||
<h3>Интерфейс</h3>
|
||||
|
||||
<p>Секция "Лицензии" отображает полный список лицензий в левой панели и
|
||||
параметры выбранного элемента справа в основной панели.</p>
|
||||
|
||||
<p><img src="../images/licenses1.png" /></p>
|
||||
|
||||
<p>Правая панель отображает подробную информацию о выбранной
|
||||
лицензии. Также там можно заблокировать серийный номер,
|
||||
скопировать его в буфер обмена, посмотреть подробную информацию
|
||||
об идентификаторе оборудования (кликнув по нему).</p>
|
||||
|
||||
<h3 id="AddLicense">Создание лицензии</h3>
|
||||
|
||||
<p>Для того чтобы добавить новую лицензию, необходимо кликнуть
|
||||
соответствующую кнопку на панели инструментов.
|
||||
Появится окно создания лицензии:</p>
|
||||
|
||||
<p><img src="../images/project_add_license.png" /></p>
|
||||
|
||||
<p>В верхней части окна задаются основные параметры лицензии. В
|
||||
нижней можно выбрать, какие из основных параметров попадут в
|
||||
серийный номер, а также добавить дополнительные параметры:
|
||||
например, идентификатор оборудования или пользовательские данные.
|
||||
По окончании заполнения полей нажмите ОК и VMProtect создаст
|
||||
новую лицензию.</p>
|
||||
|
||||
<h3>Удаление и блокирование лицензий</h3>
|
||||
|
||||
<p>Для удаления лицензии щелкните по ней в списке лицензий правой кнопкой мыши и выберите "Удалить" в контекстном меню. Либо просто выделите лицензию в списке и нажмите Del. Для того чтобы заблокировать лицензию, переключите параметр "Заблокирована" в основной панели справа в состояние "Да".</p><p>Между удалением лицензии и ее блокированием есть
|
||||
разница. Удаленные серийные номера не блокируются модулем
|
||||
лицензирования. Они просто перестают существовать в базе данных.
|
||||
Если лицензия создана ошибочно и серийный номер никогда никому не
|
||||
отправлялся, то ее можно удалить. Если же серийный номер
|
||||
скомпрометирован, то лицензию удалять нельзя, ее необходимо
|
||||
заблокировать. Тогда в модуль лицензирования будет передана
|
||||
информация об этом номере и он не будет принимать его.</p>
|
||||
|
||||
<h3>Импорт серийных номеров</h3>
|
||||
|
||||
<p>Серийные номера могут быть созданы не только в VMProtect, но и
|
||||
в сторонних программах - генераторах номеров. Обычно они
|
||||
применяются для автоматизированной выдачи серийных номеров
|
||||
регистраторам при продаже лицензий. Чтобы корректно занести такие
|
||||
номера в базу данных, существует функция импорта серийных
|
||||
номеров. Для ее активации необходимо нажать сочетание клавиш
|
||||
Ctrl+I или выбрать пункт "Импортировать" в меню "Проект".</p>
|
||||
|
||||
<p><img src="../images/menu_project_import.png" /></p>
|
||||
|
||||
<p>Первым шагом при импорте серийного номера является окно ввода
|
||||
номера:</p>
|
||||
|
||||
<p><img src="../images/import_key.png" /></p>
|
||||
|
||||
<p>В случае, если такая лицензия уже есть в базе данных, будет
|
||||
открыто окно редактирования лицензии. Если лицензии в базе нет,
|
||||
то будет открыто окно создания лицензии, где можно внести
|
||||
необходимые правки, после чего, нажатием кнопки ОК, лицензия
|
||||
заносится в базу данных.</p><a name="export" id="export"></a>
|
||||
|
||||
<h3>Экспорт параметров лицензирования</h3>
|
||||
|
||||
<p>Для корректной работы генераторов ключей, им необходима
|
||||
информация о секретном ключе продукта. Эту информацию в наиболее
|
||||
подходящей форме можно получить, нажав кнопку "Экспорт ключа" над
|
||||
списком лицензий. При этом появится окно экспорта данных:</p>
|
||||
|
||||
<p><img src="../images/export_keys.png" /></p>
|
||||
|
||||
<p>Поле "Формат экспорта" позволяет выбрать один из
|
||||
поддерживаемых форматов, а поле "Результат экспорта" содержит
|
||||
данные в виде, наиболее удобном для соответствующего генератора
|
||||
ключей. Кнопка "Копировать" позволяет скопировать содержимое поля
|
||||
"Результат экспорта" в буфер обмена.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
312
help/ru/manager/usage/api.htm
Normal file
312
help/ru/manager/usage/api.htm
Normal file
@@ -0,0 +1,312 @@
|
||||
<!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>Описание функций API лицензирования</title>
|
||||
<style type="text/css">
|
||||
/*<![CDATA[*/
|
||||
th {text-align:left;}
|
||||
table {border-collapse:collapse; margin-top: 4px;}
|
||||
td,th {border: 1px solid #B0B0B0; padding-left:10;padding-right:10;}
|
||||
/*]]>*/
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Описание функций API лицензирования</h1>
|
||||
|
||||
<p>API системы лицензирования является продолжением API VMProtect
|
||||
и входит в его SDK. API позволяет задать серийный номер и
|
||||
получить информацию о нем: подходит он к программе или нет, истек
|
||||
ли срок действия, на кого зарегистрирован продукт и т.п. Также API
|
||||
позволяет получить идентификатор оборудования, на котором
|
||||
выполняется программа.</p><strong id=
|
||||
"VMProtectSetSerialNumber">VMProtectSetSerialNumber</strong>
|
||||
|
||||
<p>Функция предназначена для загрузки серийного номера в систему
|
||||
лицензирования. Полный формат вызова представлен ниже:</p>
|
||||
<pre class="code">int VMProtectSetSerialNumber(const char *SerialNumber);
|
||||
</pre>
|
||||
|
||||
<p>Входной параметр <strong>SerialNumber</strong> должен
|
||||
содержать указатель на текстовую строку с серийным номером в
|
||||
кодировке base-64 и завершаемую нулем ('\0'). Функция возвращает
|
||||
битовую маску флагов состояния серийного номера, аналогичную той,
|
||||
что возвращает <strong>VMProtectGetSerialNumberState()</strong>,
|
||||
подробнее о флагах будет написано ниже. Серийный номер считается
|
||||
"хорошим", если функция вернула значение 0.</p><br />
|
||||
<strong id=
|
||||
"VMProtectGetSerialNumberState">VMProtectGetSerialNumberState</strong>
|
||||
|
||||
<p>Функция возвращает флаги состояния серийного номера,
|
||||
предварительно установленного вызовом
|
||||
<strong>VMProtectSetSerialNumber()</strong>.</p>
|
||||
<pre class="code">int VMProtectGetSerialNumberState();
|
||||
</pre>
|
||||
|
||||
<p>Наличие хотя бы одного установленного флага говорит о
|
||||
проблемах с серийным номером: программа не должна работать, если
|
||||
установлен хотя бы один бит. Подробные значениях флагов описаны в
|
||||
таблице:</p>
|
||||
|
||||
<table border="1" cellspacing="0" cellpadding="2">
|
||||
<tr>
|
||||
<th>Флаг</th>
|
||||
|
||||
<th>Значение</th>
|
||||
|
||||
<th>Описание</th>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>SERIAL_STATE_FLAG_CORRUPTED</td>
|
||||
|
||||
<td>0x00000001</td>
|
||||
|
||||
<td>Система лицензирования повреждена. Возможные причины:
|
||||
некорректная настройка проекта защиты, попытка взлома
|
||||
программы.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>SERIAL_STATE_FLAG_INVALID</td>
|
||||
|
||||
<td>0x00000002</td>
|
||||
|
||||
<td>Серийный номер некорректен. Флаг выставляется, если
|
||||
система лицензирования не может расшифровать серийный
|
||||
номер.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>SERIAL_STATE_FLAG_BLACKLISTED</td>
|
||||
|
||||
<td>0x00000004</td>
|
||||
|
||||
<td>Серийный номер подходит к продукту, однако занесен в
|
||||
черный список в VMProtect.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>SERIAL_STATE_FLAG_DATE_EXPIRED</td>
|
||||
|
||||
<td>0x00000008</td>
|
||||
|
||||
<td>Срок действия серийного номера истек. Подробную
|
||||
информацию о сроке действия можно получить вызовом
|
||||
<strong>VMProtectGetSerialNumberData()</strong></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>SERIAL_STATE_FLAG_RUNNING_TIME_OVER</td>
|
||||
|
||||
<td>0x00000010</td>
|
||||
|
||||
<td>Время работы программы истекло. Подробную информацию о
|
||||
времени работы программы можно получить вызовом
|
||||
<strong>VMProtectGetSerialNumberData()</strong></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>SERIAL_STATE_FLAG_BAD_HWID</td>
|
||||
|
||||
<td>0x00000020</td>
|
||||
|
||||
<td>Идентификатор оборудования не совпадает с тем, что
|
||||
записан в серийном номере.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED</td>
|
||||
|
||||
<td>0x00000040</td>
|
||||
|
||||
<td>Серийный номер не предназначен для работы с этой версией
|
||||
защищаемой программы. Максимальную дату сборки программы, к
|
||||
которой подходит этот серийный номер, можно узнать вызовом
|
||||
<strong>VMProtectGetSerialNumberData()</strong>.</td>
|
||||
</tr>
|
||||
</table><br /><br />
|
||||
<strong id=
|
||||
"VMProtectGetSerialNumberData">VMProtectGetSerialNumberData</strong>
|
||||
|
||||
<p>Функция предназначена для получения информации о содержимом
|
||||
серийного номера, установленного вызовом
|
||||
<strong>VMProtectSetSerialNumber()</strong>. Формат вызова
|
||||
представлен ниже:</p>
|
||||
<pre class="code">bool VMProtectGetSerialNumberData(VMProtectSerialNumberData *Data, int Size);
|
||||
</pre>
|
||||
|
||||
<p>Первый параметр - указатель на структуру
|
||||
<strong>VMProtectSerialNumberData</strong>, в которую будет
|
||||
записана вся необходимая информация. Второй параметр - размер
|
||||
структуры, передаваемой в первом параметре - служит для контроля
|
||||
формата структуры. Функция возвращает FALSE в случаях, если система
|
||||
лицензирования повреждена (см. флаг состояния
|
||||
SERIAL_STATE_FLAG_CORRUPTED), если на вход подан нулевой адрес
|
||||
структуры или если переданный размер структуры некорректен. Во
|
||||
всех остальных случаях функция возвращает TRUE и записывает всю
|
||||
информацию о серийном номере по указанном адресу. Ниже
|
||||
описываются все элементы структуры:</p>
|
||||
|
||||
<table border="1" cellspacing="0" cellpadding="2">
|
||||
<tr>
|
||||
<th>Элемент</th>
|
||||
|
||||
<th>Тип</th>
|
||||
|
||||
<th>Описание</th>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>nState</td>
|
||||
|
||||
<td>int</td>
|
||||
|
||||
<td>Битовая маска флагов проверки ключа. Аналогична той, что
|
||||
возвращает
|
||||
<strong>VMProtectGetSerialNumberState()</strong>.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>wUserName</td>
|
||||
|
||||
<td>wchar_t[256]</td>
|
||||
|
||||
<td>Имя покупателя в кодировке UNICODE, завершаемое
|
||||
нулем.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>wEMail</td>
|
||||
|
||||
<td>wchar_t[256]</td>
|
||||
|
||||
<td>E-Mail покупателя в кодировке UNICODE, завершаемый
|
||||
нулем.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>dtExpire</td>
|
||||
|
||||
<td>VMProtectDate</td>
|
||||
|
||||
<td>Дата окончания срока действия ключа. Формат структуры
|
||||
VMProtectDate описан ниже.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>dtMaxBuild</td>
|
||||
|
||||
<td>VMProtectDate</td>
|
||||
|
||||
<td>Максимальная дата сборки продукта, с которой будет
|
||||
работать этот ключ. Формат структуры VMProtectDate описан
|
||||
ниже.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>bRunningTime</td>
|
||||
|
||||
<td>int</td>
|
||||
|
||||
<td>Количество минут, которое программа будет работать
|
||||
(максимальная длина сессии). Измеряется в минутах,
|
||||
отсчитывается с момента запуска программы.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>nUserDataLength</td>
|
||||
|
||||
<td>unsigned char</td>
|
||||
|
||||
<td>Длина пользовательских данных, размещенных в поле
|
||||
<strong>bUserData</strong>.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>bUserData</td>
|
||||
|
||||
<td>unsigned char[255]</td>
|
||||
|
||||
<td>Пользовательские данные, записанные в ключ. Количество
|
||||
актуальных байт указано в поле
|
||||
<strong>nUserDataLength</strong>.</td>
|
||||
</tr>
|
||||
</table><br />
|
||||
|
||||
<p>Структура <strong>VMProtectDate</strong> предназначена для
|
||||
компактного хранения даты. Ее поля описаны в таблице:</p>
|
||||
|
||||
<table border="1" cellspacing="0" cellpadding="2">
|
||||
<tr>
|
||||
<th>Элемент</th>
|
||||
|
||||
<th>Тип</th>
|
||||
|
||||
<th>Описание</th>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>wYear</td>
|
||||
|
||||
<td>unsigned short</td>
|
||||
|
||||
<td>Год.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>bMonth</td>
|
||||
|
||||
<td>unsigned char</td>
|
||||
|
||||
<td>Месяц, нумерация начинается с единицы.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>bDay</td>
|
||||
|
||||
<td>unsigned char</td>
|
||||
|
||||
<td>День, нумерация начинается с единицы.</td>
|
||||
</tr>
|
||||
</table><br />
|
||||
<br />
|
||||
<strong id=
|
||||
"VMProtectGetCurrentHWID">VMProtectGetCurrentHWID</strong>
|
||||
|
||||
<p>Функция предназначена для получения идентификатора
|
||||
оборудования, на котором работает программа. Формат вызова
|
||||
следующий:</p>
|
||||
<pre class="code">int VMProtectGetCurrentHWID(char * HWID, int Size);
|
||||
</pre>
|
||||
|
||||
<p>Первый параметр - указатель на область памяти, куда будет
|
||||
записан идентификатор. Второй параметр - размер области данных.
|
||||
Функция возвращает количество записанных байт с учетом
|
||||
завершающего нуля ('\0'). Если вместо первого параметра подать
|
||||
NULL, то функция вернет необходимое количество байт для записи
|
||||
номера. Наиболее правильный способ вызова функции следующий:</p>
|
||||
<pre class="code"><strong>int</strong> nSize = <strong>VMProtectGetCurrentHWID</strong>(NULL, 0); // получим необходимый размер буфера
|
||||
<strong>char *</strong>pBuf = <strong>new char</strong>[nSize]; // выделим буфер
|
||||
<strong>VMProtectGetCurrentHWID</strong>(pBuf, nSize); // получим идентификатор
|
||||
// используем его
|
||||
<strong>delete</strong> [] pBuf; // освободим память
|
||||
</pre><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
127
help/ru/manager/usage/index.htm
Normal file
127
help/ru/manager/usage/index.htm
Normal file
@@ -0,0 +1,127 @@
|
||||
<!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>Интеграция в приложение</title>
|
||||
<style type="text/css">
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Интеграция в приложение</h1>
|
||||
|
||||
<p>В нескольких шагах, описанных ниже, мы создадим тестовое
|
||||
приложение, которое будет обращаться к системе лицензирования:
|
||||
подавать ей серийные номера и получать статус номера и его
|
||||
содержимое. На первом этапе система лицензирования будет
|
||||
использоваться в тестовом режиме, а на втором этапе - в
|
||||
реальном.</p><strong>Режимы работы системы
|
||||
лицензирования</strong>
|
||||
|
||||
<p>В создании защиты всегда есть два этапа: разработка и
|
||||
использование. В случае с лицензированием, вы сначала создаете
|
||||
приложение, потом интегрируете механизмы защиты, добавляете
|
||||
проверки и блокируете функции. И только потом, после
|
||||
всестороннего тестирования, продукт передается пользователям и
|
||||
начинается второй этап. Тестирование защищаемого приложения -
|
||||
процесс сложный, необходимо убедиться в работоспособности всех
|
||||
проверок и условных переходов. Создание "настоящих" серийных
|
||||
номеров на все случаи жизни на этапе тестирования может оказаться
|
||||
неудобным, поэтому у системы лицензирования есть т.н. "режим
|
||||
разработки" или "тестовый" режим, при котором никакой защиты не
|
||||
осуществляется, а реакция системы на серийные номера описывается
|
||||
в конфигурационном файле. Когда приложение отлажено и корректно
|
||||
работает с системой лицензирования, VMProtect заменяет "тестовый"
|
||||
модуль лицензирования на реальный, проверяющий реальные серийные
|
||||
номера. Это происходит в момент защиты приложения, поэтому
|
||||
пропустить этот этап по ошибке не получится.</p><strong id="TestMode">Этап 1:
|
||||
Тестовый режим работы</strong>
|
||||
|
||||
<p>В тестовом режиме реакция системы лицензирования на серийные
|
||||
номера, все возвращаемые статусы и данные описываются в
|
||||
конфигурационном файле. Файл называется VMPLicense.ini и должен
|
||||
располагаться в рабочем каталоге приложения. В 10 шагах,
|
||||
представленных ниже, мы пройдем от создания простейшего
|
||||
приложения до полноценного использования системы лицензирования в
|
||||
тестовом режиме с привязкой к оборудованию и ограничением срока
|
||||
бесплатных обновлений.</p>
|
||||
|
||||
<ul>
|
||||
<li><a href="step11_app.htm">Шаг 1.1: Создаем защищаемое
|
||||
приложение</a></li>
|
||||
|
||||
<li><a href="step12_code.htm">Шаг 1.2: Добавляем код проверки
|
||||
лицензии</a></li>
|
||||
|
||||
<li><a href="step13_flags.htm">Шаг 1.3: Получаем флаги состояния
|
||||
номера</a></li>
|
||||
|
||||
<li><a href="step14_name.htm">Шаг 1.4: Получаем имя и e-mail
|
||||
пользователя</a></li>
|
||||
|
||||
<li><a href="step15_exp.htm">Шаг 1.5: Проверяем срок действия
|
||||
номера</a></li>
|
||||
|
||||
<li><a href="step16_time.htm">Шаг 1.6: Ограничиваем время работы
|
||||
программы</a></li>
|
||||
|
||||
<li><a href="step17_maxbuild.htm">Шаг 1.7: Ограничиваем
|
||||
бесплатные обновления</a></li>
|
||||
|
||||
<li><a href="step18_blacklist.htm">Шаг 1.8: Номера из "черного
|
||||
списка"</a></li>
|
||||
|
||||
<li><a href="step19_hwid.htm">Шаг 1.9: Привязка к
|
||||
оборудованию</a></li>
|
||||
|
||||
<li><a href="step1A_userdata.htm">Шаг 1.10: Пользовательские
|
||||
данные</a></li>
|
||||
</ul><strong id="RealMode">Этап 2: Реальный режим работы</strong>
|
||||
|
||||
<p>В реальном режиме работы системы лицензирования VMProtect
|
||||
помещает в защищаемое приложение специальный модуль
|
||||
лицензирования. Модуль выполняет все те же функции, что и
|
||||
тестовый код в SDK, но работает не с ini-файлом, а с содержимым
|
||||
серийного номера. В следующих пяти шагах мы защитим простое
|
||||
приложение полноценной защитой на основе VMProtect и системы
|
||||
лицензирования.</p>
|
||||
|
||||
<ul>
|
||||
<li><a href="step21_src.htm">Шаг 2.1: Создаем новое защищаемое
|
||||
приложение</a></li>
|
||||
|
||||
<li><a href="step22_vmp.htm">Шаг 2.2: Создаем проект защиты в
|
||||
VMProtect</a></li>
|
||||
|
||||
<li><a href="step23_product.htm">Шаг 2.3: Первый запуск
|
||||
защищенного продукта</a></li>
|
||||
|
||||
<li><a href="step24_test.htm">Шаг 2.4: Тестируем
|
||||
результат</a></li>
|
||||
|
||||
<li><a href="step25_codelock.htm">Шаг 2.5: Привязываем код к
|
||||
серийному номеру</a></li>
|
||||
</ul><strong>Дополнительная информация</strong>
|
||||
|
||||
<p>Значения всех битовых флагов, форматы структур и параметры
|
||||
вызова функций можно посмотреть в разделе <a href="api.htm">API
|
||||
системы лицензирования</a>. Этот раздел удобно использовать как
|
||||
справочник, тогда как шаги, описанные выше, позволяют легко
|
||||
реализовать готовые типовые схемы защиты.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
62
help/ru/manager/usage/step11_app.htm
Normal file
62
help/ru/manager/usage/step11_app.htm
Normal file
@@ -0,0 +1,62 @@
|
||||
<!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.1: Создаем защищаемое приложение</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Шаг 1.1: Создаем защищаемое приложение</h1>
|
||||
|
||||
<p>Первым шагом будет создание приложения. Это будет простое
|
||||
приложение, без интерфейса пользователя и каких-либо серьезных
|
||||
возможностей. Нашей задачей будет передать системе лицензирования
|
||||
серийный номер и получить от нее ответ.</p>
|
||||
<pre class="code">#include <windows.h>
|
||||
#include <stdio.h>
|
||||
|
||||
bool is_registered(const char *serial)
|
||||
{
|
||||
return serial && serial[0] == 'X';
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
char *serial = "Xserialnumber"; // зададим номер непосредственно в коде для простоты
|
||||
if (!is_registered(serial))
|
||||
{
|
||||
printf("please register!\n");
|
||||
return 0;
|
||||
}
|
||||
printf("We are registered.\n");
|
||||
return 0;
|
||||
}
|
||||
</pre>
|
||||
|
||||
<p>Программа реализует очень простую схему проверки серийного
|
||||
номера. Функция <strong>is_registered()</strong> сравнивает
|
||||
первую букву номера с 'Х' и считает номер корректным в случае
|
||||
совпадения. Для некорректного номера выдается просьба о
|
||||
регистрации, а в случае правильного номера выводится сообщение
|
||||
"We are registered."</p>
|
||||
|
||||
<p><a href="step12_code.htm">Следующим шагом</a> будет добавление
|
||||
кода проверки серийного номера на основе системы лицензирования
|
||||
VMProtect.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
105
help/ru/manager/usage/step12_code.htm
Normal file
105
help/ru/manager/usage/step12_code.htm
Normal file
@@ -0,0 +1,105 @@
|
||||
<!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.2: Добавляем код проверки лицензии</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Шаг 1.2: Добавляем код проверки лицензии</h1><strong>Подключаем
|
||||
VMProtect SDK</strong>
|
||||
|
||||
<p>Если вы этого еще не сделали, то сейчас самое время подключить
|
||||
к проекту VMProtect SDK. SDK это три файла: заголовочный файл
|
||||
(VMProtectSDK.h), файл библиотеки (VMProtectSDK32.lib) и dll-файл
|
||||
с реализацией (VMProtectSDK32.dll). Для 64-битной платформы есть
|
||||
отдельные реализации библиотеки и dll-файла.</p>
|
||||
|
||||
<p>Помещаем dll-файл в рабочий каталог нашего приложения,
|
||||
файл заголовков и библиотечный файл - рядом с исходниками, включаем
|
||||
файл заголовков в основной файл:</p>
|
||||
<pre class="code">#include <windows.h>
|
||||
#include <stdio.h>
|
||||
#include "VMProtectSDK.h"
|
||||
</pre>
|
||||
|
||||
<p>Собираем проект и убеждаемся, что он компилируется, запускается
|
||||
и работает, как и раньше. Система лицензирования пока еще не
|
||||
активна.</p><strong>Подаем серийный номер в систему
|
||||
лицензирования</strong>
|
||||
|
||||
<p>Теперь непосредственно после строки с серийным номером добавим
|
||||
вызов функции SDK системы лицензирования:</p>
|
||||
<pre class="code">char *serial = "Xserialnumber"; // зададим номер непосредственно в коде для простоты
|
||||
int res = VMProtectSetSerialNumber(serial);
|
||||
printf("res = 0x%08X\n", res);
|
||||
</pre>
|
||||
|
||||
<p>Если после этого программа будет завершаться с ошибкой об
|
||||
отсутствии dll-файла, убедитесь, что вы положили соответствующий
|
||||
DLL-файл в рабочий каталог нашего приложения. В случае успешного
|
||||
запуска, вы должны увидеть сообщение:</p>
|
||||
<pre class="code">res = 0x00000002
|
||||
</pre>
|
||||
|
||||
<p>Число 2 соответствует флагу SERIAL_STATE_FLAG_INVALID,
|
||||
<a href="api.htm">описанному в API</a>. Т.е. система
|
||||
лицензирования посчитала наш ключ некорректным, что вполне
|
||||
логично, т.к. мы до сих пор не "объяснили" системе лицензирования,
|
||||
какие ключи считать правильными, а какие - нет.</p><strong>Задаем
|
||||
"правильный" серийный номер</strong>
|
||||
|
||||
<p>В тестовом режиме система лицензирования анализирует файл
|
||||
VMProtectLicense.ini, и реагирует на вызовы функций согласно
|
||||
указанным там настройкам. Подробно файл разбирается в следующих
|
||||
шагах, а здесь мы просто создадим такой файл и поместим туда
|
||||
следующий текст:</p>
|
||||
<pre class="code">[TestLicense]
|
||||
AcceptedSerialNumber=Xserialnumber
|
||||
</pre>
|
||||
|
||||
<p>Запустим нашу программу еще раз. Если вы снова получили код
|
||||
ошибки "2", то убедитесь, что ini-файл находится в рабочем
|
||||
каталоге приложения. В этот раз вы должны получить результат "0".
|
||||
Признак того, что система лицензирования приняла и одобрила
|
||||
серийный номер. Теперь мы можем убрать функцию
|
||||
<strong>is_registered()</strong> - проверкой серийного номера
|
||||
займется система лицензирования:</p>
|
||||
<pre class="code">#include <windows.h>
|
||||
#include <stdio.h>
|
||||
#include "VMProtectSDK.h"
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
char *serial = "Xserialnumber"; // зададим номер непосредственно в коде для простоты
|
||||
|
||||
int res = VMProtectSetSerialNumber(serial);
|
||||
printf("res = 0x%08X\n", res);
|
||||
|
||||
if (res)
|
||||
{
|
||||
printf("please register!\n");
|
||||
return 0;
|
||||
}
|
||||
printf("We are registered.\n");
|
||||
return 0;
|
||||
}
|
||||
</pre><br />
|
||||
<a href="step13_flags.htm">Следующий шаг</a>
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
96
help/ru/manager/usage/step13_flags.htm
Normal file
96
help/ru/manager/usage/step13_flags.htm
Normal file
@@ -0,0 +1,96 @@
|
||||
<!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 & 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>
|
53
help/ru/manager/usage/step14_name.htm
Normal file
53
help/ru/manager/usage/step14_name.htm
Normal file
@@ -0,0 +1,53 @@
|
||||
<!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.4: Получаем имя и e-mail пользователя</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Шаг 1.4: Получаем имя и e-mail пользователя</h1>
|
||||
|
||||
<p>Начнем с простого: получим из серийного номера имя и e-mail
|
||||
пользователя (часто показываются в окне About). Для этого нам
|
||||
придется прописать их в ini-файл. Добавим еще две строчки к нашим
|
||||
двум:</p>
|
||||
<pre class="code">[TestLicense]
|
||||
AcceptedSerialNumber=Xserialnumber
|
||||
UserName=John Doe
|
||||
EMail=john@doe.com
|
||||
</pre>
|
||||
|
||||
<p>А в самой программе, в случае успешной регистрации, добавим
|
||||
получение этих данных и вывод их на экран:</p>
|
||||
<pre class="code">VMProtectSerialNumberData sd = {0};
|
||||
VMProtectGetSerialNumberData(&sd, sizeof(sd));
|
||||
printf("name = %ls,\ne-mail = %ls\n", sd.wUserName, sd.wEMail);
|
||||
</pre>
|
||||
|
||||
<p>Структура содержит данные в UNICODE, поэтому в
|
||||
<strong>printf()</strong> использованы спецификаторы %ls вместо %s.
|
||||
Программа должна вывести на экран текст:</p>
|
||||
<pre class="code">state = 0
|
||||
We are registered.
|
||||
name = John Doe,
|
||||
e-mail = john@doe.com
|
||||
</pre><br />
|
||||
<a href="step15_exp.htm">Следующий шаг</a>
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
59
help/ru/manager/usage/step15_exp.htm
Normal file
59
help/ru/manager/usage/step15_exp.htm
Normal file
@@ -0,0 +1,59 @@
|
||||
<!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.5: Проверяем срок действия серийного номера</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Шаг 1.5: Проверяем срок действия серийного номера</h1>
|
||||
|
||||
<p>Поместите в ini-файл строчку вида ExpDate=YYYYMMDD - например,
|
||||
такую:</p>
|
||||
<pre class="code">ExpDate=20000101
|
||||
</pre>
|
||||
|
||||
<p>Важно, чтобы дата, указанная в строке, уже прошла. Т.е.
|
||||
максимум - вчера. Запустив программу, вы увидите следующее:</p>
|
||||
<pre class="code">state = SERIAL_STATE_FLAG_DATE_EXPIRED
|
||||
please register!
|
||||
</pre>
|
||||
|
||||
<p>Добавим получение дополнительной информации перед выходом с
|
||||
сообщением "please register":</p>
|
||||
<pre class="code">if (res)
|
||||
{
|
||||
VMProtectSerialNumberData sd = {0};
|
||||
VMProtectGetSerialNumberData(&sd, sizeof(sd));
|
||||
printf("exp. date: y = %d, m = %d, d = %d\n", sd.dtExpire.wYear, sd.dtExpire.bMonth, sd.dtExpire.bDay);
|
||||
printf("please register!\n");
|
||||
return 0;
|
||||
}
|
||||
</pre>
|
||||
|
||||
<p>Повторный запуск приложения даст нам больше подробностей:</p>
|
||||
<pre class="code">state = SERIAL_STATE_FLAG_DATE_EXPIRED
|
||||
exp. date: y = 2000, m = 1, d = 1
|
||||
please register!
|
||||
</pre>
|
||||
|
||||
<p>Удалите из ini-файла строку ExpDate=..., чтобы она не мешала
|
||||
нам в дальнейшем.</p><br />
|
||||
<a href="step16_time.htm">Следующий шаг</a>
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
79
help/ru/manager/usage/step16_time.htm
Normal file
79
help/ru/manager/usage/step16_time.htm
Normal file
@@ -0,0 +1,79 @@
|
||||
<!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.6: Ограничиваем время работы программы</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Шаг 1.6: Ограничиваем время работы программы</h1>
|
||||
|
||||
<p>Вы можете ограничить время работы программы с момента запуска.
|
||||
Это может быть полезно для демонстрационных целей: выдается
|
||||
полноценный серийный номер, однако программа работает не более
|
||||
пяти минут. Система лицензирования не закрывает такую программу
|
||||
принудительно по истечении указанного времени, а лишь уведомляет
|
||||
об окончании времени выставлением флага состояния. Зададим
|
||||
ограничение времени работы в одну минуту, добавив в ini-файл
|
||||
строчку:</p>
|
||||
<pre class="code">TimeLimit=1
|
||||
</pre>
|
||||
|
||||
<p>Модифицируем программу следующим образом:</p>
|
||||
<pre class="code">int main(int argc, char **argv)
|
||||
{
|
||||
char *serial = "Xserialnumber"; // зададим номер непосредственно в коде для простоты
|
||||
|
||||
int res = VMProtectSetSerialNumber(serial);
|
||||
print_state(res);
|
||||
if (res) return 0;
|
||||
|
||||
VMProtectSerialNumberData sd = {0};
|
||||
VMProtectGetSerialNumberData(&sd, sizeof(sd));
|
||||
printf("I will run for %d minute(s)\n", sd.bRunningTime);
|
||||
print_state(VMProtectGetSerialNumberState());
|
||||
Sleep(60 * 1000 * sd.bRunningTime);
|
||||
printf("After %d minute(s):\n", sd.bRunningTime);
|
||||
print_state(VMProtectGetSerialNumberState());
|
||||
|
||||
return 0;
|
||||
}
|
||||
</pre>
|
||||
|
||||
<p>Программа выводит состояние серийного номера в момент старта,
|
||||
потом считывает максимальное время работы, ждет, пока оно пройдет
|
||||
и выводит состояние номера еще раз. Для одной минуты мы получим
|
||||
следующий результат:</p>
|
||||
<pre class="code">state = 0
|
||||
I will run for 1 minute(s)
|
||||
state = 0
|
||||
After 1 minute(s):
|
||||
state = SERIAL_STATE_FLAG_RUNNING_TIME_OVER
|
||||
</pre>
|
||||
|
||||
<p>Защищаемая программа должна анализировать состояние серийного
|
||||
номера с определенной периодичностью и завершить свою работу в
|
||||
случае появления такого флага. Система лицензирования не делает
|
||||
этого автоматически, т.к. программе может требоваться освободить
|
||||
какие-то ресурсы, записать данные в файл и т.д. Также программа
|
||||
может не завершаться по истечении данного времени, а переходить в
|
||||
более ограниченный режим работы. Система лицензирования оставляет
|
||||
эти вопросы на усмотрение разработчика.</p><br />
|
||||
<a href="step17_maxbuild.htm">Следующий шаг</a>
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
85
help/ru/manager/usage/step17_maxbuild.htm
Normal file
85
help/ru/manager/usage/step17_maxbuild.htm
Normal file
@@ -0,0 +1,85 @@
|
||||
<!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.7: Ограничиваем бесплатные обновления</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Шаг 1.7: Ограничиваем бесплатные обновления</h1><strong>Схема
|
||||
работы</strong>
|
||||
|
||||
<p>В момент защиты приложения VMProtect запоминает дату, когда это
|
||||
происходило. Эта дата является для системы лицензирования датой
|
||||
сборки приложения. В серийном номере можно прописать максимальную
|
||||
дату сборки, для которой подойдет этот номер. Таким образом, если
|
||||
при создании ключа Вы пропишете в него текущую дату + 1 год, то
|
||||
ключ подойдет ко всем релизам Вашей программы, которые вы
|
||||
выпустите в течение года. К релизу, выпущенному через год и 1
|
||||
день ключ уже не подойдет и у пользователя будет выбор:
|
||||
пользоваться более старой версией или купить новый ключ, который
|
||||
будет работать еще год.</p><strong>Пробуем на деле</strong>
|
||||
|
||||
<p>Поместите в ini-файл строчку вида MaxBuildDate=YYYYMMDD -
|
||||
например, такую:</p>
|
||||
<pre class="code">MaxBuildDate=20000101
|
||||
</pre>
|
||||
|
||||
<p>В тестовом режиме система лицензирования считает датой сборки
|
||||
сегодняшнее число, поэтому важно, чтобы дата, указанная в строке,
|
||||
уже прошла. Т.е. максимум - вчера. Модифицируйте исходный код
|
||||
функции <strong>main()</strong>, чтобы он выглядел так:</p>
|
||||
<pre class="code">int main(int argc, char **argv)
|
||||
{
|
||||
char *serial = "Xserialnumber"; // зададим номер непосредственно в коде для простоты
|
||||
|
||||
int res = VMProtectSetSerialNumber(serial);
|
||||
print_state(res);
|
||||
|
||||
if (res)
|
||||
{
|
||||
VMProtectSerialNumberData sd = {0};
|
||||
VMProtectGetSerialNumberData(&sd, sizeof(sd));
|
||||
printf("max. build date: y = %d, m = %d, d = %d\n", sd.dtMaxBuild.wYear, sd.dtMaxBuild.bMonth, sd.dtMaxBuild.bDay);
|
||||
printf("please register!\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
printf("I'm registered\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
</pre>
|
||||
|
||||
<p>Тогда при запуске программы вы увидите следующее:</p>
|
||||
<pre class="code">state = SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED
|
||||
max. build date: y = 2000, m = 1, d = 1
|
||||
please register!
|
||||
</pre>
|
||||
|
||||
<p>Заменив в ini-файле дату на сегодняшнюю или завтрашнюю, мы
|
||||
получим "рабочую" программу:</p>
|
||||
<pre class="code">state = 0
|
||||
I'm registered
|
||||
</pre>
|
||||
|
||||
<p>Удалите из ini-файла строку MaxBuildDate=..., чтобы она не
|
||||
мешала нам в дальнейшем.</p><br />
|
||||
<a href="step18_blacklist.htm">Следующий шаг</a>
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
64
help/ru/manager/usage/step18_blacklist.htm
Normal file
64
help/ru/manager/usage/step18_blacklist.htm
Normal file
@@ -0,0 +1,64 @@
|
||||
<!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.8: Номера из "черного списка"</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Шаг 1.8: Номера из "черного списка"</h1>
|
||||
|
||||
<p>Номер, помеченный в VMProtect как "заблокированный", больше не
|
||||
должен приниматься системой лицензирования. При очередной защите
|
||||
приложения VMProtect запишет в защищаемый файл хеш от номеров
|
||||
черного списка, вследствие чего система лицензирования в этом приложении откажет при попытке
|
||||
установить такой номер.</p>
|
||||
|
||||
<p>Сократим до минимума код функции <strong>main()</strong>:</p>
|
||||
<pre class="code">int main(int argc, char **argv)
|
||||
{
|
||||
char *serial = "Xserialnumber"; // зададим номер непосредственно в коде для простоты
|
||||
|
||||
int res = VMProtectSetSerialNumber(serial);
|
||||
print_state(res);
|
||||
|
||||
return 0;
|
||||
}
|
||||
</pre>
|
||||
|
||||
<p>Запустим программу и убедимся, что система лицензирования
|
||||
принимает наш серийный номер:</p>
|
||||
<pre class="code">state = 0
|
||||
</pre>
|
||||
|
||||
<p>Теперь занесем наш номер в черный список с точки зрения
|
||||
системы лицензирования. Для этого в ini-файл добавим строку:</p>
|
||||
<pre class="code">BlackListedSerialNumber=Xserialnumber
|
||||
</pre>
|
||||
|
||||
<p>И снова запускаем программу:</p>
|
||||
<pre class="code">state = SERIAL_STATE_FLAG_BLACKLISTED
|
||||
</pre>
|
||||
|
||||
<p>Сообщать ли пользователю о занесении его номера в черный список,
|
||||
или просто сообщить, что номер неверный - оставлено на усмотрение
|
||||
разработчика. Система лицензирования лишь сообщает программе о
|
||||
факте использования заблокированного номера.</p><br />
|
||||
<a href="step19_hwid.htm">Следующий шаг</a>
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
123
help/ru/manager/usage/step19_hwid.htm
Normal file
123
help/ru/manager/usage/step19_hwid.htm
Normal file
@@ -0,0 +1,123 @@
|
||||
<!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.9: Привязка к оборудованию</title>
|
||||
<style type="text/css">
|
||||
/*<![CDATA[*/
|
||||
div.c2 {text-align: center}
|
||||
p.c1 {color:red;}
|
||||
/*]]>*/
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Шаг 1.9: Привязка к оборудованию</h1><strong>Получение
|
||||
идентификатора оборудования</strong>
|
||||
|
||||
<p>Прежде чем привязываться к оборудованию, необходимо получить
|
||||
идентификатор оборудования. Идентификатор помещается в серийный
|
||||
номер и при передаче этого номера системе лицензирования
|
||||
происходит проверка соответствия идентификаторов. Поэтому для
|
||||
начала получим идентификатор нашего оборудования. Сократим
|
||||
<strong>main()</strong> до самого короткого варианта:</p>
|
||||
<pre class="code">int main(int argc, char **argv)
|
||||
{
|
||||
int nSize = VMProtectGetCurrentHWID(NULL, 0);
|
||||
char *buf = new char[nSize];
|
||||
VMProtectGetCurrentHWID(buf, nSize);
|
||||
printf("HWID: %s\n", buf);
|
||||
delete [] buf;
|
||||
return 0;
|
||||
}
|
||||
</pre>
|
||||
|
||||
<p>Запустив эту программу, мы получим тестовый идентификатор
|
||||
оборудования, используемый по умолчанию:</p>
|
||||
<pre class="code">HWID: myhwid
|
||||
</pre>
|
||||
|
||||
<p>Чтобы изменить идентификатор, используемый по умолчанию,
|
||||
добавьте в ini-файл строку:</p>
|
||||
<pre class="code">MyHWID=test
|
||||
</pre>
|
||||
|
||||
<p>Запустив программу после этого, мы увидим, что система
|
||||
лицензирования теперь считает "test" идентификатором
|
||||
оборудования:</p>
|
||||
<pre class="code">HWID: test
|
||||
</pre>
|
||||
|
||||
<p class="c1"><strong>Внимание!</strong> реальный идентификатор
|
||||
оборудования программа будет выдавать только после ее обработки в
|
||||
VMProtect.</p><br />
|
||||
<strong>Серийный номер с привязкой к оборудованию</strong>
|
||||
|
||||
<p>Чтобы наш тестовый серийный номер был привязан к оборудованию,
|
||||
добавим в ini-файл еще одну строчку, на этот раз с
|
||||
идентификатором, "записанным" в номер:</p>
|
||||
<pre class="code">KeyHWID=test
|
||||
</pre>
|
||||
|
||||
<p>А функцию <strong>main()</strong> слегка усложним, она снова
|
||||
будет подавать серийный номер и анализировать получаемый
|
||||
результат:</p>
|
||||
<pre>
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int nSize = VMProtectGetCurrentHWID(NULL, 0);
|
||||
char *buf = new char[nSize];
|
||||
VMProtectGetCurrentHWID(buf, nSize);
|
||||
printf("HWID: %s\n", buf);
|
||||
delete [] buf;
|
||||
|
||||
char *serial = "Xserialnumber";
|
||||
int res = VMProtectSetSerialNumber(serial);
|
||||
print_state(res);
|
||||
return 0;
|
||||
}
|
||||
</pre>
|
||||
|
||||
<p>Запустив код, получим следующий результат:</p>
|
||||
<pre class="code">HWID: test
|
||||
state = 0
|
||||
</pre>
|
||||
|
||||
<p>Система лицензирования сравнила текущий идентификатор
|
||||
оборудования и тот, который был запиан в серийном номере.
|
||||
Идентификаторы совпали и функция
|
||||
<strong>VMProtectSetSerialNumber()</strong> вернула 0 - серийный
|
||||
номер подходит.</p>
|
||||
|
||||
<p>Попробуем теперь "запустить" нашу программу на другом
|
||||
оборудовании. Для этого поменяем значение "test" параметра MyHWID
|
||||
в ini-файле на "new test". И снова запустим программу:</p>
|
||||
<pre class="code">HWID: new test
|
||||
state = SERIAL_STATE_FLAG_BAD_HWID
|
||||
</pre>
|
||||
|
||||
<p>На этот раз система лицензирования вернула флаг
|
||||
SERIAL_STATE_FLAG_BAD_HWID, означающий несовпадение реально
|
||||
идентификатора оборудования с тем, что хранится в серийном
|
||||
номере. Текущий идентификатор оборудования, выведенный на экран -
|
||||
"new test", а в серийном номере хранится "test". Поменяв в
|
||||
ini-файле значение параметра KeyHWID на "new test" можно добиться
|
||||
работы серийного номера и на этом "оборудовании".</p><br />
|
||||
<a href="step1A_userdata.htm">Следующий шаг</a>
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
76
help/ru/manager/usage/step1A_userdata.htm
Normal file
76
help/ru/manager/usage/step1A_userdata.htm
Normal file
@@ -0,0 +1,76 @@
|
||||
<!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.10: Пользовательские данные</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Шаг 1.10: Пользовательские данные</h1>
|
||||
|
||||
<p>Серийный номер может содержать до 255 байт произвольных
|
||||
данных, которые система лицензирования без изменений передает
|
||||
вызывающей программе. Это может быть какая-то дополнительная
|
||||
информация о продаже, данные, без которых не будет работать
|
||||
полная версия, или еще что-нибудь. Изменим функцию
|
||||
<strong>main()</strong>, чтобы она считывала данные из серийного
|
||||
номера и показывала их на экране:</p>
|
||||
<pre class="code">int main(int argc, char **argv)
|
||||
{
|
||||
char *serial = "Xserialnumber";
|
||||
int res = VMProtectSetSerialNumber(serial);
|
||||
print_state(res);
|
||||
if (res) return 0;
|
||||
|
||||
VMProtectSerialNumberData sd = {0};
|
||||
VMProtectGetSerialNumberData(&sd, sizeof(sd));
|
||||
printf("Serial number has %d byte(s) of data\n", sd.nUserDataLength);
|
||||
for (int i = 0; i < sd.nUserDataLength; i++)
|
||||
printf("%02X ", sd.bUserData[i]);
|
||||
printf("\n");
|
||||
return 0;
|
||||
}
|
||||
</pre>
|
||||
|
||||
<p>Ini-файл при этом сократим до такого вида:</p>
|
||||
<pre class="code">[TestLicense]
|
||||
AcceptedSerialNumber=Xserialnumber
|
||||
</pre>
|
||||
|
||||
<p>Теперь запустим программу и убедимся, что наш серийный номер
|
||||
подходит, но не содержит никаких данных:</p>
|
||||
<pre class="code">state = 0
|
||||
Serial number has 0 byte(s) of data
|
||||
</pre>
|
||||
|
||||
<p>Чтобы добавить пользовательские данные в серийный номер,
|
||||
необходимо создать в ini-файле переменную UserData и присвоить ей
|
||||
строчку из HEX-символов. Символы должны идти парами, т.е. длина
|
||||
строки должна быть кратна 2. Строка может быть, например,
|
||||
такой:</p>
|
||||
<pre class="code">UserData=010203A0B0C0D0E0
|
||||
</pre>
|
||||
|
||||
<p>В этом случае при запуске программы мы получим следующий
|
||||
результат:</p>
|
||||
<pre class="code">state = 0
|
||||
Serial number has 8 byte(s) of data
|
||||
01 02 03 A0 B0 C0 D0 E0
|
||||
</pre><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
109
help/ru/manager/usage/step21_src.htm
Normal file
109
help/ru/manager/usage/step21_src.htm
Normal file
@@ -0,0 +1,109 @@
|
||||
<!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>Шаг 2.1: Создаем новое защищенное приложение</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Шаг 2.1: Создаем новое защищенное приложение</h1>
|
||||
|
||||
<p>Если на первом этапе мы создавали несколько разных тестовых
|
||||
приложений для изучения API системы лицензирования, то на втором этапе
|
||||
приложение будет одно. Оно также будет консольным и в нем будет
|
||||
функция <strong>foo()</strong>, которая может работать только в
|
||||
зарегистрированной версии. Вот код нашего тестового
|
||||
приложения:</p>
|
||||
<pre class="code">#include <windows.h>
|
||||
#include <stdio.h>
|
||||
#include "VMProtectSDK.h"
|
||||
|
||||
#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");
|
||||
}
|
||||
|
||||
char *read_serial(const char *fname)
|
||||
{
|
||||
FILE *f;
|
||||
if (0 != fopen_s(&f, fname, "rb")) return NULL;
|
||||
fseek(f, 0, SEEK_END);
|
||||
int s = ftell(f);
|
||||
fseek(f, 0, SEEK_SET);
|
||||
char *buf = new char[s + 1];
|
||||
fread(buf, s, 1, f);
|
||||
buf[s] = 0;
|
||||
fclose(f);
|
||||
return buf;
|
||||
}
|
||||
|
||||
// метод foo() очень короткий, но он нам нужен в виде отдельной функции
|
||||
// поэтому мы попросим компилятор не делать его inline
|
||||
__declspec(noinline) void foo()
|
||||
{
|
||||
printf("I'm foo!\n");
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
char *serial = read_serial("serial.txt");
|
||||
int res = VMProtectSetSerialNumber(serial);
|
||||
delete [] serial;
|
||||
if (res)
|
||||
{
|
||||
printf("serial number is bad\n");
|
||||
print_state(res);
|
||||
return 0;
|
||||
}
|
||||
printf("serial number is correct, calling foo()\n");
|
||||
foo();
|
||||
printf("done\n");
|
||||
return 0;
|
||||
}
|
||||
</pre>
|
||||
|
||||
<p>Скомпилируем программу без отладочной информации, но в
|
||||
настройках линкера попросим создать MAP-файл, который потребуется
|
||||
для работы VMProtect. При запуске программы мы должны увидеть
|
||||
следующий текст:</p>
|
||||
<pre class="code">serial number is bad
|
||||
state = SERIAL_STATE_FLAG_INVALID
|
||||
</pre>
|
||||
|
||||
<p>В настоящий момент система лицензирования все еще работает в
|
||||
тестовом режиме, т.к. файл еще не был обработан VMProtect'ом и в
|
||||
него не был внедрен модуль лицензирования. На <a href=
|
||||
"step22_vmp.htm">следующем шаге</a> мы создадим проект VMProtect
|
||||
и попробуем защитить нашу программу.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
42
help/ru/manager/usage/step22_vmp.htm
Normal file
42
help/ru/manager/usage/step22_vmp.htm
Normal file
@@ -0,0 +1,42 @@
|
||||
<!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>Шаг 2.2: Создаем проект защиты в VMProtect</title>
|
||||
<style type="text/css">
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Шаг 2.2: Создаем проект защиты в VMProtect</h1>
|
||||
|
||||
<p>Теперь, когда тестовая программа готова, скомпилирована и
|
||||
рядом с ней находится ее MAP-файл, мы можем запустить VMProtect
|
||||
Ultimate и открыть исполняемый файл. Нам нужно будет добавить в
|
||||
проект две функции: _main (так Visual Studio переименовала нашу
|
||||
функцию main()) и foo(). Обе функции видны в списке функций в
|
||||
VMProtect в разделе "Функции".</p>
|
||||
|
||||
<!-- <p class="c1"><br /><img src="../../images/real_project_functions.png" alt="Дерево проекта" /></p> -->
|
||||
|
||||
<p>Далее необходимо инициализировать систему лицензирования.
|
||||
Перейдите на вкладку "Лицензии" и создайте пару кючей длиной 2048
|
||||
бит.</p><br />
|
||||
<a href="step23_product.htm">Следующий шаг</a>
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
70
help/ru/manager/usage/step23_product.htm
Normal file
70
help/ru/manager/usage/step23_product.htm
Normal file
@@ -0,0 +1,70 @@
|
||||
<!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>Шаг 2.3: Первый запуск защищенного продукта</title>
|
||||
<style type="text/css">
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Шаг 2.3: Первый запуск защищенного продукта</h1>
|
||||
|
||||
<p>Система лицензирования инициализирована, так что мы можем
|
||||
попробовать скомпилировать проект VMPrtoect и запустить
|
||||
защищенный файл. Запустив его из командной строки мы получим
|
||||
следующее сообщение:</p>
|
||||
<pre class="code">C:\test>dummy_app.vmp.exe
|
||||
serial number is bad
|
||||
state = SERIAL_STATE_FLAG_INVALID
|
||||
</pre>
|
||||
|
||||
<p>Запустив программу depends.exe, мы можем убедиться, что наш
|
||||
защищенный файл более не связан с библиотекой VMProtectSDK.dll, а
|
||||
значит модуль лицензирования встроен в приложение. Список
|
||||
используемых DLL можно посмотреть и в VMProtect, открыв
|
||||
защищенный файл и выбрав из раздела "Свойства" секцию "Импорты".</p>
|
||||
|
||||
<p><img src="../../images/depends.png" /></p>
|
||||
|
||||
<p>Наша защищаемая программа читает серийный номер из файла
|
||||
serial.txt. Поскольку этого файла сейчас нет, то модулю лицензирования
|
||||
подается пустой номер, который также не считается корректным.
|
||||
Перейдем на закладку "лицензии" и сгенерируем серийный номер.
|
||||
Подробно эта процедура описана <a href=
|
||||
"../licenses.htm">здесь</a>, мы создадим самый простой серийный
|
||||
номер без каких-либо ограничений.</p>
|
||||
|
||||
<p><img src="../../images/project_add_license.png" /></p>
|
||||
|
||||
<p>Затем скопируем серийный номер (в свойствах лицензии выделим поле
|
||||
"Серийный номер" и нажмем Ctrl+C), создадим рядом с
|
||||
защищенным приложением файл serial.txt и вставим туда серийный
|
||||
номер. После запуска программы мы увидим следующее:</p>
|
||||
<pre class="code">C:\test>dummy_app.vmp.exe
|
||||
serial number is correct, calling foo()
|
||||
I'm foo
|
||||
done
|
||||
</pre>
|
||||
|
||||
<p>Система лицензирования проверила серийный номер и посчитала
|
||||
его корректным. На <a href="step24_test.htm">следующем шаге</a> мы
|
||||
попробуем применить некоторые ограничения и посмотрим что из
|
||||
этого выйдет.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
90
help/ru/manager/usage/step24_test.htm
Normal file
90
help/ru/manager/usage/step24_test.htm
Normal file
@@ -0,0 +1,90 @@
|
||||
<!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>Шаг 2.4: Тестируем результат</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Шаг 2.4: Тестируем результат</h1><strong>Срок действия
|
||||
серийного номера</strong>
|
||||
|
||||
<p>Создадим еще один серийный номер с ограничением срока
|
||||
действия - скажем, 2005-м годом. Эта дата уже прошла и наш номер
|
||||
должен быть недействительным. Перейдите на закладку "Лицензии" и
|
||||
нажмите кнопку "Добавить лицензию". В появившемся окне поставьте
|
||||
галочку "Срок годности" и введите "30 сентября 2005 года".
|
||||
Создайте номер, скопируйте его и поместите в файл seral.txt,
|
||||
после чего запустите программу:</p>
|
||||
<pre class="code">C:\test>dummy_app.vmp.exe
|
||||
serial number is bad
|
||||
state = SERIAL_STATE_FLAG_DATE_EXPIRED
|
||||
</pre>
|
||||
|
||||
<p>Модуль лицензирования вернул флаг "срок действия номера
|
||||
закончен". Вернем рабочий номер обратно в файл serial.txt и
|
||||
убедимся, что его модуль лицензирования примет без проблем.</p>
|
||||
<pre class="code">C:\test>dummy_app.vmp.exe
|
||||
serial number is correct, calling foo()
|
||||
I'm foo
|
||||
done
|
||||
</pre><strong>Занесение номера в черный список</strong>
|
||||
|
||||
<p>Предположим, что наш "хороший" серийный номер выложен в
|
||||
Интернет. Нам необходимо его заблокировать, чтобы в следующих
|
||||
версиях программы он уже не работал. Для этого мы выбираем его в
|
||||
списке номеров и нажимаем кнопку "Заблокировать". Сам факт
|
||||
нажатия кнопки не блокирует серийный номер в защищенном
|
||||
приложении, однако после повторной защиты файла, он откажется
|
||||
принимать этот серийный номер. Проверим. Если сейчас запустить
|
||||
нашу программу, то она примет заблокированный номер без проблем,
|
||||
т.к. это старая версия программы и она еще не знает о
|
||||
блокировке:</p>
|
||||
<pre class="code">C:\test>dummy_app.vmp.exe
|
||||
serial number is correct, calling foo()
|
||||
I'm foo
|
||||
done
|
||||
</pre>
|
||||
|
||||
<p>Сделаем копию нашей программы и назовем ее
|
||||
"dummy_app1.vmp.exe", а после этого перейдем в VMProtect и
|
||||
повторно защитим наше приложение, после чего запустим новую
|
||||
версию программы:</p>
|
||||
<pre class="code">C:\test>dummy_app.vmp.exe
|
||||
serial number is bad
|
||||
state = SERIAL_STATE_FLAG_BLACKLISTED
|
||||
</pre>
|
||||
|
||||
<p>Теперь для сравнения еще раз запустим старую версию
|
||||
программы:</p>
|
||||
<pre class="code">C:\test>dummy_app1.vmp.exe
|
||||
serial number is correct, calling foo()
|
||||
I'm foo
|
||||
done
|
||||
</pre>
|
||||
|
||||
<p>Старая версия ничего не знает о блокировании номера и
|
||||
продолжает работать как и раньше. </p><br />
|
||||
<br /><p>На <a href=
|
||||
"step25_codelock.htm">последнем шаге</a> мы попробуем привязать
|
||||
выполняемый код к серийному номеру. Перед этим разблокируйте
|
||||
серийный номер и перезащитите приложение в VMProtect, чтобы оно
|
||||
снова принимало наш серийный номер. Или создайте новую
|
||||
лицензию.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
144
help/ru/manager/usage/step25_codelock.htm
Normal file
144
help/ru/manager/usage/step25_codelock.htm
Normal file
@@ -0,0 +1,144 @@
|
||||
<!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>Шаг 2.5. Привязка кода к серийному номеру</title>
|
||||
<style type="text/css">
|
||||
/*<![CDATA[*/
|
||||
p.c2 {color:red;}
|
||||
span.c1 {background-color:yellow;}
|
||||
/*]]>*/
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Шаг 2.5. Привязка кода к серийному номеру</h1>
|
||||
|
||||
<p>Одним из наиболее популярных способов взлома программ является
|
||||
поиск проверки серийного номера и последующего условного
|
||||
перехода. Если номер корректен, то ход выполнения программы идет
|
||||
по одной ветке, если некорректен, то по другой. Хакер находит
|
||||
этот переход и заменяет его на безусловный переход на
|
||||
"правильную" ветку. Давайте "взломаем" таким образом нашу
|
||||
тестовую программу. На уровне исходников, конечно же. "Отключим"
|
||||
условный переход:</p>
|
||||
<pre class="code">char *serial = read_serial("serial.txt");
|
||||
int res = VMProtectSetSerialNumber(serial);
|
||||
delete [] serial;
|
||||
if (<span class="c1">false &&</span> res)
|
||||
{
|
||||
</pre>
|
||||
|
||||
<p>Теперь наша программа примет любой серийный номер и будет
|
||||
работать как ни в чем не бывало. Безусловно, если файл защищен
|
||||
VMProtect, то даже опытному хакеру потребуется не один месяц,
|
||||
чтобы найти и исправить этот переход так, как сделали это мы. А с
|
||||
учетом того, что правильно защищенная программа проверяет
|
||||
серийный номер не в одном месте и не всегда, то даже такая
|
||||
простая проверка уже достаточно надежна. Однако мы пойдем
|
||||
дальше.</p><strong>Привяжем код к серийному номеру</strong>
|
||||
|
||||
<p class="c2"><strong>Внимание!</strong> демо-версия VMProtect
|
||||
имеет ограничение на количество обрабатываемых функций:
|
||||
обрабатывается только одна функция. Поэтому в случае
|
||||
использования демо-версии, необходимо включать в проект только
|
||||
функцию foo(), т.к. в противном случае демо-версия VMProtect
|
||||
может выбрать для защиты функцию main() и привязка кода к
|
||||
серийному номеру не сработает.</p>
|
||||
|
||||
<p>Система лицензирования VMProtect позволяет привязать код одной
|
||||
или нескольких функций к серийному номеру так, что они не будут
|
||||
работать без корректного номера. Тело функции виртуализируется,
|
||||
потом шифруется и может быть расшифровано только при наличии
|
||||
корректного серийного номера. То есть даже если хакер найдет и
|
||||
исправит условный переход в коде проверки номера, функции,
|
||||
привязанные к номеру, все равно не будут работать. Давайте
|
||||
попробуем. В VMProtect в разделе "Функции" выберем функцию <strong>foo()</strong> и в
|
||||
правой панели изменим значение опции "Привязать к серийному номеру" на "Да".</p>
|
||||
|
||||
<p><img src="../../images/lock_to_serial.png" /></p>
|
||||
|
||||
<p>После этого защитим наше приложение. С учетом
|
||||
того, что оно "взломано", поместим в файл serial.txt произвольный
|
||||
текст и запустим приложение. В консоли появится текст:</p>
|
||||
<pre class="code">C:\test>dummy_app.vmp.exe
|
||||
serial number is correct, calling foo()
|
||||
</pre>
|
||||
|
||||
<p>То есть хакер "исправил" нужный условный переход и программа
|
||||
пошла по "правильной" ветке. Однако в момент вызова
|
||||
<strong>foo()</strong> программа выводит сообщение:</p>
|
||||
|
||||
<p><img src="../../images/codelock_error.png" /></p>
|
||||
|
||||
<p>Так как мы привязали функцию <strong>foo()</strong> к
|
||||
серийному номеру, а у хакера его нет, то при попытке расшифровать
|
||||
код функции модуль лицензирования выдал сообщение о невозможности
|
||||
продолжить выполнение программы. После нажатия кнопки "ОК"
|
||||
программа завершится и в консоли мы не увидим строчки
|
||||
"done".</p><strong>Что привязывать к серийному номеру?</strong>
|
||||
|
||||
<p>Привязывать к серийному номеру имеет смысл те функции, которые
|
||||
вызываются только в зарегистрированной версии программы. Так как
|
||||
привязка возможна только при использовании виртуализации, то
|
||||
необходимо принимать во внимание возможное падение
|
||||
производительности. Скажем, если текстовый редактор не позволяет
|
||||
сохранять результаты своей работы в демо-версии, то к серийному
|
||||
номеру можно привязать функцию сохранения документа. Если эта
|
||||
функция вызывает ряд других в процессе работы, то их привязывать
|
||||
уже не обязательно, так как без основной функции от них будет
|
||||
немного толку.</p>
|
||||
|
||||
<p>Также необходимо помнить, что вызов привязанной функции без
|
||||
серийного номера приведет к завершению работы программы без
|
||||
возможности сохранения результатов работы, поэтому тщательно
|
||||
тестируйте защищаемую программу, чтобы она не позволяла вызвать
|
||||
такие функции в демо-режиме. В примере с текстовым редактором
|
||||
убедитесь, что в демо-режиме пункт меню "Сохранить" всегда
|
||||
неактивен, что комбинация Ctrl+S не срабатывает и что при
|
||||
закрытии программы также не предлагается сохранить изменения. В
|
||||
противном случае пользователь может составить негативное мнение о
|
||||
вашей программе.</p><strong>Привязка к серийному номеру и
|
||||
нерабочие номера</strong>
|
||||
|
||||
<p>При вызове функции <strong>VMProtectSetSerialNumber()</strong>
|
||||
модуль лицензирования проверяет переданный серийный номер и
|
||||
зашифрованные участки кода будут выполняться только в том случае,
|
||||
если на момент проверки серийный номер был полностью корректным -
|
||||
не занесенным в черный список, с правильным идентификатором
|
||||
оборудования, с неистекшим сроком годности и т.п. В этом случае все
|
||||
зашифрованные процедуры будут выполняться до завершения работы
|
||||
приложения или до нового вызова
|
||||
<strong>VMProtectSetSerialNumber()</strong>.</p>
|
||||
|
||||
<p>Некоторые ограничения могут "сработать" в процессе выполнения
|
||||
программы: например, может истечь время работы программы или
|
||||
окончится срок действия серийного номера. В этом случае модуль
|
||||
лицензирования продолжит расшифровывать и выполнять функции,
|
||||
привязанные к серийному номеру. Это делается потому, что
|
||||
защищенному приложению будет сложно отследить момент срабатывания
|
||||
ограничений и соответствующим образом изменить модель своего
|
||||
поведения (заблокировать пункты меню и т.п). Если модуль
|
||||
лицензирования неожиданно для приложения перестанет выполнять
|
||||
привязанные к серийному номеру участки кода, это с большой
|
||||
вероятностью приведет к неработоспособности приложения. Поэтому
|
||||
все решается в момент установки серийного номера и именно в этот
|
||||
момент определяется режим, в котором будет работать
|
||||
приложение.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
Reference in New Issue
Block a user