aboutsummaryrefslogtreecommitdiff
path: root/help/ru/manager
diff options
context:
space:
mode:
Diffstat (limited to 'help/ru/manager')
-rw-r--r--help/ru/manager/activation.htm89
-rw-r--r--help/ru/manager/activation/api.htm223
-rw-r--r--help/ru/manager/activation/vmprotect.htm38
-rw-r--r--help/ru/manager/activation/weblm.htm55
-rw-r--r--help/ru/manager/features.htm138
-rw-r--r--help/ru/manager/howitworks.htm61
-rw-r--r--help/ru/manager/index.htm43
-rw-r--r--help/ru/manager/keygen/algorithms.htm79
-rw-r--r--help/ru/manager/keygen/index.htm121
-rw-r--r--help/ru/manager/keygen/keygen_dll.htm284
-rw-r--r--help/ru/manager/keygen/keygen_net.htm115
-rw-r--r--help/ru/manager/keygen/keygen_php.htm143
-rw-r--r--help/ru/manager/keygen/serial_format.htm260
-rw-r--r--help/ru/manager/licenses.htm112
-rw-r--r--help/ru/manager/usage/api.htm312
-rw-r--r--help/ru/manager/usage/index.htm127
-rw-r--r--help/ru/manager/usage/step11_app.htm62
-rw-r--r--help/ru/manager/usage/step12_code.htm105
-rw-r--r--help/ru/manager/usage/step13_flags.htm96
-rw-r--r--help/ru/manager/usage/step14_name.htm53
-rw-r--r--help/ru/manager/usage/step15_exp.htm59
-rw-r--r--help/ru/manager/usage/step16_time.htm79
-rw-r--r--help/ru/manager/usage/step17_maxbuild.htm85
-rw-r--r--help/ru/manager/usage/step18_blacklist.htm64
-rw-r--r--help/ru/manager/usage/step19_hwid.htm123
-rw-r--r--help/ru/manager/usage/step1A_userdata.htm76
-rw-r--r--help/ru/manager/usage/step21_src.htm109
-rw-r--r--help/ru/manager/usage/step22_vmp.htm42
-rw-r--r--help/ru/manager/usage/step23_product.htm70
-rw-r--r--help/ru/manager/usage/step24_test.htm90
-rw-r--r--help/ru/manager/usage/step25_codelock.htm144
31 files changed, 3457 insertions, 0 deletions
diff --git a/help/ru/manager/activation.htm b/help/ru/manager/activation.htm
new file mode 100644
index 0000000..302a559
--- /dev/null
+++ b/help/ru/manager/activation.htm
@@ -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>
diff --git a/help/ru/manager/activation/api.htm b/help/ru/manager/activation/api.htm
new file mode 100644
index 0000000..8a22254
--- /dev/null
+++ b/help/ru/manager/activation/api.htm
@@ -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>
diff --git a/help/ru/manager/activation/vmprotect.htm b/help/ru/manager/activation/vmprotect.htm
new file mode 100644
index 0000000..f0a3440
--- /dev/null
+++ b/help/ru/manager/activation/vmprotect.htm
@@ -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>
diff --git a/help/ru/manager/activation/weblm.htm b/help/ru/manager/activation/weblm.htm
new file mode 100644
index 0000000..35cf308
--- /dev/null
+++ b/help/ru/manager/activation/weblm.htm
@@ -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>
diff --git a/help/ru/manager/features.htm b/help/ru/manager/features.htm
new file mode 100644
index 0000000..c717767
--- /dev/null
+++ b/help/ru/manager/features.htm
@@ -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>
diff --git a/help/ru/manager/howitworks.htm b/help/ru/manager/howitworks.htm
new file mode 100644
index 0000000..0ebb8c6
--- /dev/null
+++ b/help/ru/manager/howitworks.htm
@@ -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>
diff --git a/help/ru/manager/index.htm b/help/ru/manager/index.htm
new file mode 100644
index 0000000..3cccf75
--- /dev/null
+++ b/help/ru/manager/index.htm
@@ -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>
diff --git a/help/ru/manager/keygen/algorithms.htm b/help/ru/manager/keygen/algorithms.htm
new file mode 100644
index 0000000..05b9bc3
--- /dev/null
+++ b/help/ru/manager/keygen/algorithms.htm
@@ -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>
diff --git a/help/ru/manager/keygen/index.htm b/help/ru/manager/keygen/index.htm
new file mode 100644
index 0000000..2650150
--- /dev/null
+++ b/help/ru/manager/keygen/index.htm
@@ -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>
diff --git a/help/ru/manager/keygen/keygen_dll.htm b/help/ru/manager/keygen/keygen_dll.htm
new file mode 100644
index 0000000..5e8134e
--- /dev/null
+++ b/help/ru/manager/keygen/keygen_dll.htm
@@ -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>(&amp;pi, &amp;si, &amp;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>
diff --git a/help/ru/manager/keygen/keygen_net.htm b/help/ru/manager/keygen/keygen_net.htm
new file mode 100644
index 0000000..f2d8d36
--- /dev/null
+++ b/help/ru/manager/keygen/keygen_net.htm
@@ -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>
diff --git a/help/ru/manager/keygen/keygen_php.htm b/help/ru/manager/keygen/keygen_php.htm
new file mode 100644
index 0000000..7df459a
--- /dev/null
+++ b/help/ru/manager/keygen/keygen_php.htm
@@ -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 =&gt; "John Doe", // UTF-8!
+ email =&gt; "john@doe.com",
+ hwid =&gt; "vHGMdMRvGCPjWcCQ", // Exactly as returned by VMProtectGetCurrentHWID
+ expire_date =&gt; <strong>array</strong>(year =&gt; 2009, month =&gt; 10, day =&gt; 1),
+ maxbuild_date =&gt; <strong>array</strong>(year =&gt; 2009, month =&gt; 10, day =&gt; 1),
+ time_limit =&gt; 10,
+ user_data =&gt; <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>
diff --git a/help/ru/manager/keygen/serial_format.htm b/help/ru/manager/keygen/serial_format.htm
new file mode 100644
index 0000000..d11d34f
--- /dev/null
+++ b/help/ru/manager/keygen/serial_format.htm
@@ -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 &lt;&lt; 16) | (10 &lt;&lt; 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>
diff --git a/help/ru/manager/licenses.htm b/help/ru/manager/licenses.htm
new file mode 100644
index 0000000..88517d5
--- /dev/null
+++ b/help/ru/manager/licenses.htm
@@ -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>
diff --git a/help/ru/manager/usage/api.htm b/help/ru/manager/usage/api.htm
new file mode 100644
index 0000000..df533b4
--- /dev/null
+++ b/help/ru/manager/usage/api.htm
@@ -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>
diff --git a/help/ru/manager/usage/index.htm b/help/ru/manager/usage/index.htm
new file mode 100644
index 0000000..99189c0
--- /dev/null
+++ b/help/ru/manager/usage/index.htm
@@ -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>
diff --git a/help/ru/manager/usage/step11_app.htm b/help/ru/manager/usage/step11_app.htm
new file mode 100644
index 0000000..cb5afbd
--- /dev/null
+++ b/help/ru/manager/usage/step11_app.htm
@@ -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 &lt;windows.h&gt;
+#include &lt;stdio.h&gt;
+
+bool is_registered(const char *serial)
+{
+ return serial &amp;&amp; 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>
diff --git a/help/ru/manager/usage/step12_code.htm b/help/ru/manager/usage/step12_code.htm
new file mode 100644
index 0000000..75bad46
--- /dev/null
+++ b/help/ru/manager/usage/step12_code.htm
@@ -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 &lt;windows.h&gt;
+#include &lt;stdio.h&gt;
+#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 &lt;windows.h&gt;
+#include &lt;stdio.h&gt;
+#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>
diff --git a/help/ru/manager/usage/step13_flags.htm b/help/ru/manager/usage/step13_flags.htm
new file mode 100644
index 0000000..a392b38
--- /dev/null
+++ b/help/ru/manager/usage/step13_flags.htm
@@ -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 &amp; flag) printf("%s ", #flag)
+void print_state(INT state)
+{
+ if (state == 0)
+ {
+ printf("state = 0\n");
+ return;
+ }
+
+ printf("state = ");
+ PRINT_HELPER(state, SERIAL_STATE_FLAG_CORRUPTED);
+ PRINT_HELPER(state, SERIAL_STATE_FLAG_INVALID);
+ PRINT_HELPER(state, SERIAL_STATE_FLAG_BLACKLISTED);
+ PRINT_HELPER(state, SERIAL_STATE_FLAG_DATE_EXPIRED);
+ PRINT_HELPER(state, SERIAL_STATE_FLAG_RUNNING_TIME_OVER);
+ PRINT_HELPER(state, SERIAL_STATE_FLAG_BAD_HWID);
+ PRINT_HELPER(state, SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED);
+ printf("\n");
+}
+</pre>
+
+ <p>Несмотря на свой размер, функция очень простая - она
+ последовательно проверяет все битовые флаги и печатает те, что
+ присутствуют в переменной состояния. Заменим
+ <strong>printf</strong> после проверки номера на вызов
+ <strong>print_state</strong>, заодно временно поправим серийный
+ номер, который подается в систему лицензирования:</p>
+ <pre class="code">char *serial = "Xserialnumber1"; // зададим номер непосредственно в коде для простоты
+int res = VMProtectSetSerialNumber(serial);
+print_state(res);
+</pre>
+
+ <p>Если запустить эту программу, то на консоль выведется
+ следующее:</p>
+ <pre class="code">state = SERIAL_STATE_FLAG_INVALID
+please register!
+</pre>
+
+ <p>Вернем теперь старый серийный номер, убрав "1", и запустим
+ программу еще раз:</p>
+ <pre class="code">state = 0
+We are registered.
+</pre>
+
+ <p>Теперь, когда мы можем видеть флаги состояние серийного
+ номера, перейдем к получению флагов и данных из серийного
+ номера.</p><strong>Получение состояния номера</strong>
+
+ <p>Состояние номера можно получить тремя способами: вызвав
+ <strong>VMProtectSetSerialNumber()</strong>, вызвав
+ <strong>VMProtectGetSerialNumberState()</strong> и вызвав
+ <strong>VMProtectGetSerialNumberData()</strong> - флаги состояния
+ будут помещены в одно из полей структуры. Каждый из методов
+ предназначен для использования в разное время. Первая проверка
+ серийного номера происходит непосредственно при его установке. В
+ этот момент нужно отсекать некорректные номера, номера с истекшим
+ сроком действия, номера из черного списка и т.п. Некоторые
+ ограничения - скажем, максимальное время работы продукта или срок
+ действия номера, имеет смысл проверять и в процессе работы
+ программы. Тут оптимально воспользоваться простым и быстрым
+ методом <strong>VMProtectGetSerialNumberState()</strong>, а в
+ случае, если нужно получить подробную информацию о данных в
+ серийном номере, можно использовать более мощную функцию
+ <strong>VMProtectGetSerialNumberData()</strong>.</p><br />
+ <a href="step14_name.htm">Следующий шаг</a>
+ <br />
+ <br />
+ <br />
+ <br />
+ <hr noshade="noshade" size="1" />
+
+ <div align="center">
+ © 2006-2015 Copyright VMProtect Software
+ </div>
+</body>
+</html>
diff --git a/help/ru/manager/usage/step14_name.htm b/help/ru/manager/usage/step14_name.htm
new file mode 100644
index 0000000..c6b6759
--- /dev/null
+++ b/help/ru/manager/usage/step14_name.htm
@@ -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(&amp;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>
diff --git a/help/ru/manager/usage/step15_exp.htm b/help/ru/manager/usage/step15_exp.htm
new file mode 100644
index 0000000..19169c7
--- /dev/null
+++ b/help/ru/manager/usage/step15_exp.htm
@@ -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(&amp;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>
diff --git a/help/ru/manager/usage/step16_time.htm b/help/ru/manager/usage/step16_time.htm
new file mode 100644
index 0000000..8ccd5d6
--- /dev/null
+++ b/help/ru/manager/usage/step16_time.htm
@@ -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(&amp;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>
diff --git a/help/ru/manager/usage/step17_maxbuild.htm b/help/ru/manager/usage/step17_maxbuild.htm
new file mode 100644
index 0000000..d76c271
--- /dev/null
+++ b/help/ru/manager/usage/step17_maxbuild.htm
@@ -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(&amp;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>
diff --git a/help/ru/manager/usage/step18_blacklist.htm b/help/ru/manager/usage/step18_blacklist.htm
new file mode 100644
index 0000000..f0a1eab
--- /dev/null
+++ b/help/ru/manager/usage/step18_blacklist.htm
@@ -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>
diff --git a/help/ru/manager/usage/step19_hwid.htm b/help/ru/manager/usage/step19_hwid.htm
new file mode 100644
index 0000000..354206b
--- /dev/null
+++ b/help/ru/manager/usage/step19_hwid.htm
@@ -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>
diff --git a/help/ru/manager/usage/step1A_userdata.htm b/help/ru/manager/usage/step1A_userdata.htm
new file mode 100644
index 0000000..15fc5de
--- /dev/null
+++ b/help/ru/manager/usage/step1A_userdata.htm
@@ -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(&amp;sd, sizeof(sd));
+ printf("Serial number has %d byte(s) of data\n", sd.nUserDataLength);
+ for (int i = 0; i &lt; 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>
diff --git a/help/ru/manager/usage/step21_src.htm b/help/ru/manager/usage/step21_src.htm
new file mode 100644
index 0000000..65a2ec7
--- /dev/null
+++ b/help/ru/manager/usage/step21_src.htm
@@ -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 &lt;windows.h&gt;
+#include &lt;stdio.h&gt;
+#include "VMProtectSDK.h"
+
+#define PRINT_HELPER(state, flag) if (state &amp; flag) printf("%s ", #flag)
+void print_state(INT state)
+{
+ if (state == 0)
+ {
+ printf("state = 0\n");
+ return;
+ }
+
+ printf("state = ");
+ PRINT_HELPER(state, SERIAL_STATE_FLAG_CORRUPTED);
+ PRINT_HELPER(state, SERIAL_STATE_FLAG_INVALID);
+ PRINT_HELPER(state, SERIAL_STATE_FLAG_BLACKLISTED);
+ PRINT_HELPER(state, SERIAL_STATE_FLAG_DATE_EXPIRED);
+ PRINT_HELPER(state, SERIAL_STATE_FLAG_RUNNING_TIME_OVER);
+ PRINT_HELPER(state, SERIAL_STATE_FLAG_BAD_HWID);
+ PRINT_HELPER(state, SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED);
+ printf("\n");
+}
+
+char *read_serial(const char *fname)
+{
+ FILE *f;
+ if (0 != fopen_s(&amp;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>
diff --git a/help/ru/manager/usage/step22_vmp.htm b/help/ru/manager/usage/step22_vmp.htm
new file mode 100644
index 0000000..bf0ac9b
--- /dev/null
+++ b/help/ru/manager/usage/step22_vmp.htm
@@ -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>
diff --git a/help/ru/manager/usage/step23_product.htm b/help/ru/manager/usage/step23_product.htm
new file mode 100644
index 0000000..bf5784b
--- /dev/null
+++ b/help/ru/manager/usage/step23_product.htm
@@ -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&gt;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&gt;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>
diff --git a/help/ru/manager/usage/step24_test.htm b/help/ru/manager/usage/step24_test.htm
new file mode 100644
index 0000000..31f5ed8
--- /dev/null
+++ b/help/ru/manager/usage/step24_test.htm
@@ -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&gt;dummy_app.vmp.exe
+serial number is bad
+state = SERIAL_STATE_FLAG_DATE_EXPIRED
+</pre>
+
+ <p>Модуль лицензирования вернул флаг "срок действия номера
+ закончен". Вернем рабочий номер обратно в файл serial.txt и
+ убедимся, что его модуль лицензирования примет без проблем.</p>
+ <pre class="code">C:\test&gt;dummy_app.vmp.exe
+serial number is correct, calling foo()
+I'm foo
+done
+</pre><strong>Занесение номера в черный список</strong>
+
+ <p>Предположим, что наш "хороший" серийный номер выложен в
+ Интернет. Нам необходимо его заблокировать, чтобы в следующих
+ версиях программы он уже не работал. Для этого мы выбираем его в
+ списке номеров и нажимаем кнопку "Заблокировать". Сам факт
+ нажатия кнопки не блокирует серийный номер в защищенном
+ приложении, однако после повторной защиты файла, он откажется
+ принимать этот серийный номер. Проверим. Если сейчас запустить
+ нашу программу, то она примет заблокированный номер без проблем,
+ т.к. это старая версия программы и она еще не знает о
+ блокировке:</p>
+ <pre class="code">C:\test&gt;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&gt;dummy_app.vmp.exe
+serial number is bad
+state = SERIAL_STATE_FLAG_BLACKLISTED
+</pre>
+
+ <p>Теперь для сравнения еще раз запустим старую версию
+ программы:</p>
+ <pre class="code">C:\test&gt;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>
diff --git a/help/ru/manager/usage/step25_codelock.htm b/help/ru/manager/usage/step25_codelock.htm
new file mode 100644
index 0000000..8cbe5c4
--- /dev/null
+++ b/help/ru/manager/usage/step25_codelock.htm
@@ -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 &amp;&amp;</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&gt;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>