first commit
Version 3.x.x
234
help/ru/about_vmprotect.htm
Normal file
@@ -0,0 +1,234 @@
|
||||
<!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>Программа VMProtect относится к новому поколению средств
|
||||
защиты программного обеспечения. VMProtect поддерживает
|
||||
компиляторы Delphi, Borland C Builder, Visual C/C++, Visual Basic
|
||||
(native), Virtual Pascal, XCode, при этом VMProtect содержит встроенный
|
||||
дизассемблер, позволяющий работать с исполняемыми файлами для операционных систем Windows и Mac OS X,
|
||||
а также подключать MAP-файл, создаваемый компилятором,
|
||||
для быстрого выбора участков кода, которые следует защитить. Для
|
||||
автоматизации операций по защите приложения в VMProtect
|
||||
реализован встроенный скриптовый язык. VMProtect обладает полной
|
||||
поддержкой 32/64-разрядных операционных систем семейства Windows
|
||||
(начиная с версии Win2k) и Mac OS X (начиная с версии 10.6),
|
||||
при этом независимо от платформы VMProtect поддерживает весь спектр
|
||||
исполняемых файлов (Windows версия может работать с файлами от Mac OS X и наоборот).</p>
|
||||
|
||||
<p>Базовым принципом, на основе которого построен VMProtect,
|
||||
является обеспечение эффективной защиты кода приложения от
|
||||
изучения, так как именно максимальное усложнение понимания логики
|
||||
работы внутренних механизмов защиты приложения создает
|
||||
максимальные трудности при взломе программы. Основными методами
|
||||
защиты программного кода, применяемыми VMProtect, являются
|
||||
виртуализация, мутация и смешанный метод защиты, сочетающий
|
||||
мутацию кода приложения с его последующей виртуализацией.</p>
|
||||
|
||||
<p>Одним из достоинств реализации метода виртуализации в
|
||||
программе VMProtect является то, что виртуальная машина, на
|
||||
которой выполняются виртуализированные фрагменты кода,
|
||||
встраивается в результирующий код защищаемого приложения.
|
||||
Следовательно, для функционирования приложения, защищенного с
|
||||
помощью VMProtect, нет необходимости использовать какие-либо
|
||||
дополнительные библиотеки или модули. VMProtect позволяет
|
||||
использовать несколько отличных друг от друга виртуальных машин
|
||||
для защиты разных участков кода одного приложения, что еще больше
|
||||
усложняет процесс взлома защиты, так как взломщику будет
|
||||
необходимо анализировать архитектуру уже нескольких виртуальных
|
||||
машин.</p>
|
||||
|
||||
<p>Метод мутации кода приложения, реализованный в VMProtect,
|
||||
основан на обфускации, в процессе которой в код приложения
|
||||
добавляются "мусорные" команды, "мертвый" код, случайные условные
|
||||
переходы, выполняется мутация оригинальных команд, а также
|
||||
переносится в стек выполнение ряда операций.</p>
|
||||
|
||||
<p>Ключевым отличием программы VMProtect от других протекторов
|
||||
является то, что с ее помощью можно защитить различные участки
|
||||
кода разными методами: часть кода виртуализировать, часть
|
||||
обфусцировать, а для самых критичных участков применить смешанный
|
||||
метод защиты.</p>
|
||||
|
||||
<p>Для предотвращения ложных срабатываний со стороны антивирусов зарегистрированная
|
||||
версия VMProtect использует библиотеку <a href="http://standards.ieee.org/develop/indconn/icsg/taggant.pdf">Taggant</a>, которая подписывает
|
||||
защищаемый файл сертификатом владельца лицензии.</p>
|
||||
|
||||
<p>Еще одной уникальной возможностью программы VMProtect является
|
||||
включение в код приложения <a href=
|
||||
"dictionary.htm#Watermarks">водяных знаков</a>, позволяющих
|
||||
однозначно идентифицировать официального владельца взломанного
|
||||
экземпляра программы, а следовательно, принять к нему
|
||||
соответствующие меры.</p>
|
||||
|
||||
<p>Программа VMProtect доступна в 3-х версиях:</p>
|
||||
|
||||
<ul>
|
||||
<li>Lite (облегченная версия);</li>
|
||||
<li>Professional (базовая версия);</li>
|
||||
<li>Ultimate (максимальная версия);</li>
|
||||
</ul>
|
||||
|
||||
<p>Отличия функциональных возможностей разных версий VMProtect
|
||||
приведены в таблице:</p>
|
||||
|
||||
<table border="1" cellspacing="0" cellpadding="2">
|
||||
<tr align="center">
|
||||
<td rowspan="2" align="center">
|
||||
<strong>Возможности</strong></td>
|
||||
|
||||
<td colspan="3" align="center"><strong>Версия
|
||||
VMProtect</strong></td>
|
||||
</tr>
|
||||
|
||||
<tr align="center">
|
||||
<td width="12%" align="center">Lite</td>
|
||||
<td width="12%" align="center">Professional</td>
|
||||
<td width="12%" align="center">Ultimate</td>
|
||||
</tr>
|
||||
|
||||
<tr bgcolor="#E0E0E0">
|
||||
<td align="left" colspan="4" class="c1"><strong>Методы
|
||||
защиты</strong></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Мутация</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Виртуализация</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Ультра (мутация+виртуализация)</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Консольная версия</td>
|
||||
<td align="center">-</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
</tr>
|
||||
|
||||
<tr bgcolor="#E0E0E0">
|
||||
<td align="left" colspan="4"><strong>Опции
|
||||
защиты</strong></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Защита памяти</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Защита импорта</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Защита ресурсов</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Упаковка</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Определение отладчика</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Определение средств виртуализации</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
</tr>
|
||||
|
||||
<tr bgcolor="#E0E0E0">
|
||||
<td align="left" colspan="4"><strong>Сервисные
|
||||
функции</strong></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Водяные знаки</td>
|
||||
<td align="center">-</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Скриптовый язык</td>
|
||||
<td align="center">-</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Система лицензирования</td>
|
||||
<td align="center">-</td>
|
||||
<td align="center">-</td>
|
||||
<td align="center">+</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Менеджер лицензий</td>
|
||||
<td align="center">-</td>
|
||||
<td align="center">-</td>
|
||||
<td align="center">+</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Защита файлов</td>
|
||||
<td align="center">-</td>
|
||||
<td align="center">-</td>
|
||||
<td align="center">+</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
41
help/ru/contacts.htm
Normal file
@@ -0,0 +1,41 @@
|
||||
<!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>По всем вопросам, связанным с работой программы или её
|
||||
приобретением, обращайтесь к нам по адресу:<br />
|
||||
www: <a href=
|
||||
"http://www.vmpsoft.com">http://www.vmpsoft.com</a><br />
|
||||
e-mail: <a href=
|
||||
"mailto:info@vmpsoft.com">info@vmpsoft.com</a><br />
|
||||
icq uin: <a href=
|
||||
"http://wwp.icq.com/scripts/search.dll?to=65107137">65107137</a><br />
|
||||
</p><a href="http://www.vmpsoft.com/news.php" target=
|
||||
"_blank">Новости</a> | <a href="http://www.vmpsoft.com/buy.php"
|
||||
target="_blank">Купить</a> | <a href=
|
||||
"http://www.vmpsoft.com/forum/index.php" target=
|
||||
"_blank">Форум</a><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
137
help/ru/create_project.htm
Normal file
@@ -0,0 +1,137 @@
|
||||
<!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>Для примера рассмотрим простейшее приложение, состоящее из
|
||||
одной формы (Form1), элемента ввода текста (Edit1) и кнопки
|
||||
(Button1). Работа приложения заключается в следующем: при нажатии
|
||||
на кнопку Button1 проверяется корректность введенного пароля и
|
||||
при этом выдается соответствующее сообщение.</p><br />
|
||||
<img src="images/delphi_project.png" />
|
||||
|
||||
<p>Пароль проверяется по простейшему алгоритму: сначала он
|
||||
преобразуется в число, после чего определяется остаток от деления
|
||||
данного числа на 17. Пароль считается правильным, если остаток от
|
||||
деления числового представления пароля на 17 равен 13. Процедура
|
||||
проверки пароля на языке программирования Delphi реализуется
|
||||
следующим образом:</p>
|
||||
<pre class="code">function TForm1.CheckPassword: Boolean;
|
||||
begin
|
||||
Result:=(StrToIntDef(Edit1.Text, 0) mod 17=13);
|
||||
end;
|
||||
|
||||
procedure TForm1.Button1Click(Sender: TObject);
|
||||
begin
|
||||
if CheckPassword then
|
||||
MessageDlg('Correct password', mtInformation, [mbOK], 0)
|
||||
else
|
||||
begin
|
||||
MessageDlg('Incorrect password', mtError, [mbOK], 0);
|
||||
Edit1.SetFocus;
|
||||
end;
|
||||
end;
|
||||
</pre>
|
||||
|
||||
<p>Выбор защищаемых процедур и функций может осуществляться тремя
|
||||
способами:</p>
|
||||
|
||||
<ul>
|
||||
<li>С <a href="use_map_file.htm">использованием MAP-файла</a>,
|
||||
который формируется компилятором при создании исполняемого
|
||||
модуля программы. В MAP-файле содержится вся необходимая
|
||||
информация об именах и адресах всех процедур и функций
|
||||
приложения. В случае использования MAP-файла при работе с
|
||||
VMProtect выбор защищаемых процедур и функций может
|
||||
осуществляться по имени. Используя МАР-файл, после
|
||||
перекомпиляции проекта VMProtect автоматически определит новые
|
||||
адреса процедур и функций.</li>
|
||||
|
||||
<li>С <a href="use_markers.htm">использованием маркеров</a>,
|
||||
которые вставляются в исходный код приложения. Маркеры
|
||||
представляют собой специальные метки, по которым VMProtect
|
||||
определяет границы защищаемого блока. Также VMProtect
|
||||
поддерживает маркеры с предустановленным типом компиляции.
|
||||
Использование маркеров целесообразно, если следует защитить
|
||||
только часть процедуры или функции. При использовании маркеров
|
||||
можно указать части кода, в которых в дальнейшем можно будет
|
||||
защитить строковые константы.</li>
|
||||
|
||||
<li>По адресам защищаемых процедур в исполняемом файле. По
|
||||
сравнению с предыдущими данный способ менее удобен в
|
||||
использовании, так как при любой доработке программы и,
|
||||
соответственно, ее перекомпиляции будет необходимо определять
|
||||
все адреса повторно. Данный способ рекомендуется лишь для
|
||||
защиты программных продуктов, для которых отсутствуют исходные
|
||||
тексты.</li>
|
||||
</ul>
|
||||
|
||||
<p>Использование MAP-файла для определения границ защищаемого
|
||||
кода имеет еще один важный плюс, который требует отдельного
|
||||
рассмотрения. Почти любая процедура или функция, обладающая
|
||||
локальными переменными или использующая стек для хранения
|
||||
регистров и/или промежуточных результатов вычислений, имеет так
|
||||
называемые пролог и эпилог, находящиеся соответственно в начале и
|
||||
в конце скомпилированной процедуры или функции:</p>
|
||||
<pre class="code">push ebp \
|
||||
mov ebp, esp \ пролог
|
||||
push 00 /
|
||||
push ebx /
|
||||
|
||||
...
|
||||
|
||||
pop ebx \
|
||||
pop ecx \ эпилог
|
||||
pop ebp /
|
||||
ret /
|
||||
</pre>
|
||||
|
||||
<p>Из-за особенностей реализации современных компиляторов маркеры
|
||||
кода никогда не охватывают пролог и эпилог (даже если маркерами
|
||||
будет охвачен весь текст функции CheckPassword, находящийся между
|
||||
begin и end). Для взлома будет достаточно откорректировать пролог
|
||||
функции таким образом, чтобы виртуалированный код не был
|
||||
выполнен. Для функции CheckPassword это можно сделать следующим
|
||||
образом:</p>
|
||||
<pre class="code">mov eax, 1
|
||||
ret
|
||||
</pre>
|
||||
|
||||
<p><strong>Важно:</strong><br />
|
||||
Если для выбора виртуализированных участков кода используется
|
||||
MAP-файл, то пролог и эпилог будут тоже завиртуализированы, что
|
||||
повысит защищенность программы. Более того, если одна
|
||||
виртуализированная функция вызывается из другой
|
||||
виртуализированной функции, то передача управления между ними
|
||||
будет осуществлена без перехода на адрес вызываемой функции
|
||||
(вызов будет представлять собой простой переход на другой адрес
|
||||
байт-кода внутри исполнителя виртуальной машины), что также
|
||||
повысит степень защищенности программы, так как внесенные
|
||||
взломщиком в точку входа корректировки окажутся бесполезными. При
|
||||
работе с виртуализированными функциями передача управления точке
|
||||
входа в завиртуализированную функцию будет осуществлена лишь в
|
||||
случае вызова защищенной функции из незащищенного или
|
||||
промутированного участка кода.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
55
help/ru/default.css
Normal file
@@ -0,0 +1,55 @@
|
||||
body,td,th
|
||||
{
|
||||
font-family: Tahoma, Arial, Helvetica, sans-serif;
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
tt
|
||||
{
|
||||
font-family: "Courier new";
|
||||
font-size: 1.1em;
|
||||
}
|
||||
|
||||
tr
|
||||
{
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
pre
|
||||
{
|
||||
font-family: "Courier new", monospace;
|
||||
font-size: 1.1em;
|
||||
}
|
||||
|
||||
.indent
|
||||
{
|
||||
margin-left: 2em;
|
||||
}
|
||||
|
||||
.code
|
||||
{
|
||||
font-family: "Courier new";
|
||||
background: #f8f8f8;
|
||||
color: black;
|
||||
padding: 4px;
|
||||
border-style: solid;
|
||||
border-color: #e0e0e0;
|
||||
overflow: auto;
|
||||
border-width: 1px;
|
||||
}
|
||||
|
||||
td, th
|
||||
{
|
||||
border-style: solid;
|
||||
border-color: black;
|
||||
}
|
||||
|
||||
table
|
||||
{
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
div.unhide_if_no_site
|
||||
{
|
||||
visibility: visible !important;
|
||||
}
|
107
help/ru/dictionary.htm
Normal file
@@ -0,0 +1,107 @@
|
||||
<!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>Эффективное использование любого инструмента невозможно без
|
||||
понимания терминологии, специфичной для соответствующей
|
||||
предметной области. В данном глоссарии дана расшифровка
|
||||
терминологии, применяемой в разрезе использования программы
|
||||
VMProtect. Глоссарий не претендует на универсальность и
|
||||
всеохватность, предложенное в нем толкование терминов может
|
||||
отличаться от классического.</p>
|
||||
|
||||
<p><a name="ByteCode" id="ByteCode"><strong>Байт-код</strong></a> - код, полученный после
|
||||
преобразования машинных команд реального процессора в команды
|
||||
виртуальной машины.</p>
|
||||
|
||||
<p><a name="Virtualization" id="Virtualization"><strong>Виртуализация</strong></a> - процесс преобразования части
|
||||
исполняемого кода приложения в команды виртуальной машины,
|
||||
обладающей неизвестной потенциальному взломщику системой команд,
|
||||
архитектурой и логикой работы. Виртуализированные участки кода
|
||||
выполняются интерпретатором (исполнителем виртуальной машины) без
|
||||
предварительного преобразования в машинные коды процессора. В
|
||||
общем случае задача реинжиниринга виртуализированных фрагментов
|
||||
сводится к изучению архитектуры виртуальной машины, созданию
|
||||
дизассемблера, соответствующего архитектуре имитируемого
|
||||
виртуальной машиной процессора, и анализу дизассемблированного
|
||||
кода.</p>
|
||||
|
||||
<p><a name="VirtualMachine" id="VirtualMachine"><strong>Виртуальная машина</strong></a> - программный код,
|
||||
непосредственно выполняющий байт-код в защищенной программе.</p>
|
||||
|
||||
<p><a name="Watermarks" id="Watermarks"><strong>Водяные
|
||||
знаки</strong></a> - уникальный для каждого пользователя массив
|
||||
байт, позволяющий однозначно идентифицировать легального
|
||||
владельца взломанной копии программы.</p>
|
||||
|
||||
<p><a name="Mutation" id="Mutation"><strong>Мутация</strong></a> - замена исходной команды аналогом
|
||||
или определенной последовательностью команд, обеспечивающей тот
|
||||
же результат, что и исходная команда.</p>
|
||||
|
||||
<p><a name="Obfuscation" id="Obfuscation"><strong>Обфускация</strong></a> - совокупность методик и средств,
|
||||
направленных на затруднение анализа программного кода. В
|
||||
зависимости от языка программирования, на котором написана
|
||||
защищаемая программа, используются различные типы
|
||||
программ-обфускаторов. При обфускации приложений, написанных на
|
||||
интерпретируемых языках (Perl, PHP и др.), изменения вносятся в
|
||||
исходные тексты: удаляются комментарии, переменным присваиваются
|
||||
бессмысленные имена, выполняется шифрация строковых констант и
|
||||
т.д. При обфускации программ, написанных на Java / .NET,
|
||||
выполняют преобразования байт-кода, обрабатываемого виртуальной
|
||||
машиной. При обфускации скомпилированных программ модифицируют
|
||||
машинный код: в него вносятся "мусорные" команды, "мертвый код",
|
||||
случайные переходы, выполняется мутация исходных команд, часть
|
||||
операций переносится в стек, а также выполняются различные
|
||||
структурные (реже математические) преобразования. При
|
||||
реинжиниринге обфусцированых участков кода их пытаются привести в
|
||||
исходный вид, что при определенном подходе к обфускации
|
||||
становится очень трудоемкой задачей.</p>
|
||||
|
||||
<p><a name="Protector" id="Protector"><strong>Программа-протектор</strong></a> - программа,
|
||||
предназначенная для защиты других программных продуктов от
|
||||
взлома. Подавляющее большинство современных протекторов не
|
||||
модифицируют исходный код приложения, а выполняют его
|
||||
упаковку/шифрацию, при этом основной упор сделан на защиту
|
||||
программы (процедуры) распаковки/расшифровки.</p>
|
||||
|
||||
<p><a name="EntryPoint" id="EntryPoint"><strong>Точка входа в
|
||||
программу (EntryPoint)</strong></a> - представляет собой
|
||||
начальный адрес, с которого начинается исполнение загруженной в память программы.</p>
|
||||
|
||||
<p><a name="Pack" id="Pack"><strong>Упаковка</strong></a> - метод
|
||||
защиты кода приложения, при котором производится сжатие
|
||||
исполняемого файла программы и/или используемых библиотек с
|
||||
помощью нестандартных алгоритмов. При использовании упаковки
|
||||
защищаемый программный код сжимается упаковщиком, а при запуске
|
||||
приложения у конечного пользователя производится его полная или
|
||||
частичная распаковка.</p>
|
||||
|
||||
<p><a name="Crypt" id="Crypt"><strong>Шифрация</strong></a> - защита части кода приложения с
|
||||
помощью криптостойких алгоритмов. Программное обеспечение,
|
||||
защищенное с помощью шифрации, требует от конечного пользователя
|
||||
ввода кода активации, который снимает установленные разработчиком
|
||||
ограничения незарегистрированной версии.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
139
help/ru/faq.htm
Normal file
@@ -0,0 +1,139 @@
|
||||
<!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>Приобретение VMProtect</h3>
|
||||
|
||||
<p><strong>Приобретая VMProtect, смогу ли я использовать его на
|
||||
разных компьютерах?</strong><br />
|
||||
Вы можете установить и использовать VMProtect на любом количестве
|
||||
компьютеров, которые необходимы вам для работы.</p>
|
||||
|
||||
<p><strong>В чем заключается разница между Personal и Company
|
||||
лицензиями и какую лицензию мне нужно выбрать при
|
||||
покупке?</strong><br />
|
||||
Эти лицензии отличаются только типом владельца. Если Вы являетесь
|
||||
частным разработчиком, то выберите Personal лицензию. Если Вы
|
||||
являетесь руководителем организации или планируете использовать
|
||||
продукт в своей организации, то выберите Company лицензию.</p>
|
||||
|
||||
<p><strong>Каким образом осуществляется доставка полной версии
|
||||
VMProtect после покупки?</strong><br />
|
||||
Доставка полной версии (и всех последующих обновлений VMProtect,
|
||||
входящих в ежегодную подписку) осуществляется с помощью
|
||||
электронной почты. В письме отправляется ссылка на архив, содержащий установочный файл с полной версией VMProtect.
|
||||
Поэтому перед покупкой VMProtect рекомендуется отключить все спам фильтры в настройках своего почтового
|
||||
ящика.</p>
|
||||
|
||||
<p><strong>После покупки VMProtect смогу ли я бесплатно получать
|
||||
новые версии или нужно будет их оплачивать
|
||||
дополнительно?</strong><br />
|
||||
После покупки Вы будете бесплатно получать новые версии в течение
|
||||
года. По истечении этого срока Вы можете <a href=
|
||||
"http://www.vmpsoft.com/buy.php">продлить ежегодную подписку</a>
|
||||
либо использовать текущую версию VMProtect без ограничений по
|
||||
времени.</p>
|
||||
|
||||
<p><strong>Возможно ли приобрести VMProtect с помощью кредитной
|
||||
карты или PayPal?</strong><br />
|
||||
Вы можете приобрести VMProtect с помощью кредитной карты или
|
||||
PayPal. Для этого необходимо на <a href=
|
||||
"http://www.vmpsoft.com/buy.php">странице покупки</a> выбрать необходимую версию VMProtect
|
||||
и на следующей странице в качестве метода оплаты выбрать кредитную карту или PayPal.</p>
|
||||
|
||||
<h3>Общие вопросы</h3>
|
||||
|
||||
<p><strong>Есть ли возможность автоматически зашифровать строки и
|
||||
массивы данных?</strong><br />
|
||||
В VMProtect существует возможность скрывать <a href=
|
||||
"sdk_functions.htm#VMProtectDecryptStringA">ANSI константы</a> и
|
||||
<a href="sdk_functions.htm#VMProtectDecryptStringW">Unicode
|
||||
константы</a>. Все остальные данные, с которыми работает
|
||||
обрабатываемый код, остаются в оригинальном виде. Рекомендуется
|
||||
всю конфиденциальную информацию хранить в зашифрованном виде и
|
||||
расшифровывать непосредственно перед использованием. Сам
|
||||
расшифровщик можно <a href=
|
||||
"project_functions.htm#CompilationTypes">завиртуализировать</a>.</p>
|
||||
|
||||
<p><strong>Есть ли возможность защищать процедуры, которые
|
||||
вызываются из разных потоков моего приложения?</strong><br />
|
||||
VMProtect полностью поддерживает многопоточные приложения и для
|
||||
защиты этих процедур не существует никаких дополнительных
|
||||
ограничений.</p>
|
||||
|
||||
<p><strong>Возможно ли совместное использование VMProtect с
|
||||
другим протектором (упаковщиком)?</strong><br />
|
||||
Использование каких-либо упаковщиков (протекторов) после защиты
|
||||
файла с помощью VMProtect может привести к неработоспособности
|
||||
защищенного приложения.</p>
|
||||
|
||||
<p><strong>Необходимо ли включать
|
||||
VMProtectSDK32.dll/VMProtectSDK64.dll в дистрибутив
|
||||
программы?</strong><br />
|
||||
Данные библиотеки используются только на этапе отладки программы
|
||||
(до её защиты). После защиты программы с помощью VMProtect вся
|
||||
информация об использовании этих DLL полностью удаляется и
|
||||
поэтому нет необходимости включать данные библиотеки в
|
||||
дистрибутив программы.</p>
|
||||
|
||||
<h3>Сообщения компилятора</h3>
|
||||
|
||||
<p><strong>Что означает данная ошибка: VMProtectMarker
|
||||
"ToolButton1Click.1".0044327D: Адрес используется процедурой
|
||||
"TForm1.ToolButton1Click"?</strong><br />
|
||||
Данная ошибка означает, что одна и таже команда с адресом
|
||||
0044327D используется в двух процедурах, которые в данный момент
|
||||
включены в список защищаемых объектов. Для решения этой проблемы
|
||||
необходимо исключить одну из процедур (в данном случае это
|
||||
VMProtectMarker "ToolButton1Click.1" и TForm1.ToolButton1Click)
|
||||
из списка защищаемых объектов.</p>
|
||||
|
||||
<p><strong>Что означает данная ошибка: [Ошибка]
|
||||
TForm1.Test.004433F4: Минимальный размер процедуры для компиляции
|
||||
5 байт?</strong><br />
|
||||
Данная ошибка означает, что процедура TForm1.Test слишком мала и
|
||||
не может быть защищена. Для решения этой проблемы необходимо
|
||||
исключить эту процедуру из списка защищаемых объектов.</p>
|
||||
|
||||
<p><strong>Что означает данное предупреждение:
|
||||
TForm1.ToolButton1Click.00443368: Переход на внутренний адрес:
|
||||
00443337?</strong><br />
|
||||
Данное предупреждение означает, что возможен переход из
|
||||
незащищенного кода внутрь защищенного (этот переход может
|
||||
привести к неработоспособности защищенной программы). Для решения
|
||||
этой проблемы необходимо пометить адрес 00443337 как <a href=
|
||||
"project_functions.htm#ExtAddress">внешний</a>.</p>
|
||||
|
||||
<p><strong>Что означает данная ошибка: Секция ".text" находится в
|
||||
области создания новой секции?</strong><br />
|
||||
Данная ошибка обычно возникает при защите драйверов и означает,
|
||||
что свободное место между первой секций файла и служебной
|
||||
информацией, расположенной в заголовке файла, слишком мало для
|
||||
создания новой секции. Для решения этой проблемы необходимо
|
||||
увеличить величину выравнивания для секций в исходных текстах
|
||||
драйвера и полностью его пересобрать (например: если драйвер
|
||||
собирается с помощью WDK/DDK, то необходимо добавить строку
|
||||
DRIVER_ALIGNMENT=0x200 в файл SOURCES).</p>
|
||||
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
31
help/ru/functions.htm
Normal file
@@ -0,0 +1,31 @@
|
||||
<!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>
|
||||
<p><img src="images/functions.png" /></p>
|
||||
<p>При выборе функции, ее свойства и опции защиты отображаются в основной панели. Для каждой функции можно выбрать <a href="project_functions.htm#CompilationTypes">тип компиляции</a> и установить <a href="manager/features.htm#lock">привязку к серийному номеру</a>.</p>
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
1021
help/ru/history.htm
Normal file
BIN
help/ru/images/activation_setup.png
Normal file
After Width: | Height: | Size: 34 KiB |
BIN
help/ru/images/button_action.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
help/ru/images/button_compilation.png
Normal file
After Width: | Height: | Size: 299 B |
BIN
help/ru/images/button_execute.png
Normal file
After Width: | Height: | Size: 362 B |
BIN
help/ru/images/button_open.png
Normal file
After Width: | Height: | Size: 387 B |
BIN
help/ru/images/button_project.png
Normal file
After Width: | Height: | Size: 5.5 KiB |
BIN
help/ru/images/button_save.png
Normal file
After Width: | Height: | Size: 297 B |
BIN
help/ru/images/button_search.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
help/ru/images/codelock_error.png
Normal file
After Width: | Height: | Size: 38 KiB |
BIN
help/ru/images/delphi_map.png
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
help/ru/images/delphi_project.png
Normal file
After Width: | Height: | Size: 2.4 KiB |
BIN
help/ru/images/depends.png
Normal file
After Width: | Height: | Size: 72 KiB |
BIN
help/ru/images/expert_find.png
Normal file
After Width: | Height: | Size: 8.0 KiB |
BIN
help/ru/images/export_keys.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
help/ru/images/functions.png
Normal file
After Width: | Height: | Size: 39 KiB |
BIN
help/ru/images/import_key.png
Normal file
After Width: | Height: | Size: 5.1 KiB |
BIN
help/ru/images/licenses1.png
Normal file
After Width: | Height: | Size: 33 KiB |
BIN
help/ru/images/lock_to_serial.png
Normal file
After Width: | Height: | Size: 40 KiB |
BIN
help/ru/images/main_window.png
Normal file
After Width: | Height: | Size: 33 KiB |
BIN
help/ru/images/menu_edit.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
help/ru/images/menu_file.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
help/ru/images/menu_help.png
Normal file
After Width: | Height: | Size: 19 KiB |
BIN
help/ru/images/menu_project.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
help/ru/images/menu_project_import.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
help/ru/images/menu_tools.png
Normal file
After Width: | Height: | Size: 5.5 KiB |
BIN
help/ru/images/preferences.png
Normal file
After Width: | Height: | Size: 19 KiB |
BIN
help/ru/images/project_add_folder.png
Normal file
After Width: | Height: | Size: 7.4 KiB |
BIN
help/ru/images/project_add_function.png
Normal file
After Width: | Height: | Size: 23 KiB |
BIN
help/ru/images/project_add_license.png
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
help/ru/images/project_file_delete.png
Normal file
After Width: | Height: | Size: 4.9 KiB |
BIN
help/ru/images/project_file_menu.png
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
help/ru/images/project_file_protection.png
Normal file
After Width: | Height: | Size: 25 KiB |
BIN
help/ru/images/project_file_settings.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
help/ru/images/project_functions.png
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
help/ru/images/project_functions_content.png
Normal file
After Width: | Height: | Size: 34 KiB |
BIN
help/ru/images/project_functions_content2.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
help/ru/images/project_functions_menu.png
Normal file
After Width: | Height: | Size: 7.0 KiB |
BIN
help/ru/images/project_functions_menu2.png
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
help/ru/images/project_functions_menu3.png
Normal file
After Width: | Height: | Size: 5.7 KiB |
BIN
help/ru/images/project_functions_search.png
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
help/ru/images/project_generate_keys.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
help/ru/images/project_options.png
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
help/ru/images/project_script.png
Normal file
After Width: | Height: | Size: 34 KiB |
BIN
help/ru/images/properties_calc.png
Normal file
After Width: | Height: | Size: 34 KiB |
BIN
help/ru/images/properties_directory.png
Normal file
After Width: | Height: | Size: 36 KiB |
BIN
help/ru/images/properties_dump.png
Normal file
After Width: | Height: | Size: 40 KiB |
BIN
help/ru/images/properties_dump_goto.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
help/ru/images/properties_export.png
Normal file
After Width: | Height: | Size: 44 KiB |
BIN
help/ru/images/properties_import.png
Normal file
After Width: | Height: | Size: 41 KiB |
BIN
help/ru/images/properties_resources.png
Normal file
After Width: | Height: | Size: 39 KiB |
BIN
help/ru/images/properties_segments.png
Normal file
After Width: | Height: | Size: 41 KiB |
BIN
help/ru/images/visual_studio_map.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
help/ru/images/watermarks_add.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
help/ru/images/watermarks_menu.png
Normal file
After Width: | Height: | Size: 7.0 KiB |
BIN
help/ru/images/watermarks_search.png
Normal file
After Width: | Height: | Size: 24 KiB |
BIN
help/ru/images/watermarks_setup.png
Normal file
After Width: | Height: | Size: 22 KiB |
BIN
help/ru/images/weblm_1.png
Normal file
After Width: | Height: | Size: 206 KiB |
BIN
help/ru/images/weblm_2.png
Normal file
After Width: | Height: | Size: 314 KiB |
38
help/ru/info.htm
Normal file
@@ -0,0 +1,38 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<link rel="Stylesheet" type="text/css" href="default.css" />
|
||||
<meta http-equiv="Content-Type" content=
|
||||
"text/html; charset=utf-8" />
|
||||
|
||||
<title>Раздел "Свойства"</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Раздел "Свойства"</h1>
|
||||
<p>Раздел "Свойства" отображает различную информацию о защищаемом приложении, а также позволяет исключить из упаковки те или иные сегменты данных и ресурсов.
|
||||
Изменения, произведенные в этой секции, сохраняются в файл проекта.</p>
|
||||
<p><img src="images/properties_directory.png" /></p>
|
||||
<p>Раздел "Свойства" содержит следующие секции:</p>
|
||||
<ul>
|
||||
<li><a href="info_directories.htm">Директории</a></li>
|
||||
<li><a href="info_segments.htm">Сегменты</a></li>
|
||||
<li><a href="info_imports.htm">Импорты</a></li>
|
||||
<li><a href="info_exports.htm">Экспорты</a></li>
|
||||
<li><a href="info_resources.htm">Ресурсы</a></li>
|
||||
<li><a href="info_calc.htm">Калькулятор</a></li>
|
||||
<li><a href="info_dump.htm">Дамп</a></li>
|
||||
</ul>
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
31
help/ru/info_calc.htm
Normal file
@@ -0,0 +1,31 @@
|
||||
<!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>
|
||||
<p><img src="images/properties_calc.png" /></p>
|
||||
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
30
help/ru/info_directories.htm
Normal file
@@ -0,0 +1,30 @@
|
||||
<!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>
|
||||
<p><img src="images/properties_directory.png" /></p>
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
35
help/ru/info_dump.htm
Normal file
@@ -0,0 +1,35 @@
|
||||
<!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>
|
||||
<p><img src="images/properties_dump.png" /></p>
|
||||
|
||||
<p>Кнопка "Перейти на адрес" на панели инструментов позволяет перейти на заданный адрес защищаемого приложения:</p>
|
||||
<p><img src="images/properties_dump_goto.png" /></p>
|
||||
<p>Для быстрого перехода к нужной функции начните вводить ее имя в строке быстрого поиска. Также можно ввести точный адрес.</p>
|
||||
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
28
help/ru/info_exports.htm
Normal file
@@ -0,0 +1,28 @@
|
||||
<!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>Отображает информацию об экспортах файла:</p>
|
||||
<p><img src="images/properties_export.png" /></p>
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
28
help/ru/info_imports.htm
Normal file
@@ -0,0 +1,28 @@
|
||||
<!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>Отображает информацию об импортируемых функциях и библиотеках:</p>
|
||||
<p><img src="images/properties_import.png" /></p>
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
31
help/ru/info_resources.htm
Normal file
@@ -0,0 +1,31 @@
|
||||
<!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>Отображает информацию о ресурсах:</p>
|
||||
<p><img src="images/properties_resources.png" /></p>
|
||||
<ul>
|
||||
<li><strong> Исключить из упаковки</strong> - Ресурс можно исключить из <a href="project_options.htm#PackOutputFile">упаковки</a>.</li>
|
||||
</ul>
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
32
help/ru/info_segments.htm
Normal file
@@ -0,0 +1,32 @@
|
||||
<!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>Отображает информацию о сегментах:<p></p>
|
||||
<p><img src="images/properties_segments.png" /></p>
|
||||
<ul>
|
||||
<li><strong>Исключить из защиты памяти</strong> - Сегмент можно исключить из <a href="project_options.htm#MemoryProtection">защиты памяти</a>.</li>
|
||||
<li><strong> Исключить из упаковки</strong> - Сегмент можно исключить из <a href="project_options.htm#PackOutputFile">упаковки</a>.</li>
|
||||
</ul>
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
41
help/ru/main_menu.htm
Normal file
@@ -0,0 +1,41 @@
|
||||
<!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[*/
|
||||
div.c2 {text-align: center}
|
||||
/*]]>*/
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Главное меню</h1>
|
||||
|
||||
<p>Главное меню состоит из следующих пунктов:</p>
|
||||
|
||||
<ul>
|
||||
<li><a href="menu_file.htm">Файл</a></li>
|
||||
<li><a href="menu_edit.htm">Правка</a></li>
|
||||
<li><a href="menu_project.htm">Проект</a></li>
|
||||
<li><a href="menu_tools.htm">Инструменты</a></li>
|
||||
<li><a href="menu_help.htm">Справка</a></li>
|
||||
</ul>
|
||||
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
42
help/ru/main_window.htm
Normal file
@@ -0,0 +1,42 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<link rel="Stylesheet" type="text/css" href="default.css" />
|
||||
<meta http-equiv="Content-Type" content=
|
||||
"text/html; charset=utf-8" />
|
||||
|
||||
<title>Главное окно</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Главное окно</h1>
|
||||
|
||||
<p>Главное окно состоит из следующих элементов:</p>
|
||||
|
||||
<ul>
|
||||
<li><a href="main_menu.htm">Главное меню</a></li>
|
||||
<li><a href="toolbar.htm">Панель инструментов</a></li>
|
||||
<li>Панель управления, состоящая из трех разделов:
|
||||
<ul>
|
||||
<li><a href="project.htm">Раздел "Проект"</a></li>
|
||||
<li><a href="functions.htm">Раздел "Функции"</a></li>
|
||||
<li><a href="info.htm">Раздел "Свойства"</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Лог компиляции</li>
|
||||
</ul>
|
||||
<p><img src="images/main_window.png" /></p>
|
||||
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
89
help/ru/manager/activation.htm
Normal file
@@ -0,0 +1,89 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<link rel="Stylesheet" type="text/css" href="../default.css" />
|
||||
<meta http-equiv="Content-Type" content=
|
||||
"text/html; charset=utf-8" />
|
||||
|
||||
<title>Система Активации</title>
|
||||
<style type="text/css">
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Система Активации</h1>
|
||||
|
||||
<h3>Что Это?</h3>
|
||||
|
||||
<p>Активация - это двухэтапный процесс регистрации приложения. На
|
||||
первом этапе (обычно после покупки) покупатель получает код
|
||||
активации (выглядит как XXXX-YYYY-ZZZZ). На втором этапе
|
||||
покупатель вводит этот код в приложение, приложение соединяется
|
||||
через Интернет с сервером производителя ПО, сервер проверяет код
|
||||
активации и выдает приложению серийный номер, связанный с этим
|
||||
кодом активации и обычно привязанный к оборудованию
|
||||
пользователя.</p>
|
||||
|
||||
<p>Такой подход позволяет контролировать использование лицензий
|
||||
покупателями, предотвращать утечки лицензий, а также многое
|
||||
другое, например демо-лицензии или надежные триальные
|
||||
периоды.</p>
|
||||
|
||||
<h3>Зачем Она Мне Нужна?</h3>
|
||||
|
||||
<p>Система активации дает производителю ПО достаточно широкие
|
||||
возможности, например:</p>
|
||||
|
||||
<ul>
|
||||
<li><strong>Короткие серийные номера</strong> - длинные
|
||||
серийные номера хороши всем, кроме длины. Пользователи могут
|
||||
ошибиться при вводе, почтовые программы иногда портят некоторые
|
||||
символы, однако только длинные серийные номера позволяют хранить
|
||||
достаточный объем дополнительной информации. Коды активации
|
||||
позволяют решить все проблемы длинных серийных номеров, не
|
||||
влияя на их положительные стороны.</li>
|
||||
|
||||
<li><strong>Контроль количества инсталляций</strong> - все
|
||||
активации доступны производителю онлайн в реальном времени. Их
|
||||
можно отслеживать, анализировать, блокировать, оказывать
|
||||
поддержку пользователям и т.д.</li>
|
||||
|
||||
<li><strong>Триалы</strong> - можно создавать серийные номера,
|
||||
ограниченные по времени, используя "режимы" продуктов -
|
||||
"modes".</li>
|
||||
|
||||
<li><strong>Подписки</strong> - подписки похожи на триалы,
|
||||
однако стоят денег. Вы можете продавать пользователю право
|
||||
работать с программой в течение определенного времени, как это
|
||||
делают производители антивирусов - просто продавайте коды
|
||||
активации на очередной год обслуживания.</li>
|
||||
</ul>
|
||||
|
||||
<p>Более подробная информация о системе активации доступна в
|
||||
соответствующем <a href=
|
||||
"http://vmpsoft.com/products/web-license-manager/" target=
|
||||
"_blank">разделе</a> нашего сайта.</p>
|
||||
|
||||
<h3>Что Потребуется Сделать?</h3>
|
||||
|
||||
<p>VMProtect Ultimate дополнен несколькими <a href=
|
||||
"activation/api.htm">функциями</a>, которые позволяют
|
||||
сравнительно легко реализовать как онлайн, так и оффлайн
|
||||
активацию. Вам также потребуется установленный на сервере
|
||||
<a href="activation/weblm.htm">Web License Manager</a>. Наконец,
|
||||
потребуется <a href="activation/vmprotect.htm">настроить</a>
|
||||
проект защиты в VMProtect, чтобы модуль активации знал адрес
|
||||
сервера WebLM.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
223
help/ru/manager/activation/api.htm
Normal file
@@ -0,0 +1,223 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<link rel="Stylesheet" type="text/css" href=
|
||||
"../../default.css" />
|
||||
<meta http-equiv="Content-Type" content=
|
||||
"text/html; charset=utf-8" />
|
||||
|
||||
<title>API Активации</title>
|
||||
<style type="text/css">
|
||||
/*<![CDATA[*/
|
||||
th {text-align:left;}
|
||||
table {border-collapse:collapse; margin-top: 4px;}
|
||||
td,th {border: 1px solid #B0B0B0; padding-left:10;padding-right:10;}
|
||||
/*]]>*/
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>API Активации</h1>
|
||||
|
||||
<p>API Активации содержит всего 4 функции. Две предназначены для
|
||||
онлайн-активации и две для оффлайн, когда на компьютере
|
||||
отсутствует доступ в Интернет. API Активации предназначено для
|
||||
взаимодействия с Web License Manager, так что разработчику все
|
||||
равно необходимо вызывать API системы лицензирования, чтобы
|
||||
использовать серийные номера, полученные от WebLM.</p><strong id=
|
||||
"VMProtectActivateLicense">VMProtectActivateLicense</strong>
|
||||
|
||||
<p>Функция передает код активации на сервер и возвращает серийный
|
||||
номер, подходящий для этого конкретного компьютера. В противном
|
||||
случае возвращается <a href="#codes">код ошибки</a>.</p>
|
||||
<pre class="code">int VMProtectActivateLicense(const char *code, char *serial, int size);
|
||||
</pre>
|
||||
|
||||
<p>Параметр <strong>code</strong> содержит код активации, который
|
||||
получен от Web License Manager в процессе покупки лицензии.
|
||||
Параметр <strong>serial</strong> указывает на блок памяти размера
|
||||
<strong>size</strong>, в который будет помещен сгенерированный
|
||||
WebLM серийный номер.</p><strong id=
|
||||
"VMProtectDeactivateLicense">VMProtectDeactivateLicense</strong>
|
||||
|
||||
<p>Функция передает серийный номер на сервер для деактивации.
|
||||
Возможные коды возврата перечислены <a href=
|
||||
"#codes">ниже</a>.</p>
|
||||
<pre class="code">int VMProtectDeactivateLicense(const char *serial);
|
||||
</pre>
|
||||
|
||||
<p>Параметр <strong>serial</strong> содержит серийный номер (не
|
||||
код активации), полученный ранее от WebLM в процессе
|
||||
активации.</p><strong id=
|
||||
"VMProtectGetOfflineActivationString">VMProtectGetOfflineActivationString</strong><br />
|
||||
|
||||
<strong id=
|
||||
"VMProtectGetOfflineDeactivationString">VMProtectGetOfflineDeactivationString</strong>
|
||||
|
||||
<p>Эти две функции работают практически аналогично двум
|
||||
предыдущим с той лишь разницей, что они не пытаются подключиться
|
||||
к серверу WebLM. Вместо этого они возвращают блок текста, который
|
||||
необходимо скопировать на компьютер где есть доступ в Интернет,
|
||||
открыть там форму оффлайн-активации WebLM и вставить туда этот
|
||||
текст.</p>
|
||||
<pre class="code">int VMProtectGetOfflineActivationString(const char *code, char *buf, int size);
|
||||
int VMProtectGetOfflineDeactivationString(const char *serial, char *buf, int size);
|
||||
</pre>
|
||||
|
||||
<p>Параметры <strong>code</strong> и <strong>serial</strong>
|
||||
аналогичны параметрам онлайн-версий функций, параметр
|
||||
<strong>buf</strong> должен указывать на буфер размером 1000 байт
|
||||
или больше, туда будет скопирован текстовый блок для формы
|
||||
оффлайн-активации. Возможные коды ошибок перечислены <a href=
|
||||
"#codes">ниже</a>.</p>
|
||||
|
||||
<h3 id="codes">Возможные Коды Ошибок</h3>
|
||||
|
||||
<table border="1" cellspacing="0" cellpadding="2">
|
||||
<tr>
|
||||
<th>Код</th>
|
||||
|
||||
<th>Значение</th>
|
||||
|
||||
<th>Описание</th>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>ACTIVATION_OK</td>
|
||||
|
||||
<td>0</td>
|
||||
|
||||
<td>Активация прошла успешно, переменная
|
||||
<strong>serial</strong> содержит серийный номер.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>ACTIVATION_SMALL_BUFFER</td>
|
||||
|
||||
<td>1</td>
|
||||
|
||||
<td>Буфер для серийного номера слишком маленький. Минимальный
|
||||
размер буфера вычисляется по формуле: bits / 8 * 3 / 2 + N,
|
||||
где bits - длина RSA ключа в битах, а N - "константа
|
||||
безопасности" - дополнительное количество байт на случай
|
||||
переносов строк и прочих спец-символов. Рекомендуется
|
||||
использовать как минимум 10.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>ACTIVATION_NO_CONNECTION</td>
|
||||
|
||||
<td>2</td>
|
||||
|
||||
<td>Модуль активации не смог подключиться к Web License
|
||||
Manager.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>ACTIVATION_BAD_REPLY</td>
|
||||
|
||||
<td>3</td>
|
||||
|
||||
<td>Сервер активации вернул неожиданный результат. Это
|
||||
означает проблемы конфигурации сервера, неправильный url
|
||||
сервера активации или попытку взлома.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>ACTIVATION_BANNED</td>
|
||||
|
||||
<td>4</td>
|
||||
|
||||
<td>Этот код активации заблокирован на сервере производителем
|
||||
ПО через интерфейс WebLM (например, из-за
|
||||
утечки кода активации с пиратской копией). Не путать с ACTIVATION_ALREADY_USED.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>ACTIVATION_CORRUPTED</td>
|
||||
|
||||
<td>5</td>
|
||||
|
||||
<td>Что-то пошло совсем не так. Ошибка выдается системой
|
||||
самопроверки модуля активации и с высокой вероятностью
|
||||
означает попытку взлома. В случае получения этой ошибки
|
||||
дальнейшие операции с серийными номерами и активацией не
|
||||
могут считаться безопасными.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>ACTIVATION_BAD_CODE</td>
|
||||
|
||||
<td>6</td>
|
||||
|
||||
<td>Данный код не найден в базе данных сервера активаций.
|
||||
Возможно пользователь ошибся при вводе кода, так что можно
|
||||
попросить его проверить правильность ввода данных.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>ACTIVATION_ALREADY_USED</td>
|
||||
|
||||
<td>7</td>
|
||||
|
||||
<td>Счетчик активаций этого кода дошел до нуля и дальнейшие
|
||||
активации невозможны. Это не обозначает, что код плохой или
|
||||
заблокирован - код хороший. Пользователю нужно связаться с
|
||||
производителем ПО и докупить необходимое количество лицензий
|
||||
или же деинсталлировать программу на других компьютерах,
|
||||
чтобы увеличить значение счетчика в базе данных.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>ACTIVATION_SERIAL_UNKNOWN</td>
|
||||
|
||||
<td>8</td>
|
||||
|
||||
<td>Ошибка деактивации. Означает, что данный серийный
|
||||
номер не найден в базе данных сервера. Соответственно,
|
||||
деактивация не может быть проведена успешно.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>ACTIVATION_EXPIRED</td>
|
||||
|
||||
<td>9</td>
|
||||
|
||||
<td>Ошибка активации. Означает, что период действия кода активации истек.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>ACTIVATION_NOT_AVAILABLE</td>
|
||||
|
||||
<td>10</td>
|
||||
|
||||
<td>Ошибка означает, что активация/деактивация недоступна.</td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
|
||||
<h3>Маленькие хитрости</h3>
|
||||
|
||||
<p>API Активации достаточно простое, так что с ним не должно
|
||||
возникнуть сложностей. Не забудьте предоставить пользователям
|
||||
интерфейс для оффлайн-активации, если онлайн-активация
|
||||
завершилась неудачей из-за проблем с доступом в интернет. Также
|
||||
не забывайте, что API Активации не сохраняет полученный серийный
|
||||
номер и не передает его модулю лицензирования - это задача
|
||||
разработчика. Нет необходимости вызывать API Активации при каждом
|
||||
запуске приложения - достаточно вызвать его один раз, получить
|
||||
серийный номер от WebLM, сохранить его в удобном месте и в
|
||||
дальнейшем использовать только его.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
38
help/ru/manager/activation/vmprotect.htm
Normal file
@@ -0,0 +1,38 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<link rel="Stylesheet" type="text/css" href=
|
||||
"../../default.css" />
|
||||
<meta http-equiv="Content-Type" content=
|
||||
"text/html; charset=utf-8" />
|
||||
|
||||
<title>Настройка Активации в VMProtect</title>
|
||||
<style type="text/css">
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Настройка Активации в VMProtect</h1>
|
||||
|
||||
<p>Для работы <a href="api.htm">API Активации</a> требуется адрес
|
||||
сервера WebLM, так что необходимо задать его в настройках проекта
|
||||
VMProtect. Чтобы сделать это, запустите VMProtect и перейдите в
|
||||
раздел настроек:</p><br /><img src="../../images/activation_setup.png" alt="Настройка сервера активации" />
|
||||
|
||||
<p>Введите адрес в поле "Сервер активации". Адрес должен
|
||||
выглядеть так: http://<em>yourserver</em>/<em>weblm
|
||||
path</em>/activate.php. Это первое место, которое следует проверить, если в дальнейшем Вы столкнетесь
|
||||
с ошибками в процессе онлайн-активации.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
55
help/ru/manager/activation/weblm.htm
Normal file
@@ -0,0 +1,55 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<link rel="Stylesheet" type="text/css" href=
|
||||
"../../default.css" />
|
||||
<meta http-equiv="Content-Type" content=
|
||||
"text/html; charset=utf-8" />
|
||||
|
||||
<title>Поддержка Активации в Web License Manager</title>
|
||||
<style type="text/css">
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Поддержка Активации в Web License Manager</h1>
|
||||
|
||||
<p>Подробно Web License Manager описан <a href=
|
||||
"http://vmpsoft.com/products/web-license-manager/" target=
|
||||
"_blank">на сайте</a>, здесь даны минимальные инструкции по
|
||||
созданию кода активации для последующего использования с API
|
||||
Активации.</p>
|
||||
|
||||
<p>Для начала войдите в Web License Manager (можно использовать
|
||||
демо-версию на нашем сайте) и создайте продукт. Затем
|
||||
экспортируйте продукт как проект VMProtect, чтобы иметь
|
||||
возможность использовать его для настроек лицензирования и
|
||||
активации. После того как проект настроен, необходимые проверки
|
||||
добавлены в код и исполняемый файл защищен, нажмите ссылку "Add
|
||||
New Code" в левой панели WebLM:</p>
|
||||
<p><img src="../../images/weblm_1.png" /></p>
|
||||
|
||||
<p>Выберите нужный продукт в верхнем выпадающем списке и
|
||||
заполните остальные поля формы данными, которые Вы хотите
|
||||
поместить в серийный номер. Затем нажмите кнопку "Save". Вы
|
||||
увидите код активации, который можно использовать для отладки API
|
||||
Активации.</p>
|
||||
<p><img src="../../images/weblm_2.png" /></p>
|
||||
|
||||
<p>Множество других возможностей Web License Manager (таких, как интеграция с регистраторами или
|
||||
автоматическая генерация кодов активации) можно подробно изучить в <a href=
|
||||
"http://vmpsoft.com/products/web-license-manager/" target=
|
||||
"_blank">онлайн-версии руководства пользователя</a>.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
138
help/ru/manager/features.htm
Normal file
@@ -0,0 +1,138 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<link rel="Stylesheet" type="text/css" href="../default.css" />
|
||||
<meta http-equiv="Content-Type" content=
|
||||
"text/html; charset=utf-8" />
|
||||
|
||||
<title>Возможности системы лицензирования VMProtect</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Возможности системы лицензирования VMProtect</h1>
|
||||
|
||||
<h3>Надежные серийные номера</h3>
|
||||
|
||||
<p>Система лицензирования использует асимметричные алгоритмы для
|
||||
шифрования серийных номеров. Номер шифруется приватным ключом,
|
||||
который хранится только у разработчика продукта. Защищаемый
|
||||
продукт расшифровывает номер публичным ключом и проверяет его. В
|
||||
силу длины используемых ключей (от 1024 бит для RSA) практически
|
||||
невозможно подобрать закрытый ключ и создать генератор ключей для
|
||||
продукта.</p>
|
||||
|
||||
<h3 id="lock">Привязка кода к серийному номеру</h3>
|
||||
|
||||
<p>VMProtect позволяет исполнять часть кода программы на
|
||||
виртуальной машине. Набор команд виртуальной машины меняется при
|
||||
каждой сборке защищаемой программы. Система лицензирования
|
||||
позволяет зашифровать часть команд виртуальной машины ключом,
|
||||
который хранится в серийном номере. Таким образом, даже если
|
||||
хакер исправит условный переход в программе, код все равно не
|
||||
будет работать без корректного серийного номера. А так как
|
||||
расшифровка кода также происходит под управлением виртуальной
|
||||
машины, то даже наличие серийного номера не дает возможности
|
||||
легко проанализировать алгоритм
|
||||
расшифровки.</p>
|
||||
|
||||
<h3>Ограничение периода бесплатных обновлений</h3>
|
||||
|
||||
<p>Система лицензирования позволяет записать в ключ такую дату,
|
||||
что версии приложения, собранные после этой даты, не будут
|
||||
работать с этим ключом. Это позволяет ограничивать период
|
||||
бесплатных обновлений продукта. Например при продаже в ключ
|
||||
записывается текущая дата плюс один год и пользователь может
|
||||
скачивать с сайта новые версии в течение года. Ключ будет
|
||||
работать в этих версиях. По истечение года у пользователя будет
|
||||
выбор: пользоваться последней "рабочей" версией программы или
|
||||
купить обновление еще на один год.</p>
|
||||
|
||||
<h3>Срок годности ключа</h3>
|
||||
|
||||
<p>Система лицензирования позволяет записать в ключ дату, после
|
||||
которой ключ перестает работать. Это удобно для продажи
|
||||
продуктов, требующих периодического обновления. Например при
|
||||
продаже в серийный номер помещается текущая дата плюс год и
|
||||
программа будет работать у пользователя в течение года. В отличие
|
||||
от ограничения периода бесплатных обновлений, в этом случае у
|
||||
пользователя нет выбора - ему придется купить новую лицензию,
|
||||
если он хочет продолжать пользоваться
|
||||
программой.</p>
|
||||
|
||||
<h3>Ограничение времени работы программы</h3>
|
||||
|
||||
<p>Система лицензирования позволяет ограничить время работы
|
||||
экземпляра программы. Это бывает полезно для демонстрационных
|
||||
задач. Например покупатель хочет получить для тестирования
|
||||
полноценную копию программы. В этом случае можно передать ему
|
||||
серийный номер, который ограничит время работы программы, скажем,
|
||||
десятью минутами. По истечение этого времени программа прекратит
|
||||
свою работу. Такая схема подходит для демонстрационных версий
|
||||
различных серверных приложений, где простой перезапуск приложения
|
||||
будет неудобен.</p>
|
||||
|
||||
<h3>Привязка к оборудованию</h3>
|
||||
|
||||
<p>Система лицензирования позволяет получить идентификатор
|
||||
оборудования пользователя на основе процессора, сетевых плат и
|
||||
информации операционной системы. Серийный номер может быть создан
|
||||
так, что он будет работать только на оборудовании с этим
|
||||
идентификатором. Это позволяет ограничить использование одной
|
||||
лицензии на нескольких компьютерах.</p>
|
||||
|
||||
<h3>Черный список</h3>
|
||||
|
||||
<p>В случае дискредитации серийного номера, система
|
||||
лицензирования позволяет занести такой номер в черный список,
|
||||
после чего номер не будет работать в следующих версиях
|
||||
приложения.</p>
|
||||
|
||||
<h3>Хранение данных</h3>
|
||||
|
||||
<p>Система лицензирования позволяет хранить в серийном номере и
|
||||
выдавать защищаемой программе следующие данные: имя пользователя,
|
||||
e-mail, а также до 255 байт произвольных данных (т.н. "данные
|
||||
пользователя"). Это может быть использовано для показа в диалоге
|
||||
"О Программе", для реализации дополнительных проверок серийного
|
||||
номера, для хранения констант, доступных только в
|
||||
зарегистрированной версии продукта и т.п.</p>
|
||||
|
||||
<h3>Ограниченние работы демо-версии по времени</h3>
|
||||
|
||||
<p>Используя систему <a href="activation.htm">активации</a>
|
||||
производитель ПО может автоматически создавать ограниченные по времени и привязанные к оборудованию
|
||||
пользователя серийные номера. Это позволяет организовать надежно защищенный
|
||||
демо-период для приложения, так как VMProtect не прячет триальные
|
||||
метки на компьютере пользователя, а вместо этого генерирует
|
||||
полноценный, но ограниченный по времени серийный номер. Активация
|
||||
обычно производится непосредственно через интернет, но в API активации предусмотрен
|
||||
и оффлайновый режим.</p><br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<h1>Чего система лицензирования не умеет и
|
||||
почему?</h1>
|
||||
|
||||
<h3>100%-но надежная привязка к оборудованию</h3>
|
||||
|
||||
<p>Несмотря на то, что система лицензирования позволяет
|
||||
привязаться к идентификатору оборудования, следует понимать, что
|
||||
большинство данных об оборудовании получается средствами
|
||||
операционной системы, которые могут быть перехвачены хакером с
|
||||
целью изменения данных. Система лицензирования применяет ряд
|
||||
схем, позволяющих минимизировать такие риски, однако если вам
|
||||
требуется 100%-но надежная привязка к оборудованию, мы
|
||||
рекомендуем воспользоваться решением на базе USB-ключей, с
|
||||
которыми также может работать VMProtect.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
61
help/ru/manager/howitworks.htm
Normal file
@@ -0,0 +1,61 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<link rel="Stylesheet" type="text/css" href="../default.css" />
|
||||
<meta http-equiv="Content-Type" content=
|
||||
"text/html; charset=utf-8" />
|
||||
|
||||
<title>Как работает система лицензирования?</title>
|
||||
<style type="text/css">
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Как работает система лицензирования?</h1>
|
||||
|
||||
<h3>Защита приложения</h3>
|
||||
|
||||
<p>VMProtect в процессе защиты приложения интегрирует в него код
|
||||
проверки серийных номеров. При этом используется информация,
|
||||
указанная в секции "Лицензии" раздела "Проект". В приложение помещается
|
||||
публичный ключ продукта, при помощи которого будет осуществляться
|
||||
расшифровка серийных номеров. Также в приложение помещается дата
|
||||
защиты и ряд дополнительных данных, необходимых для работы
|
||||
системы лицензирования.</p>
|
||||
|
||||
<h3>Создание серийных номеров</h3>
|
||||
|
||||
<p>Серийные номера могут быть созданы в секции <a href=
|
||||
"licenses.htm">"Лицензии"</a> раздела "Проект" или при помощи отдельных приложений
|
||||
- <a href="keygen/index.htm">генераторов ключей</a>. Серийный
|
||||
номер - это набор данных о покупателе, зашифрованный асимметричным
|
||||
алгоритмом. Серийный номер передается покупателю, тот вводит его
|
||||
в программу, после чего он проверяется модулем
|
||||
лицензирования.</p>
|
||||
|
||||
<h3>Проверка серийного номера в программе</h3>
|
||||
|
||||
<p>Модуль лицензирования предоставляет защищаемой программе
|
||||
<a href="usage/api.htm">несколько функций</a> для работы с
|
||||
серийными номерами. Программа передает модулю лицензирования
|
||||
серийный номер и запрашивает информацию о нем. Модуль
|
||||
лицензирования выдает краткое состояние серийного номера
|
||||
(рабочий/нерабочий и почему), а также может выдать подробную
|
||||
информацию о серийном номере, такую как имя пользователя, e-mail,
|
||||
срок действия номера и т.д. Защищаемая программа анализирует
|
||||
информацию о серийном номере и принимает решение о продолжении
|
||||
или завершении работы, а также об ограничениях
|
||||
функционала.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
43
help/ru/manager/index.htm
Normal file
@@ -0,0 +1,43 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<link rel="Stylesheet" type="text/css" href="../default.css" />
|
||||
<meta http-equiv="Content-Type" content=
|
||||
"text/html; charset=utf-8" />
|
||||
|
||||
<title>Система лицензирования</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Система лицензирования</h1>
|
||||
|
||||
<p>Система лицензирования решает задачи создания и проверки
|
||||
серийных номеров. Поддерживаются ограничения работы защищаемого
|
||||
ПО по дате и времени, привязка к оборудованию, шифрование кода
|
||||
серийным номером, ограничение периода бесплатных обновлений и
|
||||
многое другое. Система построена на асимметричных алгоритмах
|
||||
шифрования, что минимизирует вероятность создания генераторов
|
||||
серийных номеров. Для защиты системы лицензирования применяется
|
||||
виртуализация VMProtect, что минимизирует вероятность взлома на
|
||||
уровне кода и создания патчей.</p>
|
||||
|
||||
<ul>
|
||||
<li><a href="features.htm">Возможности системы лицензирования</a></li>
|
||||
<li><a href="howitworks.htm">Схема работы системы лицензирования</a></li>
|
||||
<li><a href="licenses.htm">Управление лицензиями: создание, изменение, блокировка и т.п.</a></li>
|
||||
<li><a href="usage/index.htm">Пример интеграции в приложение</a></li>
|
||||
<li><a href="keygen/index.htm">Автоматическое создание серийных номеров</a></li>
|
||||
</ul>
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
79
help/ru/manager/keygen/algorithms.htm
Normal file
@@ -0,0 +1,79 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<link rel="Stylesheet" type="text/css" href=
|
||||
"../../default.css" />
|
||||
<meta http-equiv="Content-Type" content=
|
||||
"text/html; charset=utf-8" />
|
||||
|
||||
<title>Алгоритмы шифрования серийных номеров</title>
|
||||
<style type="text/css">
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Алгоритмы шифрования серийных номеров</h1>
|
||||
|
||||
<p>Надежность ключей системы лицензирования основывается на
|
||||
применении асимметричных алгоритмов шифрования. В текущей версии
|
||||
реализован алгоритм RSA с длиной ключа от 1024 до 16384 бит. В
|
||||
будущих версиях планируется добавление других алгоритмов,
|
||||
основанных на ECC, а также схем, совмещающих симметричные и
|
||||
асимметричные шифры.</p>
|
||||
|
||||
<p>Используемый алгоритм уникален для каждого продукта. Ключи,
|
||||
созданные с одним алгоритмом, не подойдут к другому, поэтому
|
||||
смена алгоритмов после создания хоть одной лицензии не
|
||||
допускается. Модуль защиты, располагающийся в защищаемой
|
||||
программе, "знает" каким алгоритмом должен быть зашифрован
|
||||
серийный номер и не примет ключ, созданный другим алгоритмом или
|
||||
тем же алгоритмом, но с другими параметрами (скажем, с другой
|
||||
длиной ключа).</p>
|
||||
|
||||
<h3>Алгоритм RSA</h3>
|
||||
|
||||
<p>Шифрование серийного номера алгоритмом RSA происходит по
|
||||
следующей схеме:</p>
|
||||
|
||||
<ul>
|
||||
<li><strong>Добавление случайных данных в начало
|
||||
номера</strong> - метод основывается на RFC2313, однако
|
||||
реализация немного отличается от описаной там. В начало
|
||||
серийного номера добавляютя байты: 00 02 NN...NN 00, где NN..NN
|
||||
- от 8 до 16 случайных ненулевых байт. Количество байт
|
||||
выбирается случайным, однако принимается во внимание длина
|
||||
серийного номера и максимальная вместительность ключа.</li>
|
||||
|
||||
<li><strong>Добавление случайных данных в конец номера</strong>
|
||||
- окончательное количество байт в серийном номере должно
|
||||
равняться количеству бит в ключах алгоритма, деленному на 8.
|
||||
Серийный номер дополняется до этого числа байт случайными
|
||||
данными. В результате получается следующий формат серийного
|
||||
номера: 00 02 NN..NN 00 DD..DD MM..MM, где NN - набор случайных
|
||||
ненулевых байтов, DD - исходный серийный номер, MM -набор
|
||||
случайных байтов (в т.ч. и нулевых). Суммарная длина
|
||||
последовательности должна равняться количеству бит,
|
||||
применяемому в алгоритме, деленному на 8.</li>
|
||||
|
||||
<li><strong>Шифрование</strong> - производится по стандатной
|
||||
схеме, реализованной во многих библиотеках, работающих с
|
||||
большими числами. Генератор на PHP содержит всю необходимую
|
||||
информацию в открытом виде.</li>
|
||||
|
||||
<li><strong>Упаковка</strong> - полученный после шифрования
|
||||
набор байт кодируется в base-64 - это и есть серийный номер,
|
||||
который отправляется покупателю.</li>
|
||||
</ul><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
121
help/ru/manager/keygen/index.htm
Normal file
@@ -0,0 +1,121 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<link rel="Stylesheet" type="text/css" href=
|
||||
"../../default.css" />
|
||||
<meta http-equiv="Content-Type" content=
|
||||
"text/html; charset=utf-8" />
|
||||
|
||||
<title>Генераторы ключей</title>
|
||||
<style type="text/css">
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Генераторы ключей</h1><strong>Зачем они нужны?</strong>
|
||||
|
||||
<p>Помимо VMProtect, серийные номера могут генерироваться другими
|
||||
программами - генераторами. Это нужно для автоматизации выдачи
|
||||
номеров без участия человека. Покупатель покупает продукт,
|
||||
регистратор делает HTTP-запрос на сайт производителя, там
|
||||
запускается программа-генератор и на основе данных о покупателе
|
||||
формирует серийный номер. Номер отправляется покупателю и
|
||||
производителю. Производитель вносит его в базу VMProtect вручную,
|
||||
через окно импорта лицензий.</p><strong>Принцип работы</strong>
|
||||
|
||||
<p>Система лицензирования VMProtect построена на асимметричных
|
||||
алгоритмах, поэтому для генерации серийных номеров требуется
|
||||
секретный ключ продукта. Этот ключ можно экспортировать в окне
|
||||
свойств продукта и передать программе-генератору подходящим для
|
||||
нее способом.</p>
|
||||
|
||||
<p>Программа-генератор вызывается регистратором через
|
||||
HTTP-запрос. Генератор на PHP может быть вызван напрямую,
|
||||
генератор в виде DLL - косвенно, но алгоритм остается одним и тем
|
||||
же:</p>
|
||||
|
||||
<ul>
|
||||
<li>Получить данные о пользователе от регистратора</li>
|
||||
|
||||
<li>Добавить необходимую информацию, которую указал
|
||||
производитель</li>
|
||||
|
||||
<li>Сформировать серийный номер</li>
|
||||
|
||||
<li>Зашифровать его одним из алгоритмов</li>
|
||||
|
||||
<li>Передать результат регистратору</li>
|
||||
</ul><strong>Существуют ли готовые генераторы?</strong>
|
||||
|
||||
<p>С системой лицензирования поставляется три готовых генератора
|
||||
серийных номеров <a href="keygen_dll.htm">в виде DLL</a>,
|
||||
<a href="keygen_net.htm">для платформы .Net</a> и <a href=
|
||||
"keygen_php.htm">реализованный на PHP</a>.</p><strong>Можно ли
|
||||
сделать свой генератор?</strong>
|
||||
|
||||
<p>Можно. Формат серийного номера находится <a href=
|
||||
"serial_format.htm">здесь</a>, алгоритмы шифрования серийного
|
||||
номера описаны <a href=
|
||||
"algorithms.htm">здесь</a>.</p><strong>Насколько это
|
||||
безопасно?</strong>
|
||||
|
||||
<p>В общем случае - вполне безопасно. Однако есть несколько
|
||||
рекомендаций, которым стоит следовать:</p>
|
||||
|
||||
<ul>
|
||||
<li><strong>Используйте протокол HTTPS</strong> - если ваш
|
||||
регистратор умеет делать запрос по HTTPS, а ваш хостинг
|
||||
позволяет отвечать на такие запросы, то этот вариант
|
||||
предпочтительнее обычного HTTP, т.к. поток данных будет
|
||||
зашифрован и сгенерированный серийный номер сможет получить
|
||||
только регистратор.</li>
|
||||
|
||||
<li><strong>"Спрячьте" генератор</strong> - убедитесь, что
|
||||
генератор нельзя вызвать случайно. Адрес
|
||||
www.site.com/keygen.php - плохая идея. А вот
|
||||
www.site.com/abc123.php - уже лучше. Убедитесь, что на
|
||||
генератор нет внешних ссылок, что он не показывается при
|
||||
просмотре содержимого директории сайта и не помещайте его в
|
||||
служебные файлы типа robots.txt. Чем меньше известно о
|
||||
расположении генератора - тем лучше. Как вариант - можно
|
||||
вынести генератор на другой сайт.</li>
|
||||
|
||||
<li><strong>Убедитесь, что вас вызывает регистратор</strong> -
|
||||
в программе, обрабатывающей запрос от регистратора, необходимо
|
||||
проверить IP-адрес вызывающей стороны. Обычно регистраторы
|
||||
публикуют список адресов, с которых они могут вызвать
|
||||
генератор. Найдите такой у вашего регистратора и добавьте
|
||||
проверку. В случае несовпадения адреса, лучше не выдавать
|
||||
понятных ошибок. Не возвращайте ничего или верните ошибку 404.
|
||||
Не давайте повода понять, почему вызов оказался неудачен.</li>
|
||||
|
||||
<li><strong>Проверяйте входные параметры</strong> - в
|
||||
настройках продукта у регистратора обычно дается возможность
|
||||
указать строку запроса, который регистратор будет делать для
|
||||
получения лицензии. Скажем, вы хотите получать имя
|
||||
пользователя, адрес его электронной почты, дату продажи и номер
|
||||
заказа. Убедитесь при получении запроса, что все параметры
|
||||
переданы и что все они имеют корректный формат. Не отвечайте на
|
||||
запросы с ошибками. О любых ошибках уведомляйте себя отправкой
|
||||
e-mail со всеми параметрами, с которыми был вызван генератор.
|
||||
Это поможет разобраться в причинах проблемы.</li>
|
||||
|
||||
<li><strong>Добавьте "пароль"</strong> - укажите в запросе,
|
||||
посылаемом регистратором, дополнительный параметр - пароль. С
|
||||
неочевидным именем и значением. Проверяйте его на принимающей
|
||||
стороне. В случае несовпадения или отсутствия - не генерируйте
|
||||
номер.</li>
|
||||
</ul><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
284
help/ru/manager/keygen/keygen_dll.htm
Normal file
@@ -0,0 +1,284 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<link rel="Stylesheet" type="text/css" href=
|
||||
"../../default.css" />
|
||||
<meta http-equiv="Content-Type" content=
|
||||
"text/html; charset=utf-8" />
|
||||
|
||||
<title>Генератор ключей: Windows-версия</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Генераторы ключей: Windows-версия</h1>
|
||||
|
||||
<h3>Описание</h3>
|
||||
|
||||
<p>Генератор для Windows представляет собой DLL-файлы для
|
||||
платформ x86 и x64, заголовочный файл языка C и lib-файл,
|
||||
совместимый с MSVC. Таким образом, библиотека может быть как слинкована статически, так
|
||||
и загружаться динамически.</p>
|
||||
|
||||
<p>Все файлы генератора находятся в каталоге
|
||||
<strong>Keygen\DLL</strong>, там же находится тестовое
|
||||
приложение, которое генерирует серийные номера.</p>
|
||||
|
||||
<h3>API генератора</h3>
|
||||
|
||||
<p>Генератор экспортирует всего две функции: одна непосредственно
|
||||
генерирует серийный номер, вторая - освобождает память,
|
||||
выделенную первой. Начнем с первой и основной функции:</p>
|
||||
<pre class="code"><strong>VMProtectErrors</strong> __stdcall <strong>VMProtectGenerateSerialNumber</strong>(
|
||||
<strong>VMProtectProductInfo *</strong> pProductInfo,
|
||||
<strong>VMProtectSerialNumberInfo *</strong> pSerialInfo,
|
||||
<strong>char **</strong> pSerialNumber
|
||||
);
|
||||
</pre>
|
||||
|
||||
<p>Первый параметр - указатель на структуру
|
||||
<strong>VMProtectProductInfo</strong>, содержимое которой
|
||||
выгружается в VMProtect (см. <a href=
|
||||
"../licenses.htm#export">Экспорт параметров продукта</a>).
|
||||
Структура содержит приватный ключ продукта, используемый алгоритм
|
||||
и количество бит, а также идентификатор продукта. Подробнее о
|
||||
заполнении этой структуры написано ниже.</p>
|
||||
|
||||
<p>Второй параметр - указатель на структуру
|
||||
<strong>VMProtectSerialNumberInfo</strong>, содержимое которой
|
||||
переносится в генерируемый серийный номер. Структура содержит все
|
||||
поля серийного номера, а также битовую маску, определяющую какие
|
||||
именно поля должны быть записаны в серийный номер.</p>
|
||||
<pre class="code">struct <strong>VMProtectSerialNumberInfo</strong>
|
||||
{
|
||||
<strong>INT</strong> flags;
|
||||
<strong>wchar_t *</strong> pUserName;
|
||||
<strong>wchar_t *</strong> pEMail;
|
||||
<strong>DWORD</strong> dwExpDate;
|
||||
<strong>DWORD</strong> dwMaxBuildDate;
|
||||
<strong>BYTE</strong> nRunningTimeLimit;
|
||||
<strong>char *</strong> pHardwareID;
|
||||
<strong>size_t</strong> nUserDataLength;
|
||||
<strong>BYTE *</strong> pUserData;
|
||||
};
|
||||
</pre>
|
||||
|
||||
<p>Поле <strong>flags</strong> содержит битовые флаги из набора
|
||||
<strong>VMProtectSerialNumberFlags</strong>, описанного перед
|
||||
структурой:</p>
|
||||
|
||||
<ul>
|
||||
<li><strong>HAS_USER_NAME</strong> - поместить в серийный номер
|
||||
имя пользователя, находящееся в переменной
|
||||
<strong>pUserName</strong>.</li>
|
||||
|
||||
<li><strong>HAS_EMAIL</strong> - поместить в серийный номер
|
||||
e-mail пользователя, находящийся в переменной
|
||||
<strong>pEMail</strong>.</li>
|
||||
|
||||
<li><strong>HAS_EXP_DATE</strong> - серийный номер перестанет
|
||||
действовать поле окончания дня, указанного в переменной
|
||||
<strong>dwExpDate</strong>.</li>
|
||||
|
||||
<li><strong>HAS_MAX_BUILD_DATE</strong> - серийный номер будет
|
||||
подходить только к версиям продукта, созданным до даты,
|
||||
указанной в переменной <strong>dwMaxBuildDate</strong>.</li>
|
||||
|
||||
<li><strong>HAS_TIME_LIMIT</strong> - программа перестанет
|
||||
работать по истечении времени, указанного в переменной
|
||||
<strong>nRunningTimeLimit</strong> (время указывается в минутах
|
||||
и не может превышать 255).</li>
|
||||
|
||||
<li><strong>HAS_HARDWARE_ID</strong> - программа будет работать
|
||||
только на оборудовании с идентификатором, указанным в
|
||||
переменной <strong>pHardwareID</strong>.</li>
|
||||
|
||||
<li><strong>HAS_USER_DATA</strong> - поместить в серийный номер
|
||||
пользовательские данные длинной
|
||||
<strong>nUserDataLength</strong>, расположенные по адресу,
|
||||
указанному в переменной <strong>pUserData</strong>.</li>
|
||||
</ul>
|
||||
|
||||
<p>Третий параметр - указатель на указатель. Туда будет записан
|
||||
адрес сгенерированного серийного номера. После генерации номер
|
||||
необходимо скопировать, а адрес передать во вторую функцию API
|
||||
генератора, которая освободит занимаемую серийным номером
|
||||
память.</p>
|
||||
<pre class="code"><strong>void</strong> __stdcall <strong>VMProtectFreeSerialNumberMemory</strong>(<strong>char *</strong> pSerialNumber);
|
||||
</pre>
|
||||
|
||||
<p>Функция <strong>VMProtectGenerateSerialNumber</strong>
|
||||
возвращает значение типа <strong>VMProtectErrors</strong>,
|
||||
содержащее 0 в случае успешной генерации номера или код ошибки в
|
||||
противном случае. Возможны следующие коды ошибок:</p>
|
||||
|
||||
<ul>
|
||||
<li><strong>ALL_RIGHT</strong> - ошибок нет, номер сгенерирован
|
||||
успешно.</li>
|
||||
|
||||
<li><strong>UNSUPPORTED_ALGORITHM</strong> - в первом параметре
|
||||
функции передан некорректный алгоритм шифрования ключа.</li>
|
||||
|
||||
<li><strong>UNSUPPORTED_NUMBER_OF_BITS</strong> - в первом
|
||||
параметре функции передано некорректное количество бит в
|
||||
ключе.</li>
|
||||
|
||||
<li><strong>USER_NAME_IS_TOO_LONG</strong> - длина имени
|
||||
пользователя в кодировке UTF-8 превысила 255 байт.</li>
|
||||
|
||||
<li><strong>EMAIL_IS_TOO_LONG</strong> - длина e-mail
|
||||
пользователя в кодировке UTF-8 превысила 255 байт.</li>
|
||||
|
||||
<li><strong>USER_DATA_IS_TOO_LONG</strong> - длина
|
||||
пользовательских данных превышает 255 байт.</li>
|
||||
|
||||
<li><strong>HWID_HAS_BAD_SIZE</strong> - идентификатор
|
||||
оборудования имеет некорректный размер.</li>
|
||||
|
||||
<li><strong>PRODUCT_CODE_HAS_BAD_SIZE</strong> - идентификатор
|
||||
продукта, переданный в первом параметре функции, имеет неверный
|
||||
размер.</li>
|
||||
|
||||
<li><strong>SERIAL_NUMBER_TOO_LONG</strong> - серийный номер
|
||||
слишком длинный и не помещается в указанное в алгоритме количество
|
||||
бит.</li>
|
||||
|
||||
<li><strong>BAD_PRODUCT_INFO</strong> - первый параметр функции
|
||||
некорректен или NULL.</li>
|
||||
|
||||
<li><strong>BAD_SERIAL_NUMBER_INFO</strong> - второй параметр
|
||||
функции некорректен или NULL.</li>
|
||||
|
||||
<li><strong>BAD_SERIAL_NUMBER_CONTAINER</strong> - третий
|
||||
параметр функции не указывает на ячейку памяти для записи
|
||||
адреса серийного номера.</li>
|
||||
|
||||
<li><strong>NOT_EMPTY_SERIAL_NUMBER_CONTAINER</strong> - третий
|
||||
параметр функции не указывает на пустую ячейку, в ячейке должно
|
||||
быть значение NULL.</li>
|
||||
|
||||
<li><strong>BAD_PRIVATE_EXPONENT</strong> - значение приватной
|
||||
экспоненты в первом параметре функции некорректно.</li>
|
||||
|
||||
<li><strong>BAD_MODULUS</strong> - значение модуля в первом
|
||||
параметре функции некорректно.</li>
|
||||
</ul>
|
||||
|
||||
<p>Ошибки делятся на две категории: те, что связаны с
|
||||
некорректными параметрами или с содержимым первого параметра
|
||||
функции, и все остальные. Ошибки первой категории редки и
|
||||
являются признаком некорректной настройки структуры. Имеет смысл
|
||||
выгрузить информацию о продукте повторно и убедиться, что
|
||||
структура заполняется правильно. Пример правильного заполнения
|
||||
приведен ниже.</p>
|
||||
|
||||
<p>Ошибки второй категории связаны с попыткой вместить в ключ
|
||||
больше данных, чем это возможно ввиду его размера. В таком случае
|
||||
разумно будет отправить регистратору вместо ключа текст "Ключ
|
||||
будет выслан в течение суток", а всю необходимую информацию
|
||||
отправить себе по почте. Ключ в таком случае генерируется в
|
||||
VMProtect в ручном режиме, какие-то данные обрезаются, чтобы
|
||||
уместить все необходимое в максимальный размер
|
||||
ключа.</p>
|
||||
|
||||
<h3>Пример использования</h3>
|
||||
|
||||
<p>Ниже приведен пример кода, который вызывает две вышеописанные
|
||||
функции и генерирует серийный номер. Обратите внимание на блок
|
||||
кода, расположенный в самом начале. Пример не будет работать пока
|
||||
вы не замените его на блок, выгруженный для продукта из
|
||||
VMProtect:</p>
|
||||
<pre class="code">//////////////////////////////////////////////////////////////////////////
|
||||
// !!! this block should be generated by VMProtect !!! ///
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
<strong>VMProtectAlgorithms</strong> g_Algorithm = ALGORITHM_RSA;
|
||||
<strong>size_t</strong> g_nBits = 0;
|
||||
<strong>byte</strong> g_vModulus[1];
|
||||
<strong>byte</strong> g_vPrivate[1];
|
||||
<strong>byte</strong> g_vProductCode[1];
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
<strong>int</strong> _tmain(<strong>int</strong> argc, <strong>_TCHAR*</strong> argv[])
|
||||
{
|
||||
<strong>VMProtectProductInfo</strong> pi;
|
||||
pi.algorithm = g_Algorithm;
|
||||
pi.nBits = g_nBits;
|
||||
pi.nModulusSize = sizeof(g_vModulus);
|
||||
pi.pModulus = g_vModulus;
|
||||
pi.nPrivateSize = sizeof(g_vPrivate);
|
||||
pi.pPrivate = g_vPrivate;
|
||||
pi.nProductCodeSize = sizeof(g_vProductCode);
|
||||
pi.pProductCode = g_vProductCode;
|
||||
|
||||
<strong>VMProtectSerialNumberInfo</strong> si = {0};
|
||||
si.flags = HAS_USER_NAME | HAS_EMAIL;
|
||||
si.pUserName = L"John Doe";
|
||||
si.pEMail = L"john@doe.com";
|
||||
<strong>char *</strong> pBuf = NULL;
|
||||
<strong>VMProtectErrors</strong> res = <strong>VMProtectGenerateSerialNumber</strong>(&pi, &si, &pBuf);
|
||||
<strong>if</strong> (res == ALL_RIGHT)
|
||||
{
|
||||
<strong>printf</strong>("Serial number:\n%s\n", pBuf);
|
||||
<strong>VMProtectFreeSerialNumberMemory</strong>(pBuf);
|
||||
}
|
||||
else
|
||||
{
|
||||
<strong>printf</strong>("Error: %d\n", res);
|
||||
}
|
||||
|
||||
<strong>return</strong> 0;
|
||||
}
|
||||
</pre>
|
||||
|
||||
<p>Этот пример с проектом для Microsoft Visual Studio находится в
|
||||
каталоге <strong>Keygen\DLL\Example</strong>, ниже будут описаны
|
||||
наиболее интересные места кода.</p>
|
||||
|
||||
<p>Первые строчки функции <strong>main</strong> заполняют
|
||||
структуру <strong>VMProtectProductInfo</strong> данными,
|
||||
выгруженными из VMProtect. Этот код стандартен, его не следует
|
||||
менять во избежание появления ошибок. Далее создается структура
|
||||
<strong>VMProtectSerialNumberInfo</strong>, в поле флагов
|
||||
выставляется комбинация из битов имени пользователя и e-mail.
|
||||
Строчкой ниже в соответствующие поля структуры заносятся значения
|
||||
имени пользователя и пароля. Обратите внимание, что значения
|
||||
принимаются в кодировке UNICODE. Генератор ключей внутри
|
||||
преобразует их в кодировку UTF-8.</p>
|
||||
|
||||
<p>Далее описывается переменная-указатель, куда будет записан
|
||||
адрес сгенерированного ключа, и вызывается функция
|
||||
<strong>VMProtectGenerateSerialNumber</strong>, после чего
|
||||
анализируется код возврата. Если ошибок нет, то сгенерированный
|
||||
номер печатается на консоль и вызывается функция осовобождения
|
||||
памяти.</p>
|
||||
|
||||
<h3>Остальные поля структуры VMprotectSerialNumberInfo</h3>
|
||||
|
||||
<p>Некоторые поля структуры требуют дополнительных поясненений. К
|
||||
примеру, поля <strong>dwExpDate</strong> и
|
||||
<strong>dwMaxBuildDate</strong> содержат даты в определенном
|
||||
формате: <strong>0xYYYYMMDD</strong>, т.е. год хранится в старшем
|
||||
слове, а месяц и день в старшем и младшем байтах младшего слова.
|
||||
Для формирования такого числа описан макрос <strong>MAKEDATE(y,
|
||||
m, d)</strong>, который можно вызвать так: <strong>MAKEDATE(2010,
|
||||
05, 12)</strong>.</p>
|
||||
|
||||
<p>В поле <strong>pHardwareID</strong> должен быть записан
|
||||
указатель на строку, которую вернул метод
|
||||
<strong>VMProtectGetCurrentHWID</strong> из SDK
|
||||
лицензирования.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
115
help/ru/manager/keygen/keygen_net.htm
Normal file
@@ -0,0 +1,115 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<link rel="Stylesheet" type="text/css" href=
|
||||
"../../default.css" />
|
||||
<meta http-equiv="Content-Type" content=
|
||||
"text/html; charset=utf-8" />
|
||||
|
||||
<title>Генератор ключей: .Net-версия</title>
|
||||
<style type="text/css">
|
||||
/*<![CDATA[*/
|
||||
div.c2 {text-align: center}
|
||||
p.c1 {color:red;}
|
||||
/*]]>*/
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Генераторы ключей: .Net-версия</h1>
|
||||
|
||||
<h3>Описание</h3>
|
||||
|
||||
<p>.Net-версия генератора ключей преставляет собой сборку,
|
||||
содержащую все необходимое для генерации серийных номеров.
|
||||
Исходные коды находятся в каталоге <strong>Keygen\Net</strong> в
|
||||
виде двух проектов: KeyGen (непосредственно генератор серийных
|
||||
номеров) и Usage (пример использования генератора).</p>
|
||||
|
||||
<p class="c1">Генератор поставляется в исходных кодах, чтобы
|
||||
иметь возможность пересобрать его под нужную версию .Net
|
||||
Framework, однако крайне не рекомендуется вносить изменения в его
|
||||
код. В будущих версиях VMProtect возможно добавление новых
|
||||
возможностей в генератор, что приведет к необходимости повторной
|
||||
модификации кода. Также возможно появление трудноуловимых ошибок.
|
||||
В случае нахождения ошибки в оригинальном коде генератора или
|
||||
пожеланий по его улучшению - обращайтесь в службу
|
||||
поддержки.</p>
|
||||
|
||||
<h3>Использование генератора</h3>
|
||||
|
||||
<p>Возьмите за основу код из проекта <strong>Usage</strong>,
|
||||
добавьте в Ваш проект ссылку на сборку VMProtect.KeyGen.dll,
|
||||
после чего Вы сможете генерировать серийные номера в вашем
|
||||
приложении. Для нормальной работы генератор должен понимать,
|
||||
к какому продукту Вы собираетесь генерировать серийные номера.
|
||||
Для этого на закладке "Лицензии" VMProtect нажмите кнопку
|
||||
«Экспорт» и в выпадающем списке выберите «Параметры для
|
||||
KeyGen.Net». В текстовом поле ниже появятся несколько строк
|
||||
текста, которые необходимо скопировать и перенести в Ваше
|
||||
приложение в виде строковой константы.</p>
|
||||
|
||||
<p>Пример вызова генератора представлен ниже:</p>
|
||||
<pre>
|
||||
try
|
||||
{
|
||||
string data = @""; // put the exported data here
|
||||
Generator g = new Generator(data);
|
||||
g.UserName = "John Doe";
|
||||
g.EMail = "john@doe.com";
|
||||
g.ExpirationDate = DateTime.Now.AddMonths(1);
|
||||
g.MaxBuildDate = DateTime.Now.AddYears(1);
|
||||
g.RunningTimeLimit = 15;
|
||||
g.HardwareID = "AQIDBAgHBgU=";
|
||||
g.UserData = new byte[] { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
|
||||
string serial = g.Generate();
|
||||
Console.WriteLine("Serial number:\n{0}\n", serial);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine("Error: {0}", ex);
|
||||
}
|
||||
|
||||
</pre>
|
||||
|
||||
<p>Строку, скопированную в окне экспорта VMProtect, необходимо
|
||||
поместить в переменную <strong>data</strong>, которая будет
|
||||
передана параметром в конструктор класса генератора серийных
|
||||
номеров. В случае каких-либо проблем с разбором данных продукта,
|
||||
конструктор выбросит исключение с описанием проблемы. Если
|
||||
конструктор отработал успешно, то генератор готов к созданию
|
||||
серийных номеров.</p>
|
||||
|
||||
<p>Серийный номер может содержать различную информацию, которая
|
||||
задается через свойства генератора. Пример выше показывает, как
|
||||
заполнить абсолютно все поля серийного номера. Отдельные поля
|
||||
имеют ограничения. Например, поля <strong>User Name</strong> и
|
||||
<strong>E-Mail</strong> не могут принять строки, которые в
|
||||
кодировке UTF-8 будут иметь длину, превышающую 255 символов. В
|
||||
случае подачи некорректных данных, свойства выбрасывают исключения с
|
||||
описанием проблемы.</p>
|
||||
|
||||
<p>По окончании настройки генератора вызывается метод
|
||||
<strong>Generate()</strong>, который и создает серийный номер. На
|
||||
этом этапе происходит компоновка всех данных номера, подсчет
|
||||
контрольных сумм и, непосредственно, шифрование. В случае, если
|
||||
объем данных превышает максимально допустимую длину, метод выбросит
|
||||
исключение.</p>
|
||||
|
||||
<p>В случае, если необходимо сгенерировать несколько серийных
|
||||
номеров, можно использовать класс генератора несколько раз, не
|
||||
пересоздавая его. Чтобы "очистить" любое из свойств генератора,
|
||||
ему нужно присвоить значение <strong>null</strong>.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
143
help/ru/manager/keygen/keygen_php.htm
Normal file
@@ -0,0 +1,143 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<link rel="Stylesheet" type="text/css" href=
|
||||
"../../default.css" />
|
||||
<meta http-equiv="Content-Type" content=
|
||||
"text/html; charset=utf-8" />
|
||||
|
||||
<title>Генератор ключей: UNIX-версия</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Генераторы ключей: UNIX-версия</h1>
|
||||
|
||||
<h3>Описание</h3>
|
||||
|
||||
<p>UNIX-версия генератора ключей преставляет собой PHP-файл,
|
||||
содержащий все необходимое для генерации серийных номеров. Файл
|
||||
находится в каталоге <strong>Keygen\PHP</strong>, ниже
|
||||
рассмотрены основные моменты его
|
||||
использования.</p>
|
||||
|
||||
<h3>Настройка генератора</h3>
|
||||
|
||||
<p>В самом начале PHP-файла располагается код настройки
|
||||
генератора:</p>
|
||||
<pre class="code">//////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// The following lines should be generated by VMProtect License Manager
|
||||
$exported_algorithm = "RSA";
|
||||
$exported_bits = 2048;
|
||||
$exported_private = "PJvj4kEpoQMIpYK+9wEt......xKeiSZgzdiln8Q==";
|
||||
$exported_modulus = "rOlny/3QgZb/VmGr3CmY......I6ESAUmtQ+RBqQ==";
|
||||
$exported_product_code = "oLQdGUn8kVk=";
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////
|
||||
</pre>
|
||||
|
||||
<p>Этот код генерируется автоматически в VMProtect (см. <a href=
|
||||
"../licenses.htm#export">Экспорт параметров продукта</a>) и
|
||||
уникален для каждого конкретного продукта. Очень важно
|
||||
скопировать его без ошибок, в противном случае генератор будет
|
||||
работать некорректно.</p><strong>Содержимое ключа</strong>
|
||||
|
||||
<p>Далее в генераторе задается содержимое серийного номера.
|
||||
Содержимое задается массивом, ниже задаются все возможные
|
||||
параметры ключа, однако в реальных условиях часть из них может
|
||||
отсутствовать:</p>
|
||||
<pre class="code">$params = <strong>array</strong>(
|
||||
user_name => "John Doe", // UTF-8!
|
||||
email => "john@doe.com",
|
||||
hwid => "vHGMdMRvGCPjWcCQ", // Exactly as returned by VMProtectGetCurrentHWID
|
||||
expire_date => <strong>array</strong>(year => 2009, month => 10, day => 1),
|
||||
maxbuild_date => <strong>array</strong>(year => 2009, month => 10, day => 1),
|
||||
time_limit => 10,
|
||||
user_data => <strong>base64_decode</strong>("CGCvRvMWcPHGdMjQ"), // string of bytes
|
||||
);
|
||||
</pre>
|
||||
|
||||
<h3>Функция обработки успешной генерации</h3>
|
||||
|
||||
<p>Ниже расположена простейшая реализация функции, которая
|
||||
вызывается при успешной генерации серийного номера. Единственным
|
||||
параметром она получает строку с номером. Функция должна передать
|
||||
номер вызывающей стороне (регистратору), обычно это делается при
|
||||
помощи команды <strong>echo</strong>. Предварительно строка
|
||||
разбивается на подстроки длиной 75 символов для удобства. Также
|
||||
эта функция может отправлять сгенерированный номер по почте
|
||||
производителю программы или заносить его в базу данных.</p>
|
||||
<pre class="code">function <strong>OnSerialGenerated</strong>($serial)
|
||||
{
|
||||
$serial = <strong>wordwrap</strong>($serial, 75, "\n", true);
|
||||
<strong>echo</strong> $serial;
|
||||
}
|
||||
</pre>
|
||||
|
||||
<h3>Функция обработки ошибок генерации</h3>
|
||||
|
||||
<p>Последний участок кода, требующий внимания - это функция,
|
||||
которая вызывается в случае возникновения проблем. Функция
|
||||
получает в виде параметра строку с текстом ошибки, а после ее
|
||||
завершения вызывается функция <strong>die()</strong>. Функция
|
||||
должна сделать две вещи: вернуть регистратору вместо ключа текст
|
||||
о том, что ключ будет выслан вручную, а также выслать
|
||||
производителю программы всю необходимую информацию для устранения
|
||||
ошибки и ручной генерации ключа.</p>
|
||||
<pre class="code">function <strong>OnSerialGenerationFailed</strong>($details)
|
||||
{
|
||||
<strong>echo</strong> "You will receive serial number in the next 24 hours"; // message to the customer
|
||||
// mail("support@vendor.com", "Houston, we have a problem", $details); // message to vendor
|
||||
}
|
||||
</pre>
|
||||
|
||||
<p>Причин возникновения ошибки может быть несколько: некорректные
|
||||
параметры алгоритма, некорректные параметры ключа, слишком
|
||||
длинное имя пользователя или e-mail. Слишком длинный серийный
|
||||
номер, который не влезает в количество бит, указанное в
|
||||
алгоритме. Поэтому функция
|
||||
<strong>OnSerialGenerationFailed</strong> должна отправить
|
||||
производителю максимально подробную информацию о случившемся,
|
||||
дабы тот мог вручную сгенерировать серийный номер и отправить его
|
||||
покупателю.</p>
|
||||
|
||||
<h3>На что еще следует обратить внимание</h3>
|
||||
|
||||
<p>Генератор ключей в примерах максимально упрощен. Он не
|
||||
учитывает рекомендации по разработке веб-генераторов, данные
|
||||
<a href="index.htm">здесь</a>. Он не проверяет IP-адрес
|
||||
вызывающей стороны и не анализирует входные параметры. Имейте это
|
||||
в виду, когда будете создавать свой собственный генератор на
|
||||
основе этого.</p>
|
||||
|
||||
<p>Имя пользователя и e-mail должны быть переданы в кодировке
|
||||
UTF-8. Уточните у вашего регистратора, в какой кодировке он
|
||||
передает информацию о покупателе и, при необходимости, проведите
|
||||
конвертацию. Неправильная кодировка не приведет к
|
||||
неработоспособности серийного номера, однако номер будет
|
||||
содержать совершенно другое имя пользователя и он может быть
|
||||
удивлен, если вы показываете его, скажем, в окне "О
|
||||
Программе".</p>
|
||||
|
||||
<p>Асимметричное шифрование - достаточно сложный в математическом
|
||||
плане процесс. Если он реализован на чистом PHP, без применения
|
||||
сторонних библиотек, то генерация серийного номера может занять
|
||||
десятки секунд. Генератор использует функции
|
||||
<strong>gmp_powm</strong>, <strong>bi_powmod</strong>,
|
||||
<strong>bcpowod</strong> в случае их наличия. Все эти функции
|
||||
имеют разную скорость. Если генерация ключей на вашем хостинге
|
||||
занимает слишком большое время, рекомендуется пообщаться со
|
||||
службой поддержки на предмет подключения описаных выше функций. К
|
||||
примеру, функция <strong>gmp_powm</strong> работает в десятки раз быстрее
|
||||
функции <strong>bcpowmod</strong>.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
260
help/ru/manager/keygen/serial_format.htm
Normal file
@@ -0,0 +1,260 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<link rel="Stylesheet" type="text/css" href=
|
||||
"../../default.css" />
|
||||
<meta http-equiv="Content-Type" content=
|
||||
"text/html; charset=utf-8" />
|
||||
|
||||
<title>Формат серийного номера</title>
|
||||
<style type="text/css">
|
||||
/*<![CDATA[*/
|
||||
th {text-align:left;}
|
||||
table {border-collapse:collapse; margin-top: 4px;}
|
||||
td,th {border: 1px solid #B0B0B0; padding-left:10;padding-right:10;}
|
||||
/*]]>*/
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Формат серийного номера</h1>
|
||||
|
||||
<h3>Структура серийного номера</h3>
|
||||
|
||||
<p>Серийный номер состоит из блоков. Каждый блок
|
||||
начинается с байта идентификатора, который определяет его
|
||||
содержимое и, возможно, длину. Последним всегда идет блок с
|
||||
идентификатором 255, содержащий контрольную сумму всего серийного
|
||||
номера, за исключением последнего блока.</p>
|
||||
|
||||
<p>В зависимости от типа блока, он может иметь фиксированную или
|
||||
переменную длину. Во втором случае обычно длина идет в следующем
|
||||
за идентификатором блока байте. Подробно формат каждого блока
|
||||
описан ниже.</p>
|
||||
|
||||
<h3>Формат блоков</h3>
|
||||
|
||||
<table border="1" cellspacing="0" cellpadding="2">
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
|
||||
<th>Название</th>
|
||||
|
||||
<th>Размер (байт)</th>
|
||||
|
||||
<th>Описание</th>
|
||||
|
||||
<th>Пример</th>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>0x01</td>
|
||||
|
||||
<td>Версия</td>
|
||||
|
||||
<td>1</td>
|
||||
|
||||
<td>Блок содержит версию серийного номера размером в 1 байт.
|
||||
Версия должна быть равна 1.</td>
|
||||
|
||||
<td>01 01</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>0x02</td>
|
||||
|
||||
<td>Имя пользователя</td>
|
||||
|
||||
<td>1 + N</td>
|
||||
|
||||
<td>Блок содержит имя пользователя в кодировке UTF-8. Перед
|
||||
именем пользователя располагается 1 байт длины имени. Таким
|
||||
образом, длина имени пользователя не может превышать 255
|
||||
байт. Завершающий 0 не требуется.</td>
|
||||
|
||||
<td>02 04 4A 5F 48 4E</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>0x03</td>
|
||||
|
||||
<td>E-Mail</td>
|
||||
|
||||
<td>1 + N</td>
|
||||
|
||||
<td>Блок содержит e-mail пользователя в кодировке UTF-8.
|
||||
Перед e-mail'ом располагается 1 байт длины. Таким образом,
|
||||
длина e-mail не может превышать 255 байт. Завершающий 0 не
|
||||
требуется.</td>
|
||||
|
||||
<td>03 07 61 40 62 2E 63 6F 6D</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>0x04</td>
|
||||
|
||||
<td>Идентификатор оборудования</td>
|
||||
|
||||
<td>1 + N</td>
|
||||
|
||||
<td>Блок содержит идентификатор оборудования, возвращенный
|
||||
функцией <strong>VMProtectGetCurrentHWID()</strong>. Функция
|
||||
возвращает строку в кодировке base-64, в серийный номер
|
||||
помещается раскодированный вариант строки. Длина блока данных
|
||||
должна быть кратна 4. Перед блоком данных располагается байт
|
||||
длины. Максимальная длина блока - 32 байта.</td>
|
||||
|
||||
<td>04 08 E1 E2 E3 E4 A1 A2 A3 A4</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>0x05</td>
|
||||
|
||||
<td>Дата окончания лицензии</td>
|
||||
|
||||
<td>4</td>
|
||||
|
||||
<td>Блок содержит дату окончания действия серийного номера.
|
||||
Формат хранения даты описан ниже.</td>
|
||||
|
||||
<td>05 01 0A 07 DA</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>0x06</td>
|
||||
|
||||
<td>Максимальное время работы</td>
|
||||
|
||||
<td>1</td>
|
||||
|
||||
<td>Блок содержит 1 байт с временем работы программы в
|
||||
минутах. Максимальное время работы, таким образом, может
|
||||
составлять 255 минут.</td>
|
||||
|
||||
<td>06 05</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>0x07</td>
|
||||
|
||||
<td>Код продукта</td>
|
||||
|
||||
<td>8</td>
|
||||
|
||||
<td>Блок содержит код продукта - 8 байт, которые создаются
|
||||
VMProtect и выгружаются при экспорте параметров продукта.
|
||||
Выгружаются они в кодировке base-64, перед помещением в
|
||||
серийный номер строку необходимо преобразовать в массив байт.
|
||||
Размер массива должен быть строго равен 8 байтам.
|
||||
<strong>Этот блок является обязательным, без него защищенная
|
||||
программа будет работать некорректно!</strong></td>
|
||||
|
||||
<td>07 01 02 03 04 05 06 07 08</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>0x08</td>
|
||||
|
||||
<td>Данные пользователя</td>
|
||||
|
||||
<td>1 + N</td>
|
||||
|
||||
<td>Блок содержит до 255 байт пользовательских данных.
|
||||
Система лицензирования не анализирует эти данные и возвращает
|
||||
их при вызове функции
|
||||
<strong>VMProtectGetSerialNumberData()</strong>. Перед блоком
|
||||
данных располагается байт, содержащий размер пользовательских
|
||||
данных.</td>
|
||||
|
||||
<td>08 05 01 02 03 04 05</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>0x09</td>
|
||||
|
||||
<td>Максимальная дата сборки</td>
|
||||
|
||||
<td>4</td>
|
||||
|
||||
<td>Блок содержит максимальную дату сборки приложения, с
|
||||
которым будет работать этот серийный номер. Формат хранения
|
||||
даты описан ниже.</td>
|
||||
|
||||
<td>09 01 0A 07 DA</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>0xFF</td>
|
||||
|
||||
<td>Контрольная сумма</td>
|
||||
|
||||
<td>4</td>
|
||||
|
||||
<td>Блок содержит контрольную сумму серийного номера. Блок
|
||||
располагается последним и контрольная сумма считается для
|
||||
всех блоков, идущих перед этим. Подробнее о расчете
|
||||
контрольной суммы написано ниже.</td>
|
||||
|
||||
<td>FF 01 02 03 04</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<h3>Формат хранения даты</h3>
|
||||
|
||||
<p>Даты в серийном номере хранятся в виде двойного слова -
|
||||
0xYYYYMMDD. Старшее слово содержит год, а младшее - день и месяц.
|
||||
Байты расположены в порядке Little Endian - от младшего к
|
||||
старшему. В случае, если имеется указатель на первый байт записи,
|
||||
то дата может быть считана и записана следующим кодом:</p>
|
||||
<pre class="code"><strong>byte *</strong>pDate = 0xNNNNNN; // адрес даты
|
||||
<strong>*</strong>(<strong>DWORD *</strong>)pDate = (2010 << 16) | (10 << 8) | 1; // October 1, 2010
|
||||
<strong>DWORD</strong> dwExp = *(<strong>DWORD *</strong>)pDate;
|
||||
</pre>
|
||||
|
||||
<h3>Подсчет контрольной суммы</h3>
|
||||
|
||||
<p>Контрольная сумма серийного номера вычисляется при помощи
|
||||
алгоритма хеширования SHA-1. Результатом работы алгоритма
|
||||
являются пять 32-битных слов. Первое слово используется в
|
||||
качестве контрольной суммы серийного номера. <strong>Обратите
|
||||
внимание:</strong> слово записывается в формате Little Endian (от
|
||||
младшего байта к старшему). В строковом представлении хеша SHA-1
|
||||
используется формат Big Endian - числа записываются от старшего
|
||||
байта к младшему, поэтому если SHA-1 генерируется функцией,
|
||||
которая возвращает строку (как в PHP), то первые четыре байта
|
||||
хеша необходимо предварительно
|
||||
развернуть.</p>
|
||||
|
||||
<h3>Дополнительная информация</h3>
|
||||
|
||||
<p>Блоки с номерами, отличными от описанных выше, игнорируются
|
||||
системой лицензирования. Возможно появление новых блоков в
|
||||
будущих версиях. <strong>Не рекомендуется создавать свои блоки,
|
||||
используя свободные идентификаторы!</strong> Во-первых, это может
|
||||
привести к неработоспособности ключа с новыми версиями системы
|
||||
лицензирования. А во-вторых, защищаемая программа все равно не
|
||||
сможет прочитать значения этих блоков. Для хранения какой-либо
|
||||
информации в ключе нужно использовать поле <strong>User
|
||||
Data</strong>, которое предназначено именно для этого.</p>
|
||||
|
||||
<p>Серийный номер не содержит "соли" (SALT) - случайной
|
||||
информации, предназначенной для того, чтобы ключи для одних и тех
|
||||
же данных получались разными. Эта задача возлагается на алгоритм
|
||||
шифрования. Если необходимы отличия на уровне серийных номеров,
|
||||
скажем для серии ключей, проданных в организацию, можно записать
|
||||
номер ключа строкой в поле имени пользователя (ООО "Компания",
|
||||
ключ 1 из 10) или занести эту информацию в поле <strong>User
|
||||
Data</strong> в любом удобном для разработчика формате.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
112
help/ru/manager/licenses.htm
Normal file
@@ -0,0 +1,112 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<link rel="Stylesheet" type="text/css" href="../default.css" />
|
||||
<meta http-equiv="Content-Type" content=
|
||||
"text/html; charset=utf-8" />
|
||||
|
||||
<title>Управление лицензиями</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Управление лицензиями</h1>
|
||||
|
||||
<h3>Инициализация</h3>
|
||||
|
||||
<p>По умолчанию функции лицензирования выключены. Чтобы включить
|
||||
их, нужно перейти в секцию "Лицензии" раздела "Проект" и создать пару ключей. В
|
||||
случае, если проект ссылается на базу данных менеджера лицензий
|
||||
(в старых версиях VMProtect лицензии управлялись отдельной
|
||||
программой), то будет предложено импортировать эти лицензии в
|
||||
проект. По окончании инициализации будут доступны опции привязки
|
||||
кода к серийному номеру, а также появится возможность создавать и
|
||||
обрабатывать серийные номера.</p>
|
||||
|
||||
<h3>Интерфейс</h3>
|
||||
|
||||
<p>Секция "Лицензии" отображает полный список лицензий в левой панели и
|
||||
параметры выбранного элемента справа в основной панели.</p>
|
||||
|
||||
<p><img src="../images/licenses1.png" /></p>
|
||||
|
||||
<p>Правая панель отображает подробную информацию о выбранной
|
||||
лицензии. Также там можно заблокировать серийный номер,
|
||||
скопировать его в буфер обмена, посмотреть подробную информацию
|
||||
об идентификаторе оборудования (кликнув по нему).</p>
|
||||
|
||||
<h3 id="AddLicense">Создание лицензии</h3>
|
||||
|
||||
<p>Для того чтобы добавить новую лицензию, необходимо кликнуть
|
||||
соответствующую кнопку на панели инструментов.
|
||||
Появится окно создания лицензии:</p>
|
||||
|
||||
<p><img src="../images/project_add_license.png" /></p>
|
||||
|
||||
<p>В верхней части окна задаются основные параметры лицензии. В
|
||||
нижней можно выбрать, какие из основных параметров попадут в
|
||||
серийный номер, а также добавить дополнительные параметры:
|
||||
например, идентификатор оборудования или пользовательские данные.
|
||||
По окончании заполнения полей нажмите ОК и VMProtect создаст
|
||||
новую лицензию.</p>
|
||||
|
||||
<h3>Удаление и блокирование лицензий</h3>
|
||||
|
||||
<p>Для удаления лицензии щелкните по ней в списке лицензий правой кнопкой мыши и выберите "Удалить" в контекстном меню. Либо просто выделите лицензию в списке и нажмите Del. Для того чтобы заблокировать лицензию, переключите параметр "Заблокирована" в основной панели справа в состояние "Да".</p><p>Между удалением лицензии и ее блокированием есть
|
||||
разница. Удаленные серийные номера не блокируются модулем
|
||||
лицензирования. Они просто перестают существовать в базе данных.
|
||||
Если лицензия создана ошибочно и серийный номер никогда никому не
|
||||
отправлялся, то ее можно удалить. Если же серийный номер
|
||||
скомпрометирован, то лицензию удалять нельзя, ее необходимо
|
||||
заблокировать. Тогда в модуль лицензирования будет передана
|
||||
информация об этом номере и он не будет принимать его.</p>
|
||||
|
||||
<h3>Импорт серийных номеров</h3>
|
||||
|
||||
<p>Серийные номера могут быть созданы не только в VMProtect, но и
|
||||
в сторонних программах - генераторах номеров. Обычно они
|
||||
применяются для автоматизированной выдачи серийных номеров
|
||||
регистраторам при продаже лицензий. Чтобы корректно занести такие
|
||||
номера в базу данных, существует функция импорта серийных
|
||||
номеров. Для ее активации необходимо нажать сочетание клавиш
|
||||
Ctrl+I или выбрать пункт "Импортировать" в меню "Проект".</p>
|
||||
|
||||
<p><img src="../images/menu_project_import.png" /></p>
|
||||
|
||||
<p>Первым шагом при импорте серийного номера является окно ввода
|
||||
номера:</p>
|
||||
|
||||
<p><img src="../images/import_key.png" /></p>
|
||||
|
||||
<p>В случае, если такая лицензия уже есть в базе данных, будет
|
||||
открыто окно редактирования лицензии. Если лицензии в базе нет,
|
||||
то будет открыто окно создания лицензии, где можно внести
|
||||
необходимые правки, после чего, нажатием кнопки ОК, лицензия
|
||||
заносится в базу данных.</p><a name="export" id="export"></a>
|
||||
|
||||
<h3>Экспорт параметров лицензирования</h3>
|
||||
|
||||
<p>Для корректной работы генераторов ключей, им необходима
|
||||
информация о секретном ключе продукта. Эту информацию в наиболее
|
||||
подходящей форме можно получить, нажав кнопку "Экспорт ключа" над
|
||||
списком лицензий. При этом появится окно экспорта данных:</p>
|
||||
|
||||
<p><img src="../images/export_keys.png" /></p>
|
||||
|
||||
<p>Поле "Формат экспорта" позволяет выбрать один из
|
||||
поддерживаемых форматов, а поле "Результат экспорта" содержит
|
||||
данные в виде, наиболее удобном для соответствующего генератора
|
||||
ключей. Кнопка "Копировать" позволяет скопировать содержимое поля
|
||||
"Результат экспорта" в буфер обмена.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
312
help/ru/manager/usage/api.htm
Normal file
@@ -0,0 +1,312 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<link rel="Stylesheet" type="text/css" href=
|
||||
"../../default.css" />
|
||||
<meta http-equiv="Content-Type" content=
|
||||
"text/html; charset=utf-8" />
|
||||
|
||||
<title>Описание функций API лицензирования</title>
|
||||
<style type="text/css">
|
||||
/*<![CDATA[*/
|
||||
th {text-align:left;}
|
||||
table {border-collapse:collapse; margin-top: 4px;}
|
||||
td,th {border: 1px solid #B0B0B0; padding-left:10;padding-right:10;}
|
||||
/*]]>*/
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Описание функций API лицензирования</h1>
|
||||
|
||||
<p>API системы лицензирования является продолжением API VMProtect
|
||||
и входит в его SDK. API позволяет задать серийный номер и
|
||||
получить информацию о нем: подходит он к программе или нет, истек
|
||||
ли срок действия, на кого зарегистрирован продукт и т.п. Также API
|
||||
позволяет получить идентификатор оборудования, на котором
|
||||
выполняется программа.</p><strong id=
|
||||
"VMProtectSetSerialNumber">VMProtectSetSerialNumber</strong>
|
||||
|
||||
<p>Функция предназначена для загрузки серийного номера в систему
|
||||
лицензирования. Полный формат вызова представлен ниже:</p>
|
||||
<pre class="code">int VMProtectSetSerialNumber(const char *SerialNumber);
|
||||
</pre>
|
||||
|
||||
<p>Входной параметр <strong>SerialNumber</strong> должен
|
||||
содержать указатель на текстовую строку с серийным номером в
|
||||
кодировке base-64 и завершаемую нулем ('\0'). Функция возвращает
|
||||
битовую маску флагов состояния серийного номера, аналогичную той,
|
||||
что возвращает <strong>VMProtectGetSerialNumberState()</strong>,
|
||||
подробнее о флагах будет написано ниже. Серийный номер считается
|
||||
"хорошим", если функция вернула значение 0.</p><br />
|
||||
<strong id=
|
||||
"VMProtectGetSerialNumberState">VMProtectGetSerialNumberState</strong>
|
||||
|
||||
<p>Функция возвращает флаги состояния серийного номера,
|
||||
предварительно установленного вызовом
|
||||
<strong>VMProtectSetSerialNumber()</strong>.</p>
|
||||
<pre class="code">int VMProtectGetSerialNumberState();
|
||||
</pre>
|
||||
|
||||
<p>Наличие хотя бы одного установленного флага говорит о
|
||||
проблемах с серийным номером: программа не должна работать, если
|
||||
установлен хотя бы один бит. Подробные значениях флагов описаны в
|
||||
таблице:</p>
|
||||
|
||||
<table border="1" cellspacing="0" cellpadding="2">
|
||||
<tr>
|
||||
<th>Флаг</th>
|
||||
|
||||
<th>Значение</th>
|
||||
|
||||
<th>Описание</th>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>SERIAL_STATE_FLAG_CORRUPTED</td>
|
||||
|
||||
<td>0x00000001</td>
|
||||
|
||||
<td>Система лицензирования повреждена. Возможные причины:
|
||||
некорректная настройка проекта защиты, попытка взлома
|
||||
программы.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>SERIAL_STATE_FLAG_INVALID</td>
|
||||
|
||||
<td>0x00000002</td>
|
||||
|
||||
<td>Серийный номер некорректен. Флаг выставляется, если
|
||||
система лицензирования не может расшифровать серийный
|
||||
номер.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>SERIAL_STATE_FLAG_BLACKLISTED</td>
|
||||
|
||||
<td>0x00000004</td>
|
||||
|
||||
<td>Серийный номер подходит к продукту, однако занесен в
|
||||
черный список в VMProtect.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>SERIAL_STATE_FLAG_DATE_EXPIRED</td>
|
||||
|
||||
<td>0x00000008</td>
|
||||
|
||||
<td>Срок действия серийного номера истек. Подробную
|
||||
информацию о сроке действия можно получить вызовом
|
||||
<strong>VMProtectGetSerialNumberData()</strong></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>SERIAL_STATE_FLAG_RUNNING_TIME_OVER</td>
|
||||
|
||||
<td>0x00000010</td>
|
||||
|
||||
<td>Время работы программы истекло. Подробную информацию о
|
||||
времени работы программы можно получить вызовом
|
||||
<strong>VMProtectGetSerialNumberData()</strong></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>SERIAL_STATE_FLAG_BAD_HWID</td>
|
||||
|
||||
<td>0x00000020</td>
|
||||
|
||||
<td>Идентификатор оборудования не совпадает с тем, что
|
||||
записан в серийном номере.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED</td>
|
||||
|
||||
<td>0x00000040</td>
|
||||
|
||||
<td>Серийный номер не предназначен для работы с этой версией
|
||||
защищаемой программы. Максимальную дату сборки программы, к
|
||||
которой подходит этот серийный номер, можно узнать вызовом
|
||||
<strong>VMProtectGetSerialNumberData()</strong>.</td>
|
||||
</tr>
|
||||
</table><br /><br />
|
||||
<strong id=
|
||||
"VMProtectGetSerialNumberData">VMProtectGetSerialNumberData</strong>
|
||||
|
||||
<p>Функция предназначена для получения информации о содержимом
|
||||
серийного номера, установленного вызовом
|
||||
<strong>VMProtectSetSerialNumber()</strong>. Формат вызова
|
||||
представлен ниже:</p>
|
||||
<pre class="code">bool VMProtectGetSerialNumberData(VMProtectSerialNumberData *Data, int Size);
|
||||
</pre>
|
||||
|
||||
<p>Первый параметр - указатель на структуру
|
||||
<strong>VMProtectSerialNumberData</strong>, в которую будет
|
||||
записана вся необходимая информация. Второй параметр - размер
|
||||
структуры, передаваемой в первом параметре - служит для контроля
|
||||
формата структуры. Функция возвращает FALSE в случаях, если система
|
||||
лицензирования повреждена (см. флаг состояния
|
||||
SERIAL_STATE_FLAG_CORRUPTED), если на вход подан нулевой адрес
|
||||
структуры или если переданный размер структуры некорректен. Во
|
||||
всех остальных случаях функция возвращает TRUE и записывает всю
|
||||
информацию о серийном номере по указанном адресу. Ниже
|
||||
описываются все элементы структуры:</p>
|
||||
|
||||
<table border="1" cellspacing="0" cellpadding="2">
|
||||
<tr>
|
||||
<th>Элемент</th>
|
||||
|
||||
<th>Тип</th>
|
||||
|
||||
<th>Описание</th>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>nState</td>
|
||||
|
||||
<td>int</td>
|
||||
|
||||
<td>Битовая маска флагов проверки ключа. Аналогична той, что
|
||||
возвращает
|
||||
<strong>VMProtectGetSerialNumberState()</strong>.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>wUserName</td>
|
||||
|
||||
<td>wchar_t[256]</td>
|
||||
|
||||
<td>Имя покупателя в кодировке UNICODE, завершаемое
|
||||
нулем.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>wEMail</td>
|
||||
|
||||
<td>wchar_t[256]</td>
|
||||
|
||||
<td>E-Mail покупателя в кодировке UNICODE, завершаемый
|
||||
нулем.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>dtExpire</td>
|
||||
|
||||
<td>VMProtectDate</td>
|
||||
|
||||
<td>Дата окончания срока действия ключа. Формат структуры
|
||||
VMProtectDate описан ниже.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>dtMaxBuild</td>
|
||||
|
||||
<td>VMProtectDate</td>
|
||||
|
||||
<td>Максимальная дата сборки продукта, с которой будет
|
||||
работать этот ключ. Формат структуры VMProtectDate описан
|
||||
ниже.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>bRunningTime</td>
|
||||
|
||||
<td>int</td>
|
||||
|
||||
<td>Количество минут, которое программа будет работать
|
||||
(максимальная длина сессии). Измеряется в минутах,
|
||||
отсчитывается с момента запуска программы.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>nUserDataLength</td>
|
||||
|
||||
<td>unsigned char</td>
|
||||
|
||||
<td>Длина пользовательских данных, размещенных в поле
|
||||
<strong>bUserData</strong>.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>bUserData</td>
|
||||
|
||||
<td>unsigned char[255]</td>
|
||||
|
||||
<td>Пользовательские данные, записанные в ключ. Количество
|
||||
актуальных байт указано в поле
|
||||
<strong>nUserDataLength</strong>.</td>
|
||||
</tr>
|
||||
</table><br />
|
||||
|
||||
<p>Структура <strong>VMProtectDate</strong> предназначена для
|
||||
компактного хранения даты. Ее поля описаны в таблице:</p>
|
||||
|
||||
<table border="1" cellspacing="0" cellpadding="2">
|
||||
<tr>
|
||||
<th>Элемент</th>
|
||||
|
||||
<th>Тип</th>
|
||||
|
||||
<th>Описание</th>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>wYear</td>
|
||||
|
||||
<td>unsigned short</td>
|
||||
|
||||
<td>Год.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>bMonth</td>
|
||||
|
||||
<td>unsigned char</td>
|
||||
|
||||
<td>Месяц, нумерация начинается с единицы.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>bDay</td>
|
||||
|
||||
<td>unsigned char</td>
|
||||
|
||||
<td>День, нумерация начинается с единицы.</td>
|
||||
</tr>
|
||||
</table><br />
|
||||
<br />
|
||||
<strong id=
|
||||
"VMProtectGetCurrentHWID">VMProtectGetCurrentHWID</strong>
|
||||
|
||||
<p>Функция предназначена для получения идентификатора
|
||||
оборудования, на котором работает программа. Формат вызова
|
||||
следующий:</p>
|
||||
<pre class="code">int VMProtectGetCurrentHWID(char * HWID, int Size);
|
||||
</pre>
|
||||
|
||||
<p>Первый параметр - указатель на область памяти, куда будет
|
||||
записан идентификатор. Второй параметр - размер области данных.
|
||||
Функция возвращает количество записанных байт с учетом
|
||||
завершающего нуля ('\0'). Если вместо первого параметра подать
|
||||
NULL, то функция вернет необходимое количество байт для записи
|
||||
номера. Наиболее правильный способ вызова функции следующий:</p>
|
||||
<pre class="code"><strong>int</strong> nSize = <strong>VMProtectGetCurrentHWID</strong>(NULL, 0); // получим необходимый размер буфера
|
||||
<strong>char *</strong>pBuf = <strong>new char</strong>[nSize]; // выделим буфер
|
||||
<strong>VMProtectGetCurrentHWID</strong>(pBuf, nSize); // получим идентификатор
|
||||
// используем его
|
||||
<strong>delete</strong> [] pBuf; // освободим память
|
||||
</pre><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
127
help/ru/manager/usage/index.htm
Normal file
@@ -0,0 +1,127 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<link rel="Stylesheet" type="text/css" href=
|
||||
"../../default.css" />
|
||||
<meta http-equiv="Content-Type" content=
|
||||
"text/html; charset=utf-8" />
|
||||
|
||||
<title>Интеграция в приложение</title>
|
||||
<style type="text/css">
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Интеграция в приложение</h1>
|
||||
|
||||
<p>В нескольких шагах, описанных ниже, мы создадим тестовое
|
||||
приложение, которое будет обращаться к системе лицензирования:
|
||||
подавать ей серийные номера и получать статус номера и его
|
||||
содержимое. На первом этапе система лицензирования будет
|
||||
использоваться в тестовом режиме, а на втором этапе - в
|
||||
реальном.</p><strong>Режимы работы системы
|
||||
лицензирования</strong>
|
||||
|
||||
<p>В создании защиты всегда есть два этапа: разработка и
|
||||
использование. В случае с лицензированием, вы сначала создаете
|
||||
приложение, потом интегрируете механизмы защиты, добавляете
|
||||
проверки и блокируете функции. И только потом, после
|
||||
всестороннего тестирования, продукт передается пользователям и
|
||||
начинается второй этап. Тестирование защищаемого приложения -
|
||||
процесс сложный, необходимо убедиться в работоспособности всех
|
||||
проверок и условных переходов. Создание "настоящих" серийных
|
||||
номеров на все случаи жизни на этапе тестирования может оказаться
|
||||
неудобным, поэтому у системы лицензирования есть т.н. "режим
|
||||
разработки" или "тестовый" режим, при котором никакой защиты не
|
||||
осуществляется, а реакция системы на серийные номера описывается
|
||||
в конфигурационном файле. Когда приложение отлажено и корректно
|
||||
работает с системой лицензирования, VMProtect заменяет "тестовый"
|
||||
модуль лицензирования на реальный, проверяющий реальные серийные
|
||||
номера. Это происходит в момент защиты приложения, поэтому
|
||||
пропустить этот этап по ошибке не получится.</p><strong id="TestMode">Этап 1:
|
||||
Тестовый режим работы</strong>
|
||||
|
||||
<p>В тестовом режиме реакция системы лицензирования на серийные
|
||||
номера, все возвращаемые статусы и данные описываются в
|
||||
конфигурационном файле. Файл называется VMPLicense.ini и должен
|
||||
располагаться в рабочем каталоге приложения. В 10 шагах,
|
||||
представленных ниже, мы пройдем от создания простейшего
|
||||
приложения до полноценного использования системы лицензирования в
|
||||
тестовом режиме с привязкой к оборудованию и ограничением срока
|
||||
бесплатных обновлений.</p>
|
||||
|
||||
<ul>
|
||||
<li><a href="step11_app.htm">Шаг 1.1: Создаем защищаемое
|
||||
приложение</a></li>
|
||||
|
||||
<li><a href="step12_code.htm">Шаг 1.2: Добавляем код проверки
|
||||
лицензии</a></li>
|
||||
|
||||
<li><a href="step13_flags.htm">Шаг 1.3: Получаем флаги состояния
|
||||
номера</a></li>
|
||||
|
||||
<li><a href="step14_name.htm">Шаг 1.4: Получаем имя и e-mail
|
||||
пользователя</a></li>
|
||||
|
||||
<li><a href="step15_exp.htm">Шаг 1.5: Проверяем срок действия
|
||||
номера</a></li>
|
||||
|
||||
<li><a href="step16_time.htm">Шаг 1.6: Ограничиваем время работы
|
||||
программы</a></li>
|
||||
|
||||
<li><a href="step17_maxbuild.htm">Шаг 1.7: Ограничиваем
|
||||
бесплатные обновления</a></li>
|
||||
|
||||
<li><a href="step18_blacklist.htm">Шаг 1.8: Номера из "черного
|
||||
списка"</a></li>
|
||||
|
||||
<li><a href="step19_hwid.htm">Шаг 1.9: Привязка к
|
||||
оборудованию</a></li>
|
||||
|
||||
<li><a href="step1A_userdata.htm">Шаг 1.10: Пользовательские
|
||||
данные</a></li>
|
||||
</ul><strong id="RealMode">Этап 2: Реальный режим работы</strong>
|
||||
|
||||
<p>В реальном режиме работы системы лицензирования VMProtect
|
||||
помещает в защищаемое приложение специальный модуль
|
||||
лицензирования. Модуль выполняет все те же функции, что и
|
||||
тестовый код в SDK, но работает не с ini-файлом, а с содержимым
|
||||
серийного номера. В следующих пяти шагах мы защитим простое
|
||||
приложение полноценной защитой на основе VMProtect и системы
|
||||
лицензирования.</p>
|
||||
|
||||
<ul>
|
||||
<li><a href="step21_src.htm">Шаг 2.1: Создаем новое защищаемое
|
||||
приложение</a></li>
|
||||
|
||||
<li><a href="step22_vmp.htm">Шаг 2.2: Создаем проект защиты в
|
||||
VMProtect</a></li>
|
||||
|
||||
<li><a href="step23_product.htm">Шаг 2.3: Первый запуск
|
||||
защищенного продукта</a></li>
|
||||
|
||||
<li><a href="step24_test.htm">Шаг 2.4: Тестируем
|
||||
результат</a></li>
|
||||
|
||||
<li><a href="step25_codelock.htm">Шаг 2.5: Привязываем код к
|
||||
серийному номеру</a></li>
|
||||
</ul><strong>Дополнительная информация</strong>
|
||||
|
||||
<p>Значения всех битовых флагов, форматы структур и параметры
|
||||
вызова функций можно посмотреть в разделе <a href="api.htm">API
|
||||
системы лицензирования</a>. Этот раздел удобно использовать как
|
||||
справочник, тогда как шаги, описанные выше, позволяют легко
|
||||
реализовать готовые типовые схемы защиты.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
62
help/ru/manager/usage/step11_app.htm
Normal file
@@ -0,0 +1,62 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<link rel="Stylesheet" type="text/css" href=
|
||||
"../../default.css" />
|
||||
<meta http-equiv="Content-Type" content=
|
||||
"text/html; charset=utf-8" />
|
||||
|
||||
<title>Шаг 1.1: Создаем защищаемое приложение</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Шаг 1.1: Создаем защищаемое приложение</h1>
|
||||
|
||||
<p>Первым шагом будет создание приложения. Это будет простое
|
||||
приложение, без интерфейса пользователя и каких-либо серьезных
|
||||
возможностей. Нашей задачей будет передать системе лицензирования
|
||||
серийный номер и получить от нее ответ.</p>
|
||||
<pre class="code">#include <windows.h>
|
||||
#include <stdio.h>
|
||||
|
||||
bool is_registered(const char *serial)
|
||||
{
|
||||
return serial && serial[0] == 'X';
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
char *serial = "Xserialnumber"; // зададим номер непосредственно в коде для простоты
|
||||
if (!is_registered(serial))
|
||||
{
|
||||
printf("please register!\n");
|
||||
return 0;
|
||||
}
|
||||
printf("We are registered.\n");
|
||||
return 0;
|
||||
}
|
||||
</pre>
|
||||
|
||||
<p>Программа реализует очень простую схему проверки серийного
|
||||
номера. Функция <strong>is_registered()</strong> сравнивает
|
||||
первую букву номера с 'Х' и считает номер корректным в случае
|
||||
совпадения. Для некорректного номера выдается просьба о
|
||||
регистрации, а в случае правильного номера выводится сообщение
|
||||
"We are registered."</p>
|
||||
|
||||
<p><a href="step12_code.htm">Следующим шагом</a> будет добавление
|
||||
кода проверки серийного номера на основе системы лицензирования
|
||||
VMProtect.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
105
help/ru/manager/usage/step12_code.htm
Normal file
@@ -0,0 +1,105 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<link rel="Stylesheet" type="text/css" href=
|
||||
"../../default.css" />
|
||||
<meta http-equiv="Content-Type" content=
|
||||
"text/html; charset=utf-8" />
|
||||
|
||||
<title>Шаг 1.2: Добавляем код проверки лицензии</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Шаг 1.2: Добавляем код проверки лицензии</h1><strong>Подключаем
|
||||
VMProtect SDK</strong>
|
||||
|
||||
<p>Если вы этого еще не сделали, то сейчас самое время подключить
|
||||
к проекту VMProtect SDK. SDK это три файла: заголовочный файл
|
||||
(VMProtectSDK.h), файл библиотеки (VMProtectSDK32.lib) и dll-файл
|
||||
с реализацией (VMProtectSDK32.dll). Для 64-битной платформы есть
|
||||
отдельные реализации библиотеки и dll-файла.</p>
|
||||
|
||||
<p>Помещаем dll-файл в рабочий каталог нашего приложения,
|
||||
файл заголовков и библиотечный файл - рядом с исходниками, включаем
|
||||
файл заголовков в основной файл:</p>
|
||||
<pre class="code">#include <windows.h>
|
||||
#include <stdio.h>
|
||||
#include "VMProtectSDK.h"
|
||||
</pre>
|
||||
|
||||
<p>Собираем проект и убеждаемся, что он компилируется, запускается
|
||||
и работает, как и раньше. Система лицензирования пока еще не
|
||||
активна.</p><strong>Подаем серийный номер в систему
|
||||
лицензирования</strong>
|
||||
|
||||
<p>Теперь непосредственно после строки с серийным номером добавим
|
||||
вызов функции SDK системы лицензирования:</p>
|
||||
<pre class="code">char *serial = "Xserialnumber"; // зададим номер непосредственно в коде для простоты
|
||||
int res = VMProtectSetSerialNumber(serial);
|
||||
printf("res = 0x%08X\n", res);
|
||||
</pre>
|
||||
|
||||
<p>Если после этого программа будет завершаться с ошибкой об
|
||||
отсутствии dll-файла, убедитесь, что вы положили соответствующий
|
||||
DLL-файл в рабочий каталог нашего приложения. В случае успешного
|
||||
запуска, вы должны увидеть сообщение:</p>
|
||||
<pre class="code">res = 0x00000002
|
||||
</pre>
|
||||
|
||||
<p>Число 2 соответствует флагу SERIAL_STATE_FLAG_INVALID,
|
||||
<a href="api.htm">описанному в API</a>. Т.е. система
|
||||
лицензирования посчитала наш ключ некорректным, что вполне
|
||||
логично, т.к. мы до сих пор не "объяснили" системе лицензирования,
|
||||
какие ключи считать правильными, а какие - нет.</p><strong>Задаем
|
||||
"правильный" серийный номер</strong>
|
||||
|
||||
<p>В тестовом режиме система лицензирования анализирует файл
|
||||
VMProtectLicense.ini, и реагирует на вызовы функций согласно
|
||||
указанным там настройкам. Подробно файл разбирается в следующих
|
||||
шагах, а здесь мы просто создадим такой файл и поместим туда
|
||||
следующий текст:</p>
|
||||
<pre class="code">[TestLicense]
|
||||
AcceptedSerialNumber=Xserialnumber
|
||||
</pre>
|
||||
|
||||
<p>Запустим нашу программу еще раз. Если вы снова получили код
|
||||
ошибки "2", то убедитесь, что ini-файл находится в рабочем
|
||||
каталоге приложения. В этот раз вы должны получить результат "0".
|
||||
Признак того, что система лицензирования приняла и одобрила
|
||||
серийный номер. Теперь мы можем убрать функцию
|
||||
<strong>is_registered()</strong> - проверкой серийного номера
|
||||
займется система лицензирования:</p>
|
||||
<pre class="code">#include <windows.h>
|
||||
#include <stdio.h>
|
||||
#include "VMProtectSDK.h"
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
char *serial = "Xserialnumber"; // зададим номер непосредственно в коде для простоты
|
||||
|
||||
int res = VMProtectSetSerialNumber(serial);
|
||||
printf("res = 0x%08X\n", res);
|
||||
|
||||
if (res)
|
||||
{
|
||||
printf("please register!\n");
|
||||
return 0;
|
||||
}
|
||||
printf("We are registered.\n");
|
||||
return 0;
|
||||
}
|
||||
</pre><br />
|
||||
<a href="step13_flags.htm">Следующий шаг</a>
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
96
help/ru/manager/usage/step13_flags.htm
Normal file
@@ -0,0 +1,96 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<link rel="Stylesheet" type="text/css" href=
|
||||
"../../default.css" />
|
||||
<meta http-equiv="Content-Type" content=
|
||||
"text/html; charset=utf-8" />
|
||||
|
||||
<title>Шаг 1.3: Получаем флаги состояния серийного номера</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Шаг 1.3: Получаем флаги состояния серийного
|
||||
номера</h1><strong>Удобная функция для печати флагов</strong>
|
||||
|
||||
<p>Первым делом добавим в наш файл одну удобную функцию, которая
|
||||
будет печатать в человеческом виде значения флагов состояния
|
||||
серийного номера. Код функции приведен ниже:</p>
|
||||
<pre class="code">#define PRINT_HELPER(state, flag) if (state & flag) printf("%s ", #flag)
|
||||
void print_state(INT state)
|
||||
{
|
||||
if (state == 0)
|
||||
{
|
||||
printf("state = 0\n");
|
||||
return;
|
||||
}
|
||||
|
||||
printf("state = ");
|
||||
PRINT_HELPER(state, SERIAL_STATE_FLAG_CORRUPTED);
|
||||
PRINT_HELPER(state, SERIAL_STATE_FLAG_INVALID);
|
||||
PRINT_HELPER(state, SERIAL_STATE_FLAG_BLACKLISTED);
|
||||
PRINT_HELPER(state, SERIAL_STATE_FLAG_DATE_EXPIRED);
|
||||
PRINT_HELPER(state, SERIAL_STATE_FLAG_RUNNING_TIME_OVER);
|
||||
PRINT_HELPER(state, SERIAL_STATE_FLAG_BAD_HWID);
|
||||
PRINT_HELPER(state, SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED);
|
||||
printf("\n");
|
||||
}
|
||||
</pre>
|
||||
|
||||
<p>Несмотря на свой размер, функция очень простая - она
|
||||
последовательно проверяет все битовые флаги и печатает те, что
|
||||
присутствуют в переменной состояния. Заменим
|
||||
<strong>printf</strong> после проверки номера на вызов
|
||||
<strong>print_state</strong>, заодно временно поправим серийный
|
||||
номер, который подается в систему лицензирования:</p>
|
||||
<pre class="code">char *serial = "Xserialnumber1"; // зададим номер непосредственно в коде для простоты
|
||||
int res = VMProtectSetSerialNumber(serial);
|
||||
print_state(res);
|
||||
</pre>
|
||||
|
||||
<p>Если запустить эту программу, то на консоль выведется
|
||||
следующее:</p>
|
||||
<pre class="code">state = SERIAL_STATE_FLAG_INVALID
|
||||
please register!
|
||||
</pre>
|
||||
|
||||
<p>Вернем теперь старый серийный номер, убрав "1", и запустим
|
||||
программу еще раз:</p>
|
||||
<pre class="code">state = 0
|
||||
We are registered.
|
||||
</pre>
|
||||
|
||||
<p>Теперь, когда мы можем видеть флаги состояние серийного
|
||||
номера, перейдем к получению флагов и данных из серийного
|
||||
номера.</p><strong>Получение состояния номера</strong>
|
||||
|
||||
<p>Состояние номера можно получить тремя способами: вызвав
|
||||
<strong>VMProtectSetSerialNumber()</strong>, вызвав
|
||||
<strong>VMProtectGetSerialNumberState()</strong> и вызвав
|
||||
<strong>VMProtectGetSerialNumberData()</strong> - флаги состояния
|
||||
будут помещены в одно из полей структуры. Каждый из методов
|
||||
предназначен для использования в разное время. Первая проверка
|
||||
серийного номера происходит непосредственно при его установке. В
|
||||
этот момент нужно отсекать некорректные номера, номера с истекшим
|
||||
сроком действия, номера из черного списка и т.п. Некоторые
|
||||
ограничения - скажем, максимальное время работы продукта или срок
|
||||
действия номера, имеет смысл проверять и в процессе работы
|
||||
программы. Тут оптимально воспользоваться простым и быстрым
|
||||
методом <strong>VMProtectGetSerialNumberState()</strong>, а в
|
||||
случае, если нужно получить подробную информацию о данных в
|
||||
серийном номере, можно использовать более мощную функцию
|
||||
<strong>VMProtectGetSerialNumberData()</strong>.</p><br />
|
||||
<a href="step14_name.htm">Следующий шаг</a>
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
53
help/ru/manager/usage/step14_name.htm
Normal file
@@ -0,0 +1,53 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<link rel="Stylesheet" type="text/css" href=
|
||||
"../../default.css" />
|
||||
<meta http-equiv="Content-Type" content=
|
||||
"text/html; charset=utf-8" />
|
||||
|
||||
<title>Шаг 1.4: Получаем имя и e-mail пользователя</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Шаг 1.4: Получаем имя и e-mail пользователя</h1>
|
||||
|
||||
<p>Начнем с простого: получим из серийного номера имя и e-mail
|
||||
пользователя (часто показываются в окне About). Для этого нам
|
||||
придется прописать их в ini-файл. Добавим еще две строчки к нашим
|
||||
двум:</p>
|
||||
<pre class="code">[TestLicense]
|
||||
AcceptedSerialNumber=Xserialnumber
|
||||
UserName=John Doe
|
||||
EMail=john@doe.com
|
||||
</pre>
|
||||
|
||||
<p>А в самой программе, в случае успешной регистрации, добавим
|
||||
получение этих данных и вывод их на экран:</p>
|
||||
<pre class="code">VMProtectSerialNumberData sd = {0};
|
||||
VMProtectGetSerialNumberData(&sd, sizeof(sd));
|
||||
printf("name = %ls,\ne-mail = %ls\n", sd.wUserName, sd.wEMail);
|
||||
</pre>
|
||||
|
||||
<p>Структура содержит данные в UNICODE, поэтому в
|
||||
<strong>printf()</strong> использованы спецификаторы %ls вместо %s.
|
||||
Программа должна вывести на экран текст:</p>
|
||||
<pre class="code">state = 0
|
||||
We are registered.
|
||||
name = John Doe,
|
||||
e-mail = john@doe.com
|
||||
</pre><br />
|
||||
<a href="step15_exp.htm">Следующий шаг</a>
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
59
help/ru/manager/usage/step15_exp.htm
Normal file
@@ -0,0 +1,59 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<link rel="Stylesheet" type="text/css" href=
|
||||
"../../default.css" />
|
||||
<meta http-equiv="Content-Type" content=
|
||||
"text/html; charset=utf-8" />
|
||||
|
||||
<title>Шаг 1.5: Проверяем срок действия серийного номера</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Шаг 1.5: Проверяем срок действия серийного номера</h1>
|
||||
|
||||
<p>Поместите в ini-файл строчку вида ExpDate=YYYYMMDD - например,
|
||||
такую:</p>
|
||||
<pre class="code">ExpDate=20000101
|
||||
</pre>
|
||||
|
||||
<p>Важно, чтобы дата, указанная в строке, уже прошла. Т.е.
|
||||
максимум - вчера. Запустив программу, вы увидите следующее:</p>
|
||||
<pre class="code">state = SERIAL_STATE_FLAG_DATE_EXPIRED
|
||||
please register!
|
||||
</pre>
|
||||
|
||||
<p>Добавим получение дополнительной информации перед выходом с
|
||||
сообщением "please register":</p>
|
||||
<pre class="code">if (res)
|
||||
{
|
||||
VMProtectSerialNumberData sd = {0};
|
||||
VMProtectGetSerialNumberData(&sd, sizeof(sd));
|
||||
printf("exp. date: y = %d, m = %d, d = %d\n", sd.dtExpire.wYear, sd.dtExpire.bMonth, sd.dtExpire.bDay);
|
||||
printf("please register!\n");
|
||||
return 0;
|
||||
}
|
||||
</pre>
|
||||
|
||||
<p>Повторный запуск приложения даст нам больше подробностей:</p>
|
||||
<pre class="code">state = SERIAL_STATE_FLAG_DATE_EXPIRED
|
||||
exp. date: y = 2000, m = 1, d = 1
|
||||
please register!
|
||||
</pre>
|
||||
|
||||
<p>Удалите из ini-файла строку ExpDate=..., чтобы она не мешала
|
||||
нам в дальнейшем.</p><br />
|
||||
<a href="step16_time.htm">Следующий шаг</a>
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
79
help/ru/manager/usage/step16_time.htm
Normal file
@@ -0,0 +1,79 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<link rel="Stylesheet" type="text/css" href=
|
||||
"../../default.css" />
|
||||
<meta http-equiv="Content-Type" content=
|
||||
"text/html; charset=utf-8" />
|
||||
|
||||
<title>Шаг 1.6: Ограничиваем время работы программы</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Шаг 1.6: Ограничиваем время работы программы</h1>
|
||||
|
||||
<p>Вы можете ограничить время работы программы с момента запуска.
|
||||
Это может быть полезно для демонстрационных целей: выдается
|
||||
полноценный серийный номер, однако программа работает не более
|
||||
пяти минут. Система лицензирования не закрывает такую программу
|
||||
принудительно по истечении указанного времени, а лишь уведомляет
|
||||
об окончании времени выставлением флага состояния. Зададим
|
||||
ограничение времени работы в одну минуту, добавив в ini-файл
|
||||
строчку:</p>
|
||||
<pre class="code">TimeLimit=1
|
||||
</pre>
|
||||
|
||||
<p>Модифицируем программу следующим образом:</p>
|
||||
<pre class="code">int main(int argc, char **argv)
|
||||
{
|
||||
char *serial = "Xserialnumber"; // зададим номер непосредственно в коде для простоты
|
||||
|
||||
int res = VMProtectSetSerialNumber(serial);
|
||||
print_state(res);
|
||||
if (res) return 0;
|
||||
|
||||
VMProtectSerialNumberData sd = {0};
|
||||
VMProtectGetSerialNumberData(&sd, sizeof(sd));
|
||||
printf("I will run for %d minute(s)\n", sd.bRunningTime);
|
||||
print_state(VMProtectGetSerialNumberState());
|
||||
Sleep(60 * 1000 * sd.bRunningTime);
|
||||
printf("After %d minute(s):\n", sd.bRunningTime);
|
||||
print_state(VMProtectGetSerialNumberState());
|
||||
|
||||
return 0;
|
||||
}
|
||||
</pre>
|
||||
|
||||
<p>Программа выводит состояние серийного номера в момент старта,
|
||||
потом считывает максимальное время работы, ждет, пока оно пройдет
|
||||
и выводит состояние номера еще раз. Для одной минуты мы получим
|
||||
следующий результат:</p>
|
||||
<pre class="code">state = 0
|
||||
I will run for 1 minute(s)
|
||||
state = 0
|
||||
After 1 minute(s):
|
||||
state = SERIAL_STATE_FLAG_RUNNING_TIME_OVER
|
||||
</pre>
|
||||
|
||||
<p>Защищаемая программа должна анализировать состояние серийного
|
||||
номера с определенной периодичностью и завершить свою работу в
|
||||
случае появления такого флага. Система лицензирования не делает
|
||||
этого автоматически, т.к. программе может требоваться освободить
|
||||
какие-то ресурсы, записать данные в файл и т.д. Также программа
|
||||
может не завершаться по истечении данного времени, а переходить в
|
||||
более ограниченный режим работы. Система лицензирования оставляет
|
||||
эти вопросы на усмотрение разработчика.</p><br />
|
||||
<a href="step17_maxbuild.htm">Следующий шаг</a>
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
85
help/ru/manager/usage/step17_maxbuild.htm
Normal file
@@ -0,0 +1,85 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<link rel="Stylesheet" type="text/css" href=
|
||||
"../../default.css" />
|
||||
<meta http-equiv="Content-Type" content=
|
||||
"text/html; charset=utf-8" />
|
||||
|
||||
<title>Шаг 1.7: Ограничиваем бесплатные обновления</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Шаг 1.7: Ограничиваем бесплатные обновления</h1><strong>Схема
|
||||
работы</strong>
|
||||
|
||||
<p>В момент защиты приложения VMProtect запоминает дату, когда это
|
||||
происходило. Эта дата является для системы лицензирования датой
|
||||
сборки приложения. В серийном номере можно прописать максимальную
|
||||
дату сборки, для которой подойдет этот номер. Таким образом, если
|
||||
при создании ключа Вы пропишете в него текущую дату + 1 год, то
|
||||
ключ подойдет ко всем релизам Вашей программы, которые вы
|
||||
выпустите в течение года. К релизу, выпущенному через год и 1
|
||||
день ключ уже не подойдет и у пользователя будет выбор:
|
||||
пользоваться более старой версией или купить новый ключ, который
|
||||
будет работать еще год.</p><strong>Пробуем на деле</strong>
|
||||
|
||||
<p>Поместите в ini-файл строчку вида MaxBuildDate=YYYYMMDD -
|
||||
например, такую:</p>
|
||||
<pre class="code">MaxBuildDate=20000101
|
||||
</pre>
|
||||
|
||||
<p>В тестовом режиме система лицензирования считает датой сборки
|
||||
сегодняшнее число, поэтому важно, чтобы дата, указанная в строке,
|
||||
уже прошла. Т.е. максимум - вчера. Модифицируйте исходный код
|
||||
функции <strong>main()</strong>, чтобы он выглядел так:</p>
|
||||
<pre class="code">int main(int argc, char **argv)
|
||||
{
|
||||
char *serial = "Xserialnumber"; // зададим номер непосредственно в коде для простоты
|
||||
|
||||
int res = VMProtectSetSerialNumber(serial);
|
||||
print_state(res);
|
||||
|
||||
if (res)
|
||||
{
|
||||
VMProtectSerialNumberData sd = {0};
|
||||
VMProtectGetSerialNumberData(&sd, sizeof(sd));
|
||||
printf("max. build date: y = %d, m = %d, d = %d\n", sd.dtMaxBuild.wYear, sd.dtMaxBuild.bMonth, sd.dtMaxBuild.bDay);
|
||||
printf("please register!\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
printf("I'm registered\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
</pre>
|
||||
|
||||
<p>Тогда при запуске программы вы увидите следующее:</p>
|
||||
<pre class="code">state = SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED
|
||||
max. build date: y = 2000, m = 1, d = 1
|
||||
please register!
|
||||
</pre>
|
||||
|
||||
<p>Заменив в ini-файле дату на сегодняшнюю или завтрашнюю, мы
|
||||
получим "рабочую" программу:</p>
|
||||
<pre class="code">state = 0
|
||||
I'm registered
|
||||
</pre>
|
||||
|
||||
<p>Удалите из ini-файла строку MaxBuildDate=..., чтобы она не
|
||||
мешала нам в дальнейшем.</p><br />
|
||||
<a href="step18_blacklist.htm">Следующий шаг</a>
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
64
help/ru/manager/usage/step18_blacklist.htm
Normal file
@@ -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>
|