diff options
Diffstat (limited to 'help/ru')
136 files changed, 9042 insertions, 0 deletions
diff --git a/help/ru/about_vmprotect.htm b/help/ru/about_vmprotect.htm new file mode 100644 index 0000000..e0718fc --- /dev/null +++ b/help/ru/about_vmprotect.htm @@ -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> diff --git a/help/ru/contacts.htm b/help/ru/contacts.htm new file mode 100644 index 0000000..59de03f --- /dev/null +++ b/help/ru/contacts.htm @@ -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> diff --git a/help/ru/create_project.htm b/help/ru/create_project.htm new file mode 100644 index 0000000..02cf380 --- /dev/null +++ b/help/ru/create_project.htm @@ -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> diff --git a/help/ru/default.css b/help/ru/default.css new file mode 100644 index 0000000..2aed7c2 --- /dev/null +++ b/help/ru/default.css @@ -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; +} diff --git a/help/ru/dictionary.htm b/help/ru/dictionary.htm new file mode 100644 index 0000000..3914277 --- /dev/null +++ b/help/ru/dictionary.htm @@ -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> diff --git a/help/ru/faq.htm b/help/ru/faq.htm new file mode 100644 index 0000000..21af990 --- /dev/null +++ b/help/ru/faq.htm @@ -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> diff --git a/help/ru/functions.htm b/help/ru/functions.htm new file mode 100644 index 0000000..9f28fc8 --- /dev/null +++ b/help/ru/functions.htm @@ -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> diff --git a/help/ru/history.htm b/help/ru/history.htm new file mode 100644 index 0000000..d8340b5 --- /dev/null +++ b/help/ru/history.htm @@ -0,0 +1,1021 @@ +<!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>Версия 3.5</h3> + <p>[!] .NET: Исправлено множество ошибок<br /> + [!] ELF: Исправлена ошибка, возникающая в VMProtectGetCurrentHWID при получении информацуии о HDD<br /> + [+] .NET: Добавлена поддержка .NET Core (3.0+) и .NET Standard (2.1+)<br /> + [+] .NET: Добавлена защита импорта<br /> + [+] .NET: Добавлена защита ресурсов<br /> + [+] .NET: Добавлена поддержка mixed assemblies<br /> + [*] Mach-O: Улучшена поддержка секций с типом S_THREAD_LOCAL_VARIABLES и S_THREAD_LOCAL_REGULAR<br /> + [*] Mach-O: Улучшена поддержка Objective-C<br /> + [*] ELF: Улучшена поддержка релокейшенов с типом R_386_PC32<br /> + [*] PE: Улучшена антиотладка<br /> + </p> + + <h3>Версия 3.4</h3> + <p>[!] Исправлена ошибка возникающая при виртуализации команд BT [m16], POP [m64]<br /> + [+] Добавлена поддержка .NET приложений<br /> + [+] Добавлено дизассемблирование команды PMULLD<br /> + [+] PE: Добавлена поддержка COFF символом<br /> + [*] ELF: Улучшено дизассемблирование of SWITCH<br /> + [*] ELF: Улучшена поддержка настраиваемых элементов с типом R_386_PC32<br /> + [*] PE: Улучшена обработка исключений<br /> + [*] PE: Улучшена поддержка Windows Server 2016 Datacenter<br /> + </p> + + <h3>Версия 3.3</h3> + <p>[+] PE: Added support of "Control Flow Guard"<br /> + [+] PE: Added support of PDB files for loading symbols<br /> + [+] Mach-O: Added support of OS X 10.13 and later<br /> + [+] ELF: Added support of statically linked libstdc++.so<br /> + [+] ELF: Added support of CentOS 5 and CentOS 6<br /> + [+] ELF: Added support of TLS segments<br /> + [+] ELF: Added support of HTTPS for VMProtectActivateLicense<br /> + [*] PE: Improved exception handling for x64 applications<br /> + [*] PE: Improved detection of virtualization tools under the Hyper-V role<br /> + [*] PE: Improved demagling of MSVC symbols<br /> + [*] Mach-O: Improved exception handling<br /> + [*] Mach-O: Improved support of Objective-C<br /> + [*] ELF: Fixed a bug that occurred when the "Pack the Output File" option was used<br /> + </p> + + <h3>Версия 3.2</h3> + <p>[!] PE: Исправлена ошибка возникающая при вызове VMProtectIsValidImageCRC внутри защищенного драйвера<br /> + [!] Исправлена ошибка возникающая при виртуализации команд XOR, имеющей настраиваемые элементы<br /> + [*] PE: Добавлена упаковка секций, содержащих TLS директорию<br /> + [*] PE: Улучшено обнаружение отладчиков<br /> + [*] PE: Taggant System больше не поддерживается<br /> + [*] Значительно ускорена распаковка при использовании опции "<a href= + "project_options.htm#PackOutputFile">Упаковать файл</a>"<br /> + [+] Добавлена поддержка ELF формата<br /> + [+] Добавлено дизассемблирование AVX команд<br /> + </p> + + <h3>Версия 3.1</h3> + + <p>[!] Исправлена ошибка возникающая при дизассемлировании команды MOVUPS с REX префиксом 0x41<br /> + [!] Исправлена ошибка возникающая при виртуализации команд XLAT, FSIN и POPAD<br /> + [*] Улучшена поддержка исключений<br /> + [*] Улучшена архитектура ВМ<br /> + [*] Улучшена проверка целостности файла на диске при использовании опции "<a href= + "project_options.htm#MemoryProtection">Защита памяти</a>"<br /> + [*] Улучшена виртуализация команд FSTENV, FSTCW, FSAVE и FSTSW<br /> + [*] PE: VMProtectActivateLicense теперь работает через WinHTTP и использует настройки прокси из IE<br /> + [*] PE: Улучшена работа VMProtectGetCurrentHWID для драйверов<br /> + [*] PE: Улучшена поддержка Delphi 6 при использовании опции "<a href= + "project_options.htm#ImportProtection">Защита импорта</a>"<br /> + [*] PE: Улучшено обнаружение отладчиков<br /> + [+] Добавлена виртуализация команд ADD, AND, SUB, XOR, OR с префиксом LOCK<br /> + [+] Добавлена виртуализация команды CQO<br /> + [+] Добавлено дизассемблирование команд PINSRB, PINSRD, PINSRQ, PMINSD, PMINUW, PMINUD, PMAXSB, PMAXSD, PMAXUW и PMAXUD<br /> + [+] Mach-O: Добавлена поддержка секции "__unwind_info"<br /> + [+] Mach-O: Добавлена поддержка LC_LOAD_WEAK_DYLIB<br /> + [+] Mach-O: Добавлена поддержка Delphi Berlin<br /> + [+] PE: Для драйверов добавлена поддержка Windows 10<br /> + [+] PE: При использовании опции "<a href= + "project_options.htm#Additional">Удалять отладочную информацию</a>" теперь затирается "Rich Header"<br /> + [+] Ultimate: В секции "<a href="project_files.htm">Файлы</a>" теперь можно создавать папки и использовать символы ".." для перехода в вышестоящий каталог<br /> + [+] GUI: При отображении защищаемых ANSI строк теперь используется кодовая страница из настроек Windows<br /> + [+] LUA: Добавлена возможность вызова функций из DLL<br /> + </p> + + <h3>Версия 3.0</h3> + + <p>[*] PE: Добавлена поддержка исключений в x64 коде<br /> + [*] Mach-O: Добавлена поддержка <a href="sdk_functions.htm">функций SDK</a><br /> + [*] Ultimate: Добавлена поддержка <a href="manager/usage/api.htm">функции лицензирования</a> для драйверов и приложений на VB6<br /> + [*] Ultimate: Улучшена функциональность <a href="project_files.htm">DLL Box</a> - теперь в защищаемое приложение можно включать любые файлы, в том числе и ActiveX серверы с опцией их автоматической регистрации в виртуальном реестре<br /> + [*] Улучшено обнаружение Virtual Box<br /> + [*] Скриптовый движок заменен на LUA<br /> + [*] Новая архитектура ВМ<br /> + [+] В SDK добавлена новая функция <a href="sdk_functions.htm#VMProtectIsProtected">VMProtectIsProtected</a><br /> + </p> + + <h3>Версия 2.13</h3> + + <p>[!] PE: Добавлена поддержка Delay Import<br /> + [!] PE: Улучшена совместимость с VS2012<br /> + [!] PE: Улучшена совместимость с Embarcadero RAD Studio XE3<br /> + [!] PE: Улучшена совместимость с MinGW<br /> + [!] Ultimate: Улучшена совместимость DLL Box с Windows 8<br /> + [+] WebLM: Добавлена поддержка mbstring.func_overload = 2<br /> + [+] WebLM: В коде активации добавлено поле "Дата окончания" + (VMProtectActivateLicense теперь может возвращать + ACTIVATION_EXPIRED если текущая дата больше даты окончания)<br /> + [+] WebLM: В моде для полей "Дата окончания" и "Максимальная дата + сборки" добавлено значение "дней с даты покупки"<br /></p> + + <h3>Версия 2.12</h3> + + <p>[!] PE: Исправлены ошибки, возникающие в x64 приложениях<br /> + [!] PE: Исправлена ошибка, возникающая при наличии у приложения + флага IMAGE_DLLCHARACTERISTICS_NX_COMPAT<br /> + [+] PE: Добавлена поддержка Windows 8<br /> + [+] WebLM: Добавлен русский и китайский язык<br /></p> + + <h3>Версия 2.11</h3> + + <p>[!] Исправлена ошибка, возникающая при использовании <a href= + "project_options.htm#PackOutputFile">упаковки</a> в х64 + приложениях<br /> + [!] PE: Исправлена ошибка, возникающая при использовании опции + "<a href="project_options.htm#ImportProtection">Защита + импорта</a>"<br /> + [!] PE: Исправлена ошибка, возникающая при обработке TLS секции, + имеющей релоки<br /> + [+] Ultimate: Добавлена <a href= + "manager/activation.htm">активация/деактивация</a><br /> + [+] Mach-O: Добавлена <a href= + "project_options.htm#PackOutputFile">упаковка</a><br /> + [*] PE: Поддержка DriverVerifier<br /> + [*] PE: Улучшена поддержка SEH для MSVC<br /> + [*] Mach-O: Улучшена поддержка IndirectSymbols<br /></p> + + <h3>Версия 2.10</h3> + + <p>[!] Исправлена ошибка, возникающая при использовании опции + "<a href="project_options.htm#ResourceProtection">Защита + ресурсов</a>"<br /> + [!] Исправлена ошибка, возникающая при использовании опции + "<a href="project_options.htm#ImportProtection">Защита + импорта</a>"<br /> + [!] Исправлена ошибка, возникающая при защите x64 драйверов, не + имеющих релоков<br /> + [+] Добавлена поддержка исполняемых файлов от Mac OS X (Mach-O + формат)<br /> + [+] Добавлена поддержка команды HLT<br /> + [+] В SDK добавлено новое API - <a href= + "sdk_functions.htm#VMProtectFreeString">VMProtectFreeString</a><br /> + [*] Улучшено опеределение имен маркеров и строк, помеченных с + помощью <a href= + "sdk_functions.htm#VMProtectDecryptStringA">VMProtectDecryptStringA</a>/<a href="sdk_functions.htm#VMProtectDecryptStringW">VMProtectDecryptStringW</a><br /> + [*] В имени выходного файла и параметрах лицензирования теперь + можно использовать относительные пути<br /> + [*] Улучшена поддержка SEH для Delphi<br /> + [*] SenseLock Edition: Добавлена опция "<a href= + "project_options.htm#ResourceProtection">Защита + ресурсов</a>"<br /> + [*] SenseLock Edition: В GUI версии добавлен <a href= + "manager/licenses.htm">менеджер лицензий</a><br /> + [*] SenseLock Edition: В GUI версии добавлено программирование ключей<br /> + [*] Лицензии в менеджере лицензий теперь можно копировать и + вставлять из буфера обмена<br /></p> + + <h3>Версия 2.09</h3> + + <p>[!] Исправлена ошибка, возникающая при <a href= + "project_options.htm#DebuggerDetection">обнаружении отладчика</a> + под Windows 2000<br /> + [!] Исправлена ошибка, возникающая при дизассемблировании команд + PMULHUW и LDMXCSR<br /> + [!] Исправлена ошибка, возникающая при использовании <a href= + "project_options.htm#MemoryProtection">защиты памяти</a> (не + проверялась целостность файла на диске)<br /> + [!] Ultimate: Исправлена ошибка, возникающая при запуске + защищенных файлов под Windows 2000 (требовалось наличие + EncodePointer/DecodePointer из kernel32.dll)<br /> + [*] Улучшена виртуализация обработчиков исключений для Visual + C<br /> + [*] <a href="project_options.htm#ResourceProtection">Защита + ресурсов</a> теперь доступна в Lite и Professional версиях<br /> + [*] При использовании <a href= + "project_options.htm#ResourceProtection">защиты ресурсов</a> + добавлена поддержка EnumResourceTypes, EnumResourceNames и + EnumResourceLanguages (доступно только при вызове из главного + модуля)<br /> + [+] Добавлена поддержка исключений для Borland C Builder<br /> + [+] Ultimate: Ускорена работа <a href= + "manager/usage/api.htm#VMProtectGetSerialNumberState">VMProtectGetSerialNumberState</a> + и <a href= + "manager/usage/api.htm#VMProtectGetSerialNumberData">VMProtectGetSerialNumberData</a><br /> + + [+] В скрипт для <a href= + "script_classes.htm#TLicenseManager">TLicenseManager</a> добавлен + метод <a href= + "script_classes.htm#TLicenseManager.Save">Save</a><br /> + [-] Убрана опция "Перемещать ресурсы в конец файла" - теперь + секция ресурсов всегда размещается последней<br /></p> + + <h3>Версия 2.08</h3> + + <p>[!] Исправлена ошибка, возникающая при ассемблировании команды + TEST [XXXX], REG<br /> + [!] Исправлена ошибка, возникающая при диассемблировании х64 + команд с префиксом 0x67<br /> + [*] Улучшена поддержка файлов, имеющих небольшие занчения для + SectionAlignment<br /> + [*] Улучшено опеределение имен маркеров и строк для Intel + Compiler 12 и Lazarus<br /> + [*] Улучшена <a href="project_options.htm#ImportProtection">защита + импорта</a><br /> + [*] Ultimate: Теперь можно загружать файлы проекта с параметрами + лицензирования<br /> + [+] Ultimate: Добавлена <a href= + "project_options.htm#ResourceProtection">защита ресурсов</a><br /> + [+] Ultimate: В скрипт добавлены классы <a href= + "script_classes.htm#TLicense">TLicense</a> и <a href= + "script_classes.htm#TLicenseManager">TLicenseManager</a><br /></p> + + <h3>Версия 2.07</h3> + + <p>[!] Исправлена ошибка, возникающая при работе с <a href= + "manager/licenses.htm">менеджером лицензий</a> если в настройках + Windows установлен язык отличный от английского<br /> + [+] В режиме эксперта в опциях теперь можно изменять стандартные + сообщения "Обнаружен отладчик", "Обнаружены инструменты + виртуализации", "Файл поврежден" и "Необходим серийный + номер"<br /> + [+] В скрипт для <a href= + "script_classes.htm#TVMProtector">TVMProtector</a> добавлено + свойство <a href= + "script_classes.htm#TVMProtector.Messages">Messages</a><br /> + [*] Улучшена совместимость <a href= + "project_options.htm#MemoryProtection">защиты памяти</a> с + некоторыми антивирусами<br /></p> + + <h3>Версия 2.06</h3> + + <p>[!] Исправлена ошибка с определением имен маркеров для + MinGW<br /> + [!] Исправлена ошибка, возникающая при <a href= + "project_options.htm#ImportProtection">защите импорта</a> в х64 + файлах<br /> + [!] Исправлена ошибка, возникающая при виртуализации FILD WORD + PTR [XXXX]<br /> + [!] Исправлена ошибка, возникающая при дизассемблировании + PSRLW<br /> + [!] Исправлена ошибка, возникающая в <a href= + "project_files.htm">DLL Box</a> при активном антивирусе<br /> + [*] Файл проекта теперь сохраняется в XML формате<br /> + [*] Скрипт теперь хранится в файле проекта<br /> + [*] Ultimate: <a href="manager/licenses.htm">Менеджер + лицензий</a> теперь находится в GUI версии<br /> + [*] Ultimate: Значительно ускорено выполнение кода, <a href= + "project_functions.htm#LockToKey">привязанного к серийному + номеру</a><br /> + [+] Добавлена поддержка МАР файлов для MinGW<br /> + [+] Добавлена поддержка JCLDEBUG<br /> + [+] В скрипт для <a href= + "script_classes.htm#TPEDirectory">TPEDirectory</a> добавлен метод + Clear<br /> + [+] В скрипт для <a href= + "script_classes.htm#TVMProcedure">TVMProcedure</a> добавлены + свойства <a href= + "script_classes.htm#TVMProcedure.InputSize">InputSize</a> и + <a href= + "script_classes.htm#TVMProcedure.OutputSize">OutputSize</a><br /> + [+] Ultimate: В SDK добавлены новые API - <a href= + "sdk_functions.htm#VMProtectBeginVirtualizationLockByKey">VMProtectBeginVirtualizationLockByKey</a> + и <a href= + "sdk_functions.htm#VMProtectBeginUltraLockByKey">VMProtectBeginUltraLockByKey</a><br /> + </p> + + <h3>Версия 2.05</h3> + + <p>[!] Исправлены ошибки с определением строк для программ на + MinGW<br /> + [!] Исправлены ошибка "Out of system resources", возникающая при + добавлении большого количества процедур в проект<br /> + [!] Исправлены ошибка, возникающая при выводе строк в консольной + версии<br /> + [*] Дата MAP файла теперь берется из содержимого файла<br /> + [+] Ultimate: Добавлены примеры по работе с <a href= + "manager/index.htm">системой лицензирования</a> (на MSVC и + Delphi)<br /> + [+] Ultimate: Добавлены исходные коды <a href= + "manager/keygen/keygen_dll.htm">генератора серийных номеров</a> + на MSVC<br /> + [+] Ultimate: Добавлен <a href="project_files.htm">DLL Box</a> + (доступен только для EXE файлов)<br /> + [+] Ultimate: В скрипт добавлен класс <a href= + "script_classes.htm#TInternalDLLs">TInternalDLLs</a><br /> + [+] Ultimate: В скрипт для класса <a href= + "script_classes.htm#TVMProtector">TVMProtector</a> добавлено + свойство <a href= + "script_classes.htm#TVMProtector.InternalDlls">InternalDlls</a><br /> + + [+] В скрипт для класса <a href= + "script_classes.htm#TMapRecord">TMapRecord</a> добавлено свойство + <a href= + "script_classes.htm#TMapRecord.SegmentName">SegmentName</a><br /> + [+] В скрипт для класса <a href= + "script_classes.htm#TIntelRecord">TIntelRecord</a> добавлено + свойство <a href= + "script_classes.htm#TIntelRecord.Operands">Operands</a><br /> + [+] Добавлен чешский язык<br /></p> + + <h3>Версия 2.04</h3> + + <p>[!] Исправлена ошибка, возникающая при обфускации FDIVR + [ESP+XXXX]<br /> + [!] Исправлена ошибка, возникающая при обфускации SWITCH в x64 + приложениях<br /> + [*] При использовании опции "<a href= + "project_options.htm#MemoryProtection">Защита памяти</a>" теперь + проверяется целостность файла на диске<br /> + [*] Ultimate: Улучшена интеграция модуля лицензирования с + защищаемой программой<br /> + [+] Добавлена поддержка файлов, имеющих оверлей<br /> + [+] Ultimate: Добавлен <a href= + "manager/keygen/keygen_net.htm">пример генератора серийных + номеров на C#</a><br /> + [+] Ultimate: В <a href="manager/licenses.htm">менеджере + лицензий</a> добавлен экспорт параметров продукта для генератора + на C#<br /> + [+] Ultimate: В <a href="mode_console.htm">консольную версию</a> + добавлен параметр "-lf", с помощью которого можно указать имя + файла с параметрами лицензирования<br /> + [+] Добавлен французский файл помощи<br /></p> + + <h3>Версия 2.03</h3> + + <p>[!] Исправлена ошибка, возникающая при использовании <a href= + "project_options.htm#ImportProtection">защиты импорта</a> в SYS + файлах (под Windows 7 не определялся базовый адрес hal.dll)<br /> + [!] Исправлена ошибка, возникающая при обфускации команд с + использованием CRx регистров в SYS файлах<br /> + [!] Исправлены мелкие ошибки<br /> + [*] Улучшения в <a href="manager/index.htm">системе + лицензирования</a> Ultimate версии<br /> + [+] Добавлен французский язык<br /></p> + + <h3>Версия 2.02</h3> + + <p>[!] В SenseLock Edition исправлена ошибка, возникающая при + одновременной работе нескольких программ, которые используют + разные лицензии в ключе (пользователям SenseLock Edition + необходимо обновить прошивку в мастер ключе)<br /> + [!] Исправлена ошибка при дизассемблировани EntryPoint у программ + на Delphi<br /> + [!] Исправлены мелкие ошибки<br /> + [*] Важные улучшения в <a href="manager/index.htm">системе + лицензирования</a> Ultimate версии<br /> + [*] SenseLock Edition теперь использует систему лицензирования + Ultimate версии (пользователям SenseLock Edition необходимо + обновить лицензию в мастер ключе)<br /> + [*] Улучшено определение строк, помеченных с помощью <a href= + "sdk_functions.htm#VMProtectDecryptStringA">VMProtectDecryptStringA</a>/<a href="sdk_functions.htm#VMProtectDecryptStringW">VMProtectDecryptStringW</a><br /> + + [+] В GUI добавлена поддержка Unicode<br /> + [+] Добавлен традиционный китайский язык<br /></p> + + <h3>Версия 2.01</h3> + + <p>[!] Исправлены мелкие ошибки в инсталляторе, <a href= + "manager/licenses.htm">менеджере лицензий</a> и <a href= + "sdk_functions.htm">SDK</a><br /> + [*] Для регистрации VMProtect сейчас используется собственная + <a href="manager/index.htm">система лицензирования</a><br /> + [+] Добавлен упрощенный китайский язык<br /></p> + + <h3>Версия 2.0</h3> + + <p>[!] Исправлены ошибки при дизассемблировании и виртуализации + команд CALL FWORD PTR [XXXX] и JMP FWORD PTR [XXXX]<br /> + [!] В версии SenseLock Edition исправлена ошибка, возникающая при + запрое серийного номер ключа после смены стандартного PIN + пользователя<br /> + [!] Исправлена ошибка, возникающая при виртуализации SWITCH в х64 + приложениях<br /> + [!] Исправлена ошибка, возникающая при дизассемблировании команд + ROL, ROR, RCL, RCR, SHL, SHR, SAL и SAR, имеющих REX преффикс в + х64 приложениях<br /> + [!] Исправлена ошибка, возникающая при виртуализации команды + CMOVxx<br /> + [!] Исправлены мелкие ошибки<br /> + [*] Обновлен файл помощи на русском<br /> + [*] Обновлен файл помощи на английском<br /> + [+] Добавлена <a href="manager/index.htm">система + лицензирования</a> (доступна только в Ultimate версии)<br /> + [+] В SDK добавлены новые API - <a href= + "sdk_functions.htm#VMProtectDecryptStringA">VMProtectDecryptStringA</a> + и <a href= + "sdk_functions.htm#VMProtectDecryptStringW">VMProtectDecryptStringW</a><br /> + + [+] В скрипт для класса <a href= + "script_classes.htm#TVMProcedure">TVMProcedure</a> добавлено + свойство <a href= + "script_classes.htm#TVMProcedure.CompilationOptions">CompilationOptions</a><br /> + + [+] В скрипт для класса <a href= + "script_classes.htm#TVMProcedure">TVMProcedure</a> добавлены + свойства <a href= + "script_classes.htm#TVMProcedure.SELicense">SELicense</a> и + <a href="script_classes.htm#TVMProcedure.SEVersion">SEVersion</a> + (доступны только в SenseLock Edition)<br /> + [+] В скрипт для класса <a href= + "script_classes.htm#TVMProtector">TVMProtector</a> добавлены + свойства <a href= + "script_classes.htm#TVMProtector.VMSectionName">VMSectionName</a> + и <a href= + "script_classes.htm#TVMProtector.VMExecutorCount">VMExecutorCount</a><br /> + + [+] В скрипт для класса <a href= + "script_classes.htm#TVMProtector">TVMProtector</a> добавлены + свойства <a href= + "script_classes.htm#TVMProtector.SEMasterPassword">SEMasterPassword</a>, + <a href= + "script_classes.htm#TVMProtector.SEUserPIN">SEUserPIN</a>, + <a href="script_classes.htm#TVMProtector.SEKeyID">SEKeyID</a>, + <a href="script_classes.htm#TVMProtector.SELicense">SELicense</a> + и <a href= + "script_classes.htm#TVMProtector.SEVersion">SEVersion</a> + (доступны только в SenseLock Edition)<br /> + [-] Убрана опция "Динамическое создание онлайн команд"<br /></p> + + <h3>Версия 1.81</h3> + + <p>[!] Исправлена ошибка, возникающая при исполнении + промутированного кода на процессорах Pentium 4<br /> + [!] Исправлена ошибка, возникающая при исполнении + завиртуализированного кода на некоторых процессорах Athlon<br /> + [!] Исправлены ошибки, возникающие при дизассемблировании и + виртуализации структур, описывающих обработчики исключений с + фильтром на класс исключения (для программ на Delphi и Borland + C++ Builder)<br /> + [!] Исправленa ошибкa, возникающая при использовании <a href= + "project_options.htm#VirtualMachines">нескольких ВМ</a> в + 64-битных файлах<br /> + [!] Исправлены мелкие ошибки<br /> + [*] Улучшено определение имен <a href= + "use_markers.htm">маркеров</a> (для программ на Visual C)<br /> + [*] Значительно снижено потребление памяти в процессе + компиляции<br /> + [*] Ресурс "HTML" теперь не упаковывается<br /> + [*] Обновлен файл помощи на русском<br /> + [+] В режиме "Мастер" добавлен + поиск процедур по маске<br /> + [+] Добавлен <a href="project_options.htm#PackOutputFile">новый + режим упаковки</a> с более высокой степенью сжатия<br /> + [+] Добавлена поддержка файлов, имеющих TLS-калбеки<br /> + [+] В SDK добавлено новое API - <a href= + "sdk_functions.htm#VMProtectIsValidImageCRC">VMProtectIsValidImageCRC</a><br /> + </p> + + <h3>Версия 1.8</h3> + + <p>[!] Исправлены ошибки, возникающие при <a href= + "project_options.htm#ImportProtection">защите импорта</a> в + SYS-файлах<br /> + [!] Исправлены ошибки, возникающие при <a href= + "project_options.htm#MemoryProtection">защите памяти</a> в + DLL/SYS-файлах<br /> + [!] Исправлены ошибки, возникающие при использовании <a href= + "project_options.htm#VirtualMachines">нескольких ВМ</a> в + DLL/SYS-файлах<br /> + [!] Исправлена ошибка, возникающая при мутации кода, имеющего + обработчики исключений<br /> + [!] Исправлена ошибка, возникающая при одновременном + использовании <a href= + "project_options.htm#MemoryProtection">защиты памяти</a> и + <a href="project_options.htm#Watermarks">водяных знаков</a><br /> + [!] Исправлены мелкие ошибки<br /> + [*] Улучшено определение ссылок на строки, помеченных <a href= + "use_markers.htm">маркерами</a> (теперь не нужно помечать + маркерами все ссылки на защищаемую строку)<br /> + [*] Улучшена <a href="project_options.htm#ImportProtection">защита + импорта</a><br /> + [*] Улучшено <a href= + "project_options.htm#DebuggerDetection">определение + отладчика</a><br /> + [*] Обновлен файл помощи на русском<br /> + [+] В GUI-версии теперь можно сохранять файлы проекта под + разными именами<br /> + [+] Теперь можно открывать файлы + проекта<br /> + [+] Добавлено <a href= + "project_options.htm#VirtualizationToolsDetection">обнаружение + Sandboxie</a><br /> + [+] Добавлена поддержка файлов, скомпилированных с ключем + /SAFESEH<br /> + [+] Добавлена поддержка CodeGear 2009<br /> + [+] Теперь можно задавать имена маркерам (при использовании + <a href= + "sdk_functions.htm#VMProtectBegin">VMProtectBegin</a>/<a href= + "sdk_functions.htm#VMProtectBeginMutation">VMProtectBeginMutation</a>/<a href="sdk_functions.htm#VMProtectBeginVirtualization">VMProtectBeginVirtualization</a>/<a href="sdk_functions.htm#VMProtectBeginUltra">VMProtectBeginUltra</a> + из VMProtectSDKxx.dll/VMProtectDDKxx.sys)<br /> + [+] В SDK добавлены новые API (<a href= + "sdk_functions.htm#VMProtectIsDebuggerPresent">VMProtectIsDebuggerPresent</a> + и <a href= + "sdk_functions.htm#VMProtectIsVirtualMachinePresent">VMProtectIsVirtualMachinePresent</a>)<br /> + + [+] Для версии SenseLock Edition добавлена утилита "Система + удаленного обновления и лицензирования"<br /> + [+] Для версии SenseLock Edition добавлена привязка к + идентификатору ключа<br /></p> + + <h3>Версия 1.7</h3> + + <p>[!] Секции, имеющие флаги SHAREABLE+WRITABLE, теперь не + упаковываются<br /> + [!] Исправлены мелкие ошибки<br /> + [*] Улучшена <a href="project_options.htm#ImportProtection">защита + импорта</a> для SYS-файлов<br /> + [*] Улучшена <a href= + "project_options.htm#PackOutputFile">упаковка</a> SYS-файлов + (упакованным секциям больше не устанавливается флаг + WRITABLE)<br /> + [*] Улучшено <a href= + "project_options.htm#DebuggerDetection">определение + отладчика</a><br /> + [+] Добавлена опция "<a href= + "project_options.htm#MemoryProtection">Защита памяти</a>" (данная + опция защищает память от изменений во время работы + приложения)<br /> + [+] Добавлена опция "<a href= + "project_options.htm#VirtualizationToolsDetection">Определение + инструментов виртуализации (VMware/Virtual PC)</a>"<br /> + [+] В скрипт для класса <a href= + "script_classes.htm#TPEFile">TPEFile</a> добавлено свойство + <a href= + "script_classes.htm#TPEFile.EntryPoint">EntryPoint</a><br /></p> + + <h3>Версия 1.65</h3> + + <p>[!] Исправлены мелкие ошибки<br /> + [*] Улучшена <a href="project_options.htm#ImportProtection">защита + импорта</a><br /> + [*] Улучшено <a href= + "project_options.htm#DebuggerDetection">определение + отладчика</a><br /> + [+] Добавлено определение непарных <a href= + "use_markers.htm">маркеров</a> (непарные маркеры доступны в общем + списке объектов)<br /> + [+] Добавлены маркеры с предустановленным типом компиляции: + VMProtectBeginVirtualization, VMProtectBeginMutation и + VMProtectBeginUltra<br /> + [+] Добавлен традиционный китайский язык<br /></p> + + <h3>Версия 1.64</h3> + + <p>[!] Исправлена ошибка, возникающая при работе <a href= + "project_options.htm#PackOutputFile">упакованного файла</a>, + имеющего ресурсы "TYPELIB", "REGISTRY" и "MUI"<br /> + [!] Исправлена ошибка R6002, возникающая при работе упакованного + файла (для программ на Visual C)<br /> + [!] Исправлены ошибка, возникающая при использовании опции + "<a href="project_options.htm#ImportProtection">Защита + импорта</a>" в 64-битных SYS-файлах<br /> + [!] Исправлены мелкие ошибки<br /> + [*] Файл настроек теперь сохраняется в каталог + %APPDATA%/PolyTech/VMProtect<br /> + [*] Улучшена <a href="project_options.htm#ImportProtection">защита + импорта</a><br /> + [+] Добавлена опция "<a href= + "project_options.htm#VirtualMachines">Виртуальные Машины</a>" + (разные завиртуализированные участки кода будут выполняться на + разных виртуальных машинах с разной архитектурой)<br /> + [+] Добавлена опция "<a href= + "project_options.htm#DebuggerDetection">Определение отладчика</a>" + (при обнаружении отладчика защищенное приложение будет показывать + соответствующее сообщение и закрываться)<br /> + [+] В скрипт для класса <a href= + "script_classes.htm#TPESection">TPESection</a> добавлено свойство + <a href= + "script_classes.htm#TPESection.IncludedInPacking">IncludedInPacking</a><br /> + + [+] Добавлена поддержка команды IRETD<br /> + [+] Добавлен пример c использованием маркеров в Lazarus<br /></p> + + <h3>Версия 1.63</h3> + + <p>[!] Исправлены ошибки, возникающие при использовании опции + "<a href="project_options.htm#ImportProtection">Защита + импорта</a>"<br /> + [!] Исправлены мелкие ошибки<br /> + [+] В скрипт добавлено событие <a href= + "script_events.htm#OnBeforePackFile">OnBeforePackFile</a><br /> + [+] В скрипт для класса <a href= + "script_classes.htm#TPEFile">TPEFile</a> добавлено свойство + <a href="script_classes.htm#TPEFile.Handle">Handle</a><br /> + [+] Добавлен пример c использованием <a href= + "use_markers.htm">маркеров</a> в Free Pascal<br /> + [*] Улучшен контроль целостности ВМ объектов<br /></p> + + <h3>Версия 1.62</h3> + + <p>[!] Исправлены ошибки, возникающие при использовании опции + "<a href="project_options.htm#ImportProtection">Защита + импорта</a>"<br /> + [!] Исправлена ошибка, возникающая при обработке исключения в + TRY/EXCEPT/END блоке в режиме "Ультра" (для программ на Delphi и + Borland C++ Builder)<br /> + [*] Улучшена <a href="project_options.htm#ImportProtection">защита + импорта</a> для SYS-файлов<br /> + [+] Каждый объект из проекта теперь может иметь свои опции + компиляции для более тонкой настройки быстродействия + (индивидуальные опции настраиваются в дереве проекта)<br /> + [+] Добавлена опция "Перемещать ресурсы в конец файла"<br /> + [+] Добавлен пример использования расширенных маркеров (папка + Examples\Scripts\UseExtMarkers)<br /></p> + + <h3>Версия 1.61</h3> + + <p>[!] Исправлена ошибка, возникающая при запуске упакованных + файлов под управлением Windows 95/98<br /> + [!] Исправлены мелкие ошибки<br /> + [+] В Lite-версии добавлена возможность передачи имени файла + через командную строку<br /> + [+] В режиме "Мастер" добавлена + история<br /> + [+] В режиме "Мастер" добавлен + выбор языка<br /> + [+] Добавлена опция "<a href= + "project_options.htm#ImportProtection">Защита импорта</a>" + (рекомендуется использовать совместно с упаковкой выходного + файла)<br /> + [+] В <a href="mode_console.htm">консольной версии</a> добавлен + параметр "-we" (при использовании этого параметра все + предупреждения будут отображаться как ошибки)<br /> + [+] В скрипт добавлен класс <a href= + "script_classes.htm#TPEResourceRecords">TPEResourceRecords</a><br /> + + [+] В скрипт для класса <a href= + "script_classes.htm#TPEFile">TPEFile</a> добавлено свойство + <a href= + "script_classes.htm#TPEFile.ResourceRecords">ResourceRecords</a><br /> + </p> + + <h3>Версия 1.6</h3> + + <p>[!] Исправлены мелкие ошибки<br /> + [*] Улучшена работа с одинаковыми строками (теперь одинаковые + строки отображаются как один объект, содержащий несколько + записей)<br /> + [+] Добавлена возможность упаковки выходного файла<br /> + [+] В скрипт добавлен класс <a href= + "script_classes.htm#TPEExportRecords">TPEExportRecords</a><br /> + [+] В скрипт для класса <a href= + "script_classes.htm#TPEFile">TPEFile</a> добавлено свойство + <a href= + "script_classes.htm#TPEFile.ExportRecords">ExportRecords</a><br /> + + [+] В скрипт добавлено событие <a href= + "script_events.htm#OnBeforeSaveFile">OnBeforeSaveFile</a><br /> + [+] Добавлен файл помощи на китайском языке (перевод Wang + Xiaopeng)<br /> + [+] При загрузке MAP-файла добавлена проверка даты и времени + модификации (если дата и время модификации MAP-файла отличается + от даты и времени модификации защищаемого файла, то MAP-файл не + будет загружен)<br /></p> + + <h3>Версия 1.56</h3> + + <p>[!] Исправлена ошибка, возникающая при виртуализации команд + BT, BTC, BTR и BTS<br /> + [!] Исправлены мелкие ошибки<br /> + [*] Список опций защиты отсортирован в порядке убывания + приоритета<br /> + [*] Улучшена поддержка SEH для VC8<br /> + [*] Улучшено динамическое создание онлайн-команд<br /> + [*] Улучшен контроль целостности объектов ВМ<br /> + [+] Добавлена поддержка команд PREFETCH и PREFETCHW<br /> + [+] В скрипт добавлены функции CompareText и + AnsiCompareText<br /> + [+] В скрипт для класса <a href= + "script_classes.htm#TPEFile">TPEFile</a> добавлено свойство + <a href="script_classes.htm#TPEFile.Size">Size</a><br /> + [+] Добавлен пример c использованием <a href= + "use_markers.htm">маркеров</a> в MinGW<br /> + [+] Добавлен китайский язык (перевод Wang Xiaopeng)<br /> + [+] В окне добавления процедуры добавлен <a href= + "project_functions.htm#Search">поиск по маске</a> с + использованием символов "*" и "?"<br /> + [+] В сообщения компилятора теперь выводится информация о размере + выходного файла<br /></p> + + <h3>Версия 1.55</h3> + + <p>[!] Исправлена ошибка, возникающая при работе с файлом, + имеющим "невыровненное" значение ImageSize<br /> + [!] Исправлена ошибка, возникающая при определении начала блока + TRY для программ на Delphi<br /> + [!] Исправлена ошибка, возникающая при обработке "смешанного" + кода из Discardable и NonDiscardable секций в SYS-файлах<br /> + [!] Исправлена ошибка, возникающая при виртуализации 64-битных + DLL/SYS-файлов<br /> + [*] Восстановлена опция "Шифрация регистров при выходе из + ВМ"<br /> + [+] В скрипт добавлен класс <a href= + "script_classes.htm#TIniFile">TIniFile</a><br /> + [+] В скрипт для класса <a href= + "script_classes.htm#TPEFile">TPEFile</a> добавлены дополнительные + свойства и методы<br /> + [+] В GUI-версию добавлен калькулятор для расчета смещений в + файле по адресам<br /> + [+] Добавлен итальянский язык (перевод Gabriele Lanza)<br /></p> + + <h3>Версия 1.54</h3> + + <p>[!] Исправлена ошибка, возникающая при мутации команды PUSH + ESP<br /> + [!] Исправлена ошибка, возникающая при виртуализации команды + FLDCW [ESP+xxxx]<br /> + [!] Исправлена ошибка, возникающая при обфускации байт-кода<br /> + [*] Улучшения в GUI<br /> + [+] Добавлены немецкий и испанский языки<br /> + [+] Добавлена поддержка <a href="script.htm">скриптов</a><br /> + [+] В <a href="mode_console.htm">консольной версии</a> добавлен + параметр, с помощью которого можно указать имя файла со + скриптом<br /></p> + + <h3>Версия 1.53</h3> + + <p>[!] Исправлены ошибки, возникающие при виртуализации кода в + DLL/SYS-файлах<br /> + [*] Улучшения в виртуализации кода<br /> + [*] В <a href="mode_console.htm">консольной версии</a> при + перенаправлении вывода текста в файл убраны бегущие + проценты<br /> + [+] Добавлена возможность вставки маркеров для x86-64<br /> + [+] Добавлена возможность создавать папки в проекте<br /> + [+] В <a href="mode_console.htm">консольной версии</a> добавлен + параметр, с помощью которого можно указать имя файла + проекта<br /></p> + + <h3>Версия 1.52</h3> + + <p>[!] Исправлена ошибка, возникающая при мутации команд CMOVxx, + CMPXCHG и CMPXCHG8B<br /> + [!] Исправлена ошибка, возникающая при мутации команды LEA + ESP,[ESP+xxxx]<br /> + [*] Команды RCL и RCR добавлены в базовую логику ВМ<br /> + [+] Добавлена поддержка x86-64<br /> + [+] В GUI-версии на закладке "<a href= + "project_options.htm">Опции</a>" теперь можно указать имя + выходного файла<br /> + [+] Добавлена справка на русском и английском языках<br /></p> + + <h3>Версия 1.51</h3> + + <p>[!] Исправлена ошибка, возникающая при создании "Relocation + Table" нулевой длины<br /> + [!] Исправлена ошибка, возникающая при мутации команды CALL + [xxxx] в режиме "Мутация" в DLL/SYS-файлах<br /> + [!] В примере на Delphi в определение VMProtectBegin добавлена + команда, препятствующая оптимизации VMProtectBegin (оптимизация + VMProtectBegin могла приводить к неработоспособности защищенного + файла)<br /> + [+] Добавлена опция "Автосохранение проекта после + компиляции"<br /></p> + + <h3>Версия 1.5</h3> + + <p>[!] Исправлена ошибка, возникающая при перетаскивании файлов в + главное окно<br /> + [!] Исправлена ошибка, возникающая при работе с файлами, имеющими + атрибут "Read only"<br /> + [!] Исправлены мелкие недочеты при компиляции в режиме + "Ультра"<br /> + [*] Защищенный файл теперь имеет точно такие же атрибуты как + оригинальный файл<br /> + [+] В список защищаемых процедур теперь можно включать строки + (присвоение строк необходимо отмечать маркерами)<br /> + [+] В дистрибутив добавлены примеры c использованием маркеров в + Borland C++ Builder, Delphi, MASM, Visual Basic и Visual + C++<br /> + [+] Добавлена опция "Интегрировать в оболочку"<br /></p> + + <h3>Версия 1.4</h3> + + <p>[!] Исправлена ошибка, возникающая при мутации команд IMUL, + MUL, IDIV, DIV<br /> + [!] Исправлена ошибка, возникающая при виртуализации нескольких + CASE таблиц, идущих друг за другом<br /> + [!] Исправлена ошибка, возникающая при виртуализации команд POP + word/dword ptr [esp+xxxx] и IMUL reg8<br /> + [!] Исправлена ошибка, возникающая при дизассемблировании команд + MOVNTPS и MOVNTPD<br /> + [+] Добавлен новый тип компиляции "Ультра (мутация + + виртуализация)"<br /> + [+] Добавлен выбор типа компиляции в окне добавления/изменения + процедуры<br /> + [+] Добавлен поиск водяных знаков в процессах (используется для + поиска водяных знаков в упакованных файлах)<br /> + [*] Улучшена совместимость с ASM компиляторами (TASM, MASM и + т.п.)<br /></p> + + <h3>Версия 1.3</h3> + + <p>[!] Исправлена ошибка, возникающая при эмуляции команды FILD + word ptr [xxxx]<br /> + [+] Для каждой процедуры можно указать тип компиляции ("Мутация" + или "Виртуализация")<br /></p> + + <h3>Версия 1.25</h3> + + <p>[+] Добавлена поддержка SEH для VC7-8<br /> + [+] Добавлена поддержка маркеров в Visual Basic (начало и конец + участка маркируются вставками на бейсике - Call VarPtr("VMProtect + begin") и Call VarPtr("VMProtect end"))<br /> + [*] В зарегистрированной версии программы исполнитель ВМ теперь + полностью видоизменяется (препятствует автоматическому + определению защиты сигнатурными сканерами PEiD, RDG Packer + Detector и т.п.)<br /></p> + + <h3>Версия 1.24</h3> + + <p>[+] Добавлена возможность вставлять в защищаемый файл водяные + знаки<br /> + [*] Исполнитель ВМ теперь полностью поддерживает многопоточные + приложения (теперь нет необходимости создавать процедуру + выделения памяти для нужд исполнителя)<br /> + [-] Убрана опция с выбором функции выделения памяти для нужд + исполнителя<br /></p> + + <h3>Версия 1.23</h3> + + <p>[!] Исправлены мелкие недочеты [+] Добавлен режим работы + "Мастер" [+] В дереве процедур добавлен показ ссылок [*] Опции + "Скрывать константы", "Динамическое создание онлайн-команд", + "Шифрация регистров при переходах", "Контроль целостности + объектов ВМ" и многое другое теперь доступны только для + зарегистрированных пользователей</p> + + <h3>Версия 1.22.2</h3> + + <p>[!] Исправлена ошибка, возникающая при компиляции проектов с + включенной опцией "Выделение памяти в исполнителе"<br /></p> + + <h3>Версия 1.22</h3> + + <p>[!] Исправлены мелкие ошибки<br /> + [+] Добавлена возможность контроля целостности байт-кода (при + включенной опции "Контроль целостности объектов ВМ")<br /></p> + + <h3>Версия 1.21</h3> + + <p>[!] Исправлена ошибка, возникающая при эмуляции CMPXCHG8b, + если в операндах участвуют регистры EAX и EDX<br /> + [+] В исполнителе присутствуют только те команды, которые будут + участвовать при исполнении байт-кода<br /> + [-] Из базовой логики ВМ убраны некоторые команды (затрудняет + анализ и декомпиляцию байт-кода)<br /></p> + + <h3>Версия 1.2</h3> + + <p>[!] Исправлена ошибка, возникающая при перемещении директории + Bound Import<br /> + [+] Добавлена возможность включения в проект участков кода, + помеченных маркерами (начало и конец участка маркируются + вставками на ассемблере - "db $EB,$10,'VMProtect begin',0" и "db + $EB,$0E,'VMProtect end',0")<br /> + [+] Добавлена возможность включать в проект экспортируемые + функции<br /> + [-] Убрана опция "Шифрация байт-кода" (шифрация байт-кода теперь + всегда включена)<br /></p> + + <h3>Версия 1.1</h3> + + <p>[!] Исправлены ошибки, возникающие при: эмуляции SBB + (неправильное состояние некоторых флагов); эмуляции CMOVxx, + CMPXCHG и CMPXCHG8b (в случаях, когда в качестве второго + аргумента использовалась адресация с применением регистра ESP или + DWORD значения)<br /> + [+] Добавлена поддержка SEH в VB6 (native)<br /> + [+] Добавлена поддержка MAP-файлов, генерируемых IDA<br /> + [+] Добавлена возможность пакетного добавления процедур<br /> + [+] Добавлен показ ссылок на команды прямо в листинге + процедур<br /> + [+] Добавлена новая опция "Шифрация регистров при + переходах"<br /></p> + + <h3>Версия 1.09</h3> + + <p>[*] Доработан процесс определения конца процедуры при + дизассемблировании циклов<br /> + [+] Для совместимости с UPX добавлена очистка флага Sharable у + Writable-секций (в случаях, когда старая таблица релоков + используется для нужд ВМ)<br /></p> + + <h3>Версия 1.08</h3> + + <p>[*] Ускорен процесс дизассемблирования больших участков + кода<br /> + [*] Доработан механизм метаморфизма исполнителя + байт-кода<br /></p> + + <h3>Версия 1.07</h3> + + <p>[!] Исправлены ошибки, возникающие при работе с PE файлами (в + случаях, когда виртуальный размер секций кода равен нулю); + обфускации FPU команд (ошибки приводили к неправильному + результату); дизассемблировании (вместо CWDE распознавалась + команда CWD); эмуляции команд ROL и ROR (если аргумент имел + размер в 1 байт)<br /> + [+] Добавлена поддержка группы команд SSE2<br /></p> + + <h3>Версия 1.06</h3> + + <p>[!] Исправлены ошибки, приводящие к неправильному состоянию A + флага после эмуляции команд SUB, CMP, DEC, NEG, CMPXCHG, SCAS и + CMPS.<br /> + [!] Исправлена ошибка, возникающая при работе с "невыровненным" + файлом<br /> + [+] Добавлена поддержка инструкций BSF, BSR и CMPXCHG8b<br /> + [+] Для многопоточных приложений теперь можно указать процедуру + выделения памяти для исполнителя ВМ (процедура выделения памяти + должна быть определена как fastcall)<br /></p> + + <h3>Версия 1.05</h3> + + <p>[+] Добавлена поддержка инструкций FUCOMPP и FCMOVxx<br /> + [+] При просмотре участков кода добавлен показ типов строк + (ANSI/Unicode/Pascal) и комментарии для полей структур, + создаваемых компиляторами<br /> + [+] Добавлена процедура метаморфизма исполнителя байт-кода<br /> + [+] Добавлены новые опции компиляции: "Шифрация байт-кода" и + "Удаление настраиваемых элементов (только для EXE файлов)"<br /> + [-] Убрана опция "Обфускация байт-кода" (обфускация байт-кода + теперь всегда включена)<br /></p> + + <h3>Версия 1.04</h3> + + <p>[!] Исправлена ошибка при определении обработчиков SEH для + С++<br /> + [*] Полностью переработан обфускатор байт-кода<br /> + [+] Добавлена подцветка настраиваемых элементов при просмотре + участков кода<br /></p> + + <h3>Версия 1.03</h3> + + <p>[+] Использование "свободного места" из-под оригинальных + участков кода для хранения байт-кода<br /> + [+] Добавлено распознавание "коротких" строк в pascal-формате + (первый байт - длина строки)<br /></p> + + <h3>Версия 1.02</h3> + + <p>[!] Исправлены ошибки с выполнением онлайн-команд в + DLL/SYS<br /> + [*] Изменён алгоритм подсчёта контрольной суммы байт-кода<br /> + [+] Добавлена опция "Контроль целостности исполнителя ВМ" (также + работает как противоотладочный приём при отладке исполнителя если + отладчик использует в качестве точек остановки INT 03).<br /> + [+] Использование "старой" таблицы настраиваемых элементов для + хранения байт-кода<br /></p> + + <h3>Версия 1.01</h3> + + <p>[!] Исправлена ошибка при создании файлов с настраиваемыми + элементами (ошибка возникала при работе DLL/SYS-файлов в + операционных системах Windows 95/98/Me)<br /> + [!] Исправлены мелкие ошибки в дизассемблере<br /> + [+] Добавлена поддержка инструкций F2XM1, FABS, FCLEX, FCOS, + FDECSTP, FINCSTP, FINIT, FLDCW, FLDLN2, FLDLG2, FPREM, FREM1, + FPTAN, FRNDINT, FSIN, FSTCW, FTST, FYL2X, FPATAN, FLDZ, + FISTP<br /> + [+] Добавлена поддержка MAP-файлов от Borland C Builder<br /> + [+] В настройках программы теперь можно выбирать язык интерфейса + и сообщений (доступны русский и английский языки)<br /></p> + + <h3>Версия 1.0</h3> + + <p>[!] Исправлены мелкие ошибки, связанные с интерфейсом<br /> + [+] Добавлена поддержка инструкций CMOV и CMPXCHG<br /></p> + + <h3>Версия 0.97</h3> + + <p>[!] Исправлены мелкие ошибки, связанные с интерфейсом<br /> + [+] Добавлена поддержка Virtual Pascal<br /></p> + + <h3>Версия 0.96</h3> + + <p>[!] Исправлены ошибки в компиляторе (некорректная работа с C + флагом при компиляции инструкций NEG и SBB; более корректная + обработка POPF; неправильная проверка CRC байт-кода при обработке + внешних условных переходов)<br /> + [!] Исправлены ошибки в исполнителе ВМ, связанные с обфускацией + байт-кода<br /> + [+] Улучшена обработка MAP-файла, генерируемого C/C++ + компиляторами (имена процедур содержат информацию об + аргументах)<br /></p> + + <h3>Версия 0.94</h3> + + <p>[!] Исправлено множество ошибок<br /></p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/images/activation_setup.png b/help/ru/images/activation_setup.png Binary files differnew file mode 100644 index 0000000..4ca4618 --- /dev/null +++ b/help/ru/images/activation_setup.png diff --git a/help/ru/images/button_action.png b/help/ru/images/button_action.png Binary files differnew file mode 100644 index 0000000..8309595 --- /dev/null +++ b/help/ru/images/button_action.png diff --git a/help/ru/images/button_compilation.png b/help/ru/images/button_compilation.png Binary files differnew file mode 100644 index 0000000..bd2cc6e --- /dev/null +++ b/help/ru/images/button_compilation.png diff --git a/help/ru/images/button_execute.png b/help/ru/images/button_execute.png Binary files differnew file mode 100644 index 0000000..82f3c9f --- /dev/null +++ b/help/ru/images/button_execute.png diff --git a/help/ru/images/button_open.png b/help/ru/images/button_open.png Binary files differnew file mode 100644 index 0000000..b6b5bcb --- /dev/null +++ b/help/ru/images/button_open.png diff --git a/help/ru/images/button_project.png b/help/ru/images/button_project.png Binary files differnew file mode 100644 index 0000000..19a37af --- /dev/null +++ b/help/ru/images/button_project.png diff --git a/help/ru/images/button_save.png b/help/ru/images/button_save.png Binary files differnew file mode 100644 index 0000000..5df92e5 --- /dev/null +++ b/help/ru/images/button_save.png diff --git a/help/ru/images/button_search.png b/help/ru/images/button_search.png Binary files differnew file mode 100644 index 0000000..c660ad6 --- /dev/null +++ b/help/ru/images/button_search.png diff --git a/help/ru/images/codelock_error.png b/help/ru/images/codelock_error.png Binary files differnew file mode 100644 index 0000000..cc89c01 --- /dev/null +++ b/help/ru/images/codelock_error.png diff --git a/help/ru/images/delphi_map.png b/help/ru/images/delphi_map.png Binary files differnew file mode 100644 index 0000000..c50db71 --- /dev/null +++ b/help/ru/images/delphi_map.png diff --git a/help/ru/images/delphi_project.png b/help/ru/images/delphi_project.png Binary files differnew file mode 100644 index 0000000..f208ba5 --- /dev/null +++ b/help/ru/images/delphi_project.png diff --git a/help/ru/images/depends.png b/help/ru/images/depends.png Binary files differnew file mode 100644 index 0000000..b9dd025 --- /dev/null +++ b/help/ru/images/depends.png diff --git a/help/ru/images/expert_find.png b/help/ru/images/expert_find.png Binary files differnew file mode 100644 index 0000000..9941871 --- /dev/null +++ b/help/ru/images/expert_find.png diff --git a/help/ru/images/export_keys.png b/help/ru/images/export_keys.png Binary files differnew file mode 100644 index 0000000..780c5ed --- /dev/null +++ b/help/ru/images/export_keys.png diff --git a/help/ru/images/functions.png b/help/ru/images/functions.png Binary files differnew file mode 100644 index 0000000..2d2d234 --- /dev/null +++ b/help/ru/images/functions.png diff --git a/help/ru/images/import_key.png b/help/ru/images/import_key.png Binary files differnew file mode 100644 index 0000000..8753423 --- /dev/null +++ b/help/ru/images/import_key.png diff --git a/help/ru/images/licenses1.png b/help/ru/images/licenses1.png Binary files differnew file mode 100644 index 0000000..6b13b78 --- /dev/null +++ b/help/ru/images/licenses1.png diff --git a/help/ru/images/lock_to_serial.png b/help/ru/images/lock_to_serial.png Binary files differnew file mode 100644 index 0000000..80d1cad --- /dev/null +++ b/help/ru/images/lock_to_serial.png diff --git a/help/ru/images/main_window.png b/help/ru/images/main_window.png Binary files differnew file mode 100644 index 0000000..af06caa --- /dev/null +++ b/help/ru/images/main_window.png diff --git a/help/ru/images/menu_edit.png b/help/ru/images/menu_edit.png Binary files differnew file mode 100644 index 0000000..93435aa --- /dev/null +++ b/help/ru/images/menu_edit.png diff --git a/help/ru/images/menu_file.png b/help/ru/images/menu_file.png Binary files differnew file mode 100644 index 0000000..464b177 --- /dev/null +++ b/help/ru/images/menu_file.png diff --git a/help/ru/images/menu_help.png b/help/ru/images/menu_help.png Binary files differnew file mode 100644 index 0000000..b15596d --- /dev/null +++ b/help/ru/images/menu_help.png diff --git a/help/ru/images/menu_project.png b/help/ru/images/menu_project.png Binary files differnew file mode 100644 index 0000000..5277978 --- /dev/null +++ b/help/ru/images/menu_project.png diff --git a/help/ru/images/menu_project_import.png b/help/ru/images/menu_project_import.png Binary files differnew file mode 100644 index 0000000..1c3991f --- /dev/null +++ b/help/ru/images/menu_project_import.png diff --git a/help/ru/images/menu_tools.png b/help/ru/images/menu_tools.png Binary files differnew file mode 100644 index 0000000..66dd6ba --- /dev/null +++ b/help/ru/images/menu_tools.png diff --git a/help/ru/images/preferences.png b/help/ru/images/preferences.png Binary files differnew file mode 100644 index 0000000..e4505de --- /dev/null +++ b/help/ru/images/preferences.png diff --git a/help/ru/images/project_add_folder.png b/help/ru/images/project_add_folder.png Binary files differnew file mode 100644 index 0000000..7cb1844 --- /dev/null +++ b/help/ru/images/project_add_folder.png diff --git a/help/ru/images/project_add_function.png b/help/ru/images/project_add_function.png Binary files differnew file mode 100644 index 0000000..a8ffe5b --- /dev/null +++ b/help/ru/images/project_add_function.png diff --git a/help/ru/images/project_add_license.png b/help/ru/images/project_add_license.png Binary files differnew file mode 100644 index 0000000..52a9153 --- /dev/null +++ b/help/ru/images/project_add_license.png diff --git a/help/ru/images/project_file_delete.png b/help/ru/images/project_file_delete.png Binary files differnew file mode 100644 index 0000000..90dae90 --- /dev/null +++ b/help/ru/images/project_file_delete.png diff --git a/help/ru/images/project_file_menu.png b/help/ru/images/project_file_menu.png Binary files differnew file mode 100644 index 0000000..de181ae --- /dev/null +++ b/help/ru/images/project_file_menu.png diff --git a/help/ru/images/project_file_protection.png b/help/ru/images/project_file_protection.png Binary files differnew file mode 100644 index 0000000..340a2f4 --- /dev/null +++ b/help/ru/images/project_file_protection.png diff --git a/help/ru/images/project_file_settings.png b/help/ru/images/project_file_settings.png Binary files differnew file mode 100644 index 0000000..df1ef35 --- /dev/null +++ b/help/ru/images/project_file_settings.png diff --git a/help/ru/images/project_functions.png b/help/ru/images/project_functions.png Binary files differnew file mode 100644 index 0000000..c25b336 --- /dev/null +++ b/help/ru/images/project_functions.png diff --git a/help/ru/images/project_functions_content.png b/help/ru/images/project_functions_content.png Binary files differnew file mode 100644 index 0000000..799e9d9 --- /dev/null +++ b/help/ru/images/project_functions_content.png diff --git a/help/ru/images/project_functions_content2.png b/help/ru/images/project_functions_content2.png Binary files differnew file mode 100644 index 0000000..ac06908 --- /dev/null +++ b/help/ru/images/project_functions_content2.png diff --git a/help/ru/images/project_functions_menu.png b/help/ru/images/project_functions_menu.png Binary files differnew file mode 100644 index 0000000..e5f8217 --- /dev/null +++ b/help/ru/images/project_functions_menu.png diff --git a/help/ru/images/project_functions_menu2.png b/help/ru/images/project_functions_menu2.png Binary files differnew file mode 100644 index 0000000..55c9d5a --- /dev/null +++ b/help/ru/images/project_functions_menu2.png diff --git a/help/ru/images/project_functions_menu3.png b/help/ru/images/project_functions_menu3.png Binary files differnew file mode 100644 index 0000000..ec1a35b --- /dev/null +++ b/help/ru/images/project_functions_menu3.png diff --git a/help/ru/images/project_functions_search.png b/help/ru/images/project_functions_search.png Binary files differnew file mode 100644 index 0000000..2d87f3f --- /dev/null +++ b/help/ru/images/project_functions_search.png diff --git a/help/ru/images/project_generate_keys.png b/help/ru/images/project_generate_keys.png Binary files differnew file mode 100644 index 0000000..fd7d3cc --- /dev/null +++ b/help/ru/images/project_generate_keys.png diff --git a/help/ru/images/project_options.png b/help/ru/images/project_options.png Binary files differnew file mode 100644 index 0000000..8cd9ba5 --- /dev/null +++ b/help/ru/images/project_options.png diff --git a/help/ru/images/project_script.png b/help/ru/images/project_script.png Binary files differnew file mode 100644 index 0000000..4f875b2 --- /dev/null +++ b/help/ru/images/project_script.png diff --git a/help/ru/images/properties_calc.png b/help/ru/images/properties_calc.png Binary files differnew file mode 100644 index 0000000..dba30ea --- /dev/null +++ b/help/ru/images/properties_calc.png diff --git a/help/ru/images/properties_directory.png b/help/ru/images/properties_directory.png Binary files differnew file mode 100644 index 0000000..3dbcbf2 --- /dev/null +++ b/help/ru/images/properties_directory.png diff --git a/help/ru/images/properties_dump.png b/help/ru/images/properties_dump.png Binary files differnew file mode 100644 index 0000000..0344e9c --- /dev/null +++ b/help/ru/images/properties_dump.png diff --git a/help/ru/images/properties_dump_goto.png b/help/ru/images/properties_dump_goto.png Binary files differnew file mode 100644 index 0000000..febef55 --- /dev/null +++ b/help/ru/images/properties_dump_goto.png diff --git a/help/ru/images/properties_export.png b/help/ru/images/properties_export.png Binary files differnew file mode 100644 index 0000000..feb4b92 --- /dev/null +++ b/help/ru/images/properties_export.png diff --git a/help/ru/images/properties_import.png b/help/ru/images/properties_import.png Binary files differnew file mode 100644 index 0000000..aca775c --- /dev/null +++ b/help/ru/images/properties_import.png diff --git a/help/ru/images/properties_resources.png b/help/ru/images/properties_resources.png Binary files differnew file mode 100644 index 0000000..a8fa472 --- /dev/null +++ b/help/ru/images/properties_resources.png diff --git a/help/ru/images/properties_segments.png b/help/ru/images/properties_segments.png Binary files differnew file mode 100644 index 0000000..e705ded --- /dev/null +++ b/help/ru/images/properties_segments.png diff --git a/help/ru/images/visual_studio_map.png b/help/ru/images/visual_studio_map.png Binary files differnew file mode 100644 index 0000000..b04bd53 --- /dev/null +++ b/help/ru/images/visual_studio_map.png diff --git a/help/ru/images/watermarks_add.png b/help/ru/images/watermarks_add.png Binary files differnew file mode 100644 index 0000000..7211f06 --- /dev/null +++ b/help/ru/images/watermarks_add.png diff --git a/help/ru/images/watermarks_menu.png b/help/ru/images/watermarks_menu.png Binary files differnew file mode 100644 index 0000000..5c20745 --- /dev/null +++ b/help/ru/images/watermarks_menu.png diff --git a/help/ru/images/watermarks_search.png b/help/ru/images/watermarks_search.png Binary files differnew file mode 100644 index 0000000..2e48de3 --- /dev/null +++ b/help/ru/images/watermarks_search.png diff --git a/help/ru/images/watermarks_setup.png b/help/ru/images/watermarks_setup.png Binary files differnew file mode 100644 index 0000000..9f04d8e --- /dev/null +++ b/help/ru/images/watermarks_setup.png diff --git a/help/ru/images/weblm_1.png b/help/ru/images/weblm_1.png Binary files differnew file mode 100644 index 0000000..26bdaee --- /dev/null +++ b/help/ru/images/weblm_1.png diff --git a/help/ru/images/weblm_2.png b/help/ru/images/weblm_2.png Binary files differnew file mode 100644 index 0000000..6791edc --- /dev/null +++ b/help/ru/images/weblm_2.png diff --git a/help/ru/info.htm b/help/ru/info.htm new file mode 100644 index 0000000..6219ddb --- /dev/null +++ b/help/ru/info.htm @@ -0,0 +1,38 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Раздел "Свойства"</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> diff --git a/help/ru/info_calc.htm b/help/ru/info_calc.htm new file mode 100644 index 0000000..66a835e --- /dev/null +++ b/help/ru/info_calc.htm @@ -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> diff --git a/help/ru/info_directories.htm b/help/ru/info_directories.htm new file mode 100644 index 0000000..79d1401 --- /dev/null +++ b/help/ru/info_directories.htm @@ -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> diff --git a/help/ru/info_dump.htm b/help/ru/info_dump.htm new file mode 100644 index 0000000..2fe28e8 --- /dev/null +++ b/help/ru/info_dump.htm @@ -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> diff --git a/help/ru/info_exports.htm b/help/ru/info_exports.htm new file mode 100644 index 0000000..d081124 --- /dev/null +++ b/help/ru/info_exports.htm @@ -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> diff --git a/help/ru/info_imports.htm b/help/ru/info_imports.htm new file mode 100644 index 0000000..2cea11d --- /dev/null +++ b/help/ru/info_imports.htm @@ -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> diff --git a/help/ru/info_resources.htm b/help/ru/info_resources.htm new file mode 100644 index 0000000..503460a --- /dev/null +++ b/help/ru/info_resources.htm @@ -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> diff --git a/help/ru/info_segments.htm b/help/ru/info_segments.htm new file mode 100644 index 0000000..e2a4494 --- /dev/null +++ b/help/ru/info_segments.htm @@ -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>
\ No newline at end of file diff --git a/help/ru/main_menu.htm b/help/ru/main_menu.htm new file mode 100644 index 0000000..36b181d --- /dev/null +++ b/help/ru/main_menu.htm @@ -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> diff --git a/help/ru/main_window.htm b/help/ru/main_window.htm new file mode 100644 index 0000000..76f2e15 --- /dev/null +++ b/help/ru/main_window.htm @@ -0,0 +1,42 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Главное окно</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> diff --git a/help/ru/manager/activation.htm b/help/ru/manager/activation.htm new file mode 100644 index 0000000..302a559 --- /dev/null +++ b/help/ru/manager/activation.htm @@ -0,0 +1,89 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Система Активации</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Система Активации</h1> + + <h3>Что Это?</h3> + + <p>Активация - это двухэтапный процесс регистрации приложения. На + первом этапе (обычно после покупки) покупатель получает код + активации (выглядит как XXXX-YYYY-ZZZZ). На втором этапе + покупатель вводит этот код в приложение, приложение соединяется + через Интернет с сервером производителя ПО, сервер проверяет код + активации и выдает приложению серийный номер, связанный с этим + кодом активации и обычно привязанный к оборудованию + пользователя.</p> + + <p>Такой подход позволяет контролировать использование лицензий + покупателями, предотвращать утечки лицензий, а также многое + другое, например демо-лицензии или надежные триальные + периоды.</p> + + <h3>Зачем Она Мне Нужна?</h3> + + <p>Система активации дает производителю ПО достаточно широкие + возможности, например:</p> + + <ul> + <li><strong>Короткие серийные номера</strong> - длинные + серийные номера хороши всем, кроме длины. Пользователи могут + ошибиться при вводе, почтовые программы иногда портят некоторые + символы, однако только длинные серийные номера позволяют хранить + достаточный объем дополнительной информации. Коды активации + позволяют решить все проблемы длинных серийных номеров, не + влияя на их положительные стороны.</li> + + <li><strong>Контроль количества инсталляций</strong> - все + активации доступны производителю онлайн в реальном времени. Их + можно отслеживать, анализировать, блокировать, оказывать + поддержку пользователям и т.д.</li> + + <li><strong>Триалы</strong> - можно создавать серийные номера, + ограниченные по времени, используя "режимы" продуктов - + "modes".</li> + + <li><strong>Подписки</strong> - подписки похожи на триалы, + однако стоят денег. Вы можете продавать пользователю право + работать с программой в течение определенного времени, как это + делают производители антивирусов - просто продавайте коды + активации на очередной год обслуживания.</li> + </ul> + + <p>Более подробная информация о системе активации доступна в + соответствующем <a href= + "http://vmpsoft.com/products/web-license-manager/" target= + "_blank">разделе</a> нашего сайта.</p> + + <h3>Что Потребуется Сделать?</h3> + + <p>VMProtect Ultimate дополнен несколькими <a href= + "activation/api.htm">функциями</a>, которые позволяют + сравнительно легко реализовать как онлайн, так и оффлайн + активацию. Вам также потребуется установленный на сервере + <a href="activation/weblm.htm">Web License Manager</a>. Наконец, + потребуется <a href="activation/vmprotect.htm">настроить</a> + проект защиты в VMProtect, чтобы модуль активации знал адрес + сервера WebLM.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/activation/api.htm b/help/ru/manager/activation/api.htm new file mode 100644 index 0000000..8a22254 --- /dev/null +++ b/help/ru/manager/activation/api.htm @@ -0,0 +1,223 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>API Активации</title> + <style type="text/css"> +/*<![CDATA[*/ + th {text-align:left;} + table {border-collapse:collapse; margin-top: 4px;} + td,th {border: 1px solid #B0B0B0; padding-left:10;padding-right:10;} + /*]]>*/ + </style> +</head> + +<body> + <h1>API Активации</h1> + + <p>API Активации содержит всего 4 функции. Две предназначены для + онлайн-активации и две для оффлайн, когда на компьютере + отсутствует доступ в Интернет. API Активации предназначено для + взаимодействия с Web License Manager, так что разработчику все + равно необходимо вызывать API системы лицензирования, чтобы + использовать серийные номера, полученные от WebLM.</p><strong id= + "VMProtectActivateLicense">VMProtectActivateLicense</strong> + + <p>Функция передает код активации на сервер и возвращает серийный + номер, подходящий для этого конкретного компьютера. В противном + случае возвращается <a href="#codes">код ошибки</a>.</p> + <pre class="code">int VMProtectActivateLicense(const char *code, char *serial, int size); +</pre> + + <p>Параметр <strong>code</strong> содержит код активации, который + получен от Web License Manager в процессе покупки лицензии. + Параметр <strong>serial</strong> указывает на блок памяти размера + <strong>size</strong>, в который будет помещен сгенерированный + WebLM серийный номер.</p><strong id= + "VMProtectDeactivateLicense">VMProtectDeactivateLicense</strong> + + <p>Функция передает серийный номер на сервер для деактивации. + Возможные коды возврата перечислены <a href= + "#codes">ниже</a>.</p> + <pre class="code">int VMProtectDeactivateLicense(const char *serial); +</pre> + + <p>Параметр <strong>serial</strong> содержит серийный номер (не + код активации), полученный ранее от WebLM в процессе + активации.</p><strong id= + "VMProtectGetOfflineActivationString">VMProtectGetOfflineActivationString</strong><br /> + + <strong id= + "VMProtectGetOfflineDeactivationString">VMProtectGetOfflineDeactivationString</strong> + + <p>Эти две функции работают практически аналогично двум + предыдущим с той лишь разницей, что они не пытаются подключиться + к серверу WebLM. Вместо этого они возвращают блок текста, который + необходимо скопировать на компьютер где есть доступ в Интернет, + открыть там форму оффлайн-активации WebLM и вставить туда этот + текст.</p> + <pre class="code">int VMProtectGetOfflineActivationString(const char *code, char *buf, int size); +int VMProtectGetOfflineDeactivationString(const char *serial, char *buf, int size); +</pre> + + <p>Параметры <strong>code</strong> и <strong>serial</strong> + аналогичны параметрам онлайн-версий функций, параметр + <strong>buf</strong> должен указывать на буфер размером 1000 байт + или больше, туда будет скопирован текстовый блок для формы + оффлайн-активации. Возможные коды ошибок перечислены <a href= + "#codes">ниже</a>.</p> + + <h3 id="codes">Возможные Коды Ошибок</h3> + + <table border="1" cellspacing="0" cellpadding="2"> + <tr> + <th>Код</th> + + <th>Значение</th> + + <th>Описание</th> + </tr> + + <tr> + <td>ACTIVATION_OK</td> + + <td>0</td> + + <td>Активация прошла успешно, переменная + <strong>serial</strong> содержит серийный номер.</td> + </tr> + + <tr> + <td>ACTIVATION_SMALL_BUFFER</td> + + <td>1</td> + + <td>Буфер для серийного номера слишком маленький. Минимальный + размер буфера вычисляется по формуле: bits / 8 * 3 / 2 + N, + где bits - длина RSA ключа в битах, а N - "константа + безопасности" - дополнительное количество байт на случай + переносов строк и прочих спец-символов. Рекомендуется + использовать как минимум 10.</td> + </tr> + + <tr> + <td>ACTIVATION_NO_CONNECTION</td> + + <td>2</td> + + <td>Модуль активации не смог подключиться к Web License + Manager.</td> + </tr> + + <tr> + <td>ACTIVATION_BAD_REPLY</td> + + <td>3</td> + + <td>Сервер активации вернул неожиданный результат. Это + означает проблемы конфигурации сервера, неправильный url + сервера активации или попытку взлома.</td> + </tr> + + <tr> + <td>ACTIVATION_BANNED</td> + + <td>4</td> + + <td>Этот код активации заблокирован на сервере производителем + ПО через интерфейс WebLM (например, из-за + утечки кода активации с пиратской копией). Не путать с ACTIVATION_ALREADY_USED.</td> + </tr> + + <tr> + <td>ACTIVATION_CORRUPTED</td> + + <td>5</td> + + <td>Что-то пошло совсем не так. Ошибка выдается системой + самопроверки модуля активации и с высокой вероятностью + означает попытку взлома. В случае получения этой ошибки + дальнейшие операции с серийными номерами и активацией не + могут считаться безопасными.</td> + </tr> + + <tr> + <td>ACTIVATION_BAD_CODE</td> + + <td>6</td> + + <td>Данный код не найден в базе данных сервера активаций. + Возможно пользователь ошибся при вводе кода, так что можно + попросить его проверить правильность ввода данных.</td> + </tr> + + <tr> + <td>ACTIVATION_ALREADY_USED</td> + + <td>7</td> + + <td>Счетчик активаций этого кода дошел до нуля и дальнейшие + активации невозможны. Это не обозначает, что код плохой или + заблокирован - код хороший. Пользователю нужно связаться с + производителем ПО и докупить необходимое количество лицензий + или же деинсталлировать программу на других компьютерах, + чтобы увеличить значение счетчика в базе данных.</td> + </tr> + + <tr> + <td>ACTIVATION_SERIAL_UNKNOWN</td> + + <td>8</td> + + <td>Ошибка деактивации. Означает, что данный серийный + номер не найден в базе данных сервера. Соответственно, + деактивация не может быть проведена успешно.</td> + </tr> + + <tr> + <td>ACTIVATION_EXPIRED</td> + + <td>9</td> + + <td>Ошибка активации. Означает, что период действия кода активации истек.</td> + </tr> + + <tr> + <td>ACTIVATION_NOT_AVAILABLE</td> + + <td>10</td> + + <td>Ошибка означает, что активация/деактивация недоступна.</td> + </tr> + + </table> + + <h3>Маленькие хитрости</h3> + + <p>API Активации достаточно простое, так что с ним не должно + возникнуть сложностей. Не забудьте предоставить пользователям + интерфейс для оффлайн-активации, если онлайн-активация + завершилась неудачей из-за проблем с доступом в интернет. Также + не забывайте, что API Активации не сохраняет полученный серийный + номер и не передает его модулю лицензирования - это задача + разработчика. Нет необходимости вызывать API Активации при каждом + запуске приложения - достаточно вызвать его один раз, получить + серийный номер от WebLM, сохранить его в удобном месте и в + дальнейшем использовать только его.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/activation/vmprotect.htm b/help/ru/manager/activation/vmprotect.htm new file mode 100644 index 0000000..f0a3440 --- /dev/null +++ b/help/ru/manager/activation/vmprotect.htm @@ -0,0 +1,38 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Настройка Активации в VMProtect</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Настройка Активации в VMProtect</h1> + + <p>Для работы <a href="api.htm">API Активации</a> требуется адрес + сервера WebLM, так что необходимо задать его в настройках проекта + VMProtect. Чтобы сделать это, запустите VMProtect и перейдите в + раздел настроек:</p><br /><img src="../../images/activation_setup.png" alt="Настройка сервера активации" /> + + <p>Введите адрес в поле "Сервер активации". Адрес должен + выглядеть так: http://<em>yourserver</em>/<em>weblm + path</em>/activate.php. Это первое место, которое следует проверить, если в дальнейшем Вы столкнетесь + с ошибками в процессе онлайн-активации.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/activation/weblm.htm b/help/ru/manager/activation/weblm.htm new file mode 100644 index 0000000..35cf308 --- /dev/null +++ b/help/ru/manager/activation/weblm.htm @@ -0,0 +1,55 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Поддержка Активации в Web License Manager</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Поддержка Активации в Web License Manager</h1> + + <p>Подробно Web License Manager описан <a href= + "http://vmpsoft.com/products/web-license-manager/" target= + "_blank">на сайте</a>, здесь даны минимальные инструкции по + созданию кода активации для последующего использования с API + Активации.</p> + + <p>Для начала войдите в Web License Manager (можно использовать + демо-версию на нашем сайте) и создайте продукт. Затем + экспортируйте продукт как проект VMProtect, чтобы иметь + возможность использовать его для настроек лицензирования и + активации. После того как проект настроен, необходимые проверки + добавлены в код и исполняемый файл защищен, нажмите ссылку "Add + New Code" в левой панели WebLM:</p> + <p><img src="../../images/weblm_1.png" /></p> + + <p>Выберите нужный продукт в верхнем выпадающем списке и + заполните остальные поля формы данными, которые Вы хотите + поместить в серийный номер. Затем нажмите кнопку "Save". Вы + увидите код активации, который можно использовать для отладки API + Активации.</p> + <p><img src="../../images/weblm_2.png" /></p> + + <p>Множество других возможностей Web License Manager (таких, как интеграция с регистраторами или + автоматическая генерация кодов активации) можно подробно изучить в <a href= + "http://vmpsoft.com/products/web-license-manager/" target= + "_blank">онлайн-версии руководства пользователя</a>.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/features.htm b/help/ru/manager/features.htm new file mode 100644 index 0000000..c717767 --- /dev/null +++ b/help/ru/manager/features.htm @@ -0,0 +1,138 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Возможности системы лицензирования VMProtect</title> +</head> + +<body> + <h1>Возможности системы лицензирования VMProtect</h1> + + <h3>Надежные серийные номера</h3> + + <p>Система лицензирования использует асимметричные алгоритмы для + шифрования серийных номеров. Номер шифруется приватным ключом, + который хранится только у разработчика продукта. Защищаемый + продукт расшифровывает номер публичным ключом и проверяет его. В + силу длины используемых ключей (от 1024 бит для RSA) практически + невозможно подобрать закрытый ключ и создать генератор ключей для + продукта.</p> + + <h3 id="lock">Привязка кода к серийному номеру</h3> + + <p>VMProtect позволяет исполнять часть кода программы на + виртуальной машине. Набор команд виртуальной машины меняется при + каждой сборке защищаемой программы. Система лицензирования + позволяет зашифровать часть команд виртуальной машины ключом, + который хранится в серийном номере. Таким образом, даже если + хакер исправит условный переход в программе, код все равно не + будет работать без корректного серийного номера. А так как + расшифровка кода также происходит под управлением виртуальной + машины, то даже наличие серийного номера не дает возможности + легко проанализировать алгоритм + расшифровки.</p> + + <h3>Ограничение периода бесплатных обновлений</h3> + + <p>Система лицензирования позволяет записать в ключ такую дату, + что версии приложения, собранные после этой даты, не будут + работать с этим ключом. Это позволяет ограничивать период + бесплатных обновлений продукта. Например при продаже в ключ + записывается текущая дата плюс один год и пользователь может + скачивать с сайта новые версии в течение года. Ключ будет + работать в этих версиях. По истечение года у пользователя будет + выбор: пользоваться последней "рабочей" версией программы или + купить обновление еще на один год.</p> + + <h3>Срок годности ключа</h3> + + <p>Система лицензирования позволяет записать в ключ дату, после + которой ключ перестает работать. Это удобно для продажи + продуктов, требующих периодического обновления. Например при + продаже в серийный номер помещается текущая дата плюс год и + программа будет работать у пользователя в течение года. В отличие + от ограничения периода бесплатных обновлений, в этом случае у + пользователя нет выбора - ему придется купить новую лицензию, + если он хочет продолжать пользоваться + программой.</p> + + <h3>Ограничение времени работы программы</h3> + + <p>Система лицензирования позволяет ограничить время работы + экземпляра программы. Это бывает полезно для демонстрационных + задач. Например покупатель хочет получить для тестирования + полноценную копию программы. В этом случае можно передать ему + серийный номер, который ограничит время работы программы, скажем, + десятью минутами. По истечение этого времени программа прекратит + свою работу. Такая схема подходит для демонстрационных версий + различных серверных приложений, где простой перезапуск приложения + будет неудобен.</p> + + <h3>Привязка к оборудованию</h3> + + <p>Система лицензирования позволяет получить идентификатор + оборудования пользователя на основе процессора, сетевых плат и + информации операционной системы. Серийный номер может быть создан + так, что он будет работать только на оборудовании с этим + идентификатором. Это позволяет ограничить использование одной + лицензии на нескольких компьютерах.</p> + + <h3>Черный список</h3> + + <p>В случае дискредитации серийного номера, система + лицензирования позволяет занести такой номер в черный список, + после чего номер не будет работать в следующих версиях + приложения.</p> + + <h3>Хранение данных</h3> + + <p>Система лицензирования позволяет хранить в серийном номере и + выдавать защищаемой программе следующие данные: имя пользователя, + e-mail, а также до 255 байт произвольных данных (т.н. "данные + пользователя"). Это может быть использовано для показа в диалоге + "О Программе", для реализации дополнительных проверок серийного + номера, для хранения констант, доступных только в + зарегистрированной версии продукта и т.п.</p> + + <h3>Ограниченние работы демо-версии по времени</h3> + + <p>Используя систему <a href="activation.htm">активации</a> + производитель ПО может автоматически создавать ограниченные по времени и привязанные к оборудованию + пользователя серийные номера. Это позволяет организовать надежно защищенный + демо-период для приложения, так как VMProtect не прячет триальные + метки на компьютере пользователя, а вместо этого генерирует + полноценный, но ограниченный по времени серийный номер. Активация + обычно производится непосредственно через интернет, но в API активации предусмотрен + и оффлайновый режим.</p><br /> + <hr noshade="noshade" size="1" /> + + <h1>Чего система лицензирования не умеет и + почему?</h1> + + <h3>100%-но надежная привязка к оборудованию</h3> + + <p>Несмотря на то, что система лицензирования позволяет + привязаться к идентификатору оборудования, следует понимать, что + большинство данных об оборудовании получается средствами + операционной системы, которые могут быть перехвачены хакером с + целью изменения данных. Система лицензирования применяет ряд + схем, позволяющих минимизировать такие риски, однако если вам + требуется 100%-но надежная привязка к оборудованию, мы + рекомендуем воспользоваться решением на базе USB-ключей, с + которыми также может работать VMProtect.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/howitworks.htm b/help/ru/manager/howitworks.htm new file mode 100644 index 0000000..0ebb8c6 --- /dev/null +++ b/help/ru/manager/howitworks.htm @@ -0,0 +1,61 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Как работает система лицензирования?</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Как работает система лицензирования?</h1> + + <h3>Защита приложения</h3> + + <p>VMProtect в процессе защиты приложения интегрирует в него код + проверки серийных номеров. При этом используется информация, + указанная в секции "Лицензии" раздела "Проект". В приложение помещается + публичный ключ продукта, при помощи которого будет осуществляться + расшифровка серийных номеров. Также в приложение помещается дата + защиты и ряд дополнительных данных, необходимых для работы + системы лицензирования.</p> + + <h3>Создание серийных номеров</h3> + + <p>Серийные номера могут быть созданы в секции <a href= + "licenses.htm">"Лицензии"</a> раздела "Проект" или при помощи отдельных приложений + - <a href="keygen/index.htm">генераторов ключей</a>. Серийный + номер - это набор данных о покупателе, зашифрованный асимметричным + алгоритмом. Серийный номер передается покупателю, тот вводит его + в программу, после чего он проверяется модулем + лицензирования.</p> + + <h3>Проверка серийного номера в программе</h3> + + <p>Модуль лицензирования предоставляет защищаемой программе + <a href="usage/api.htm">несколько функций</a> для работы с + серийными номерами. Программа передает модулю лицензирования + серийный номер и запрашивает информацию о нем. Модуль + лицензирования выдает краткое состояние серийного номера + (рабочий/нерабочий и почему), а также может выдать подробную + информацию о серийном номере, такую как имя пользователя, e-mail, + срок действия номера и т.д. Защищаемая программа анализирует + информацию о серийном номере и принимает решение о продолжении + или завершении работы, а также об ограничениях + функционала.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/index.htm b/help/ru/manager/index.htm new file mode 100644 index 0000000..3cccf75 --- /dev/null +++ b/help/ru/manager/index.htm @@ -0,0 +1,43 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Система лицензирования</title> +</head> + +<body> + <h1>Система лицензирования</h1> + + <p>Система лицензирования решает задачи создания и проверки + серийных номеров. Поддерживаются ограничения работы защищаемого + ПО по дате и времени, привязка к оборудованию, шифрование кода + серийным номером, ограничение периода бесплатных обновлений и + многое другое. Система построена на асимметричных алгоритмах + шифрования, что минимизирует вероятность создания генераторов + серийных номеров. Для защиты системы лицензирования применяется + виртуализация VMProtect, что минимизирует вероятность взлома на + уровне кода и создания патчей.</p> + + <ul> + <li><a href="features.htm">Возможности системы лицензирования</a></li> + <li><a href="howitworks.htm">Схема работы системы лицензирования</a></li> + <li><a href="licenses.htm">Управление лицензиями: создание, изменение, блокировка и т.п.</a></li> + <li><a href="usage/index.htm">Пример интеграции в приложение</a></li> + <li><a href="keygen/index.htm">Автоматическое создание серийных номеров</a></li> + </ul> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/keygen/algorithms.htm b/help/ru/manager/keygen/algorithms.htm new file mode 100644 index 0000000..05b9bc3 --- /dev/null +++ b/help/ru/manager/keygen/algorithms.htm @@ -0,0 +1,79 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Алгоритмы шифрования серийных номеров</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Алгоритмы шифрования серийных номеров</h1> + + <p>Надежность ключей системы лицензирования основывается на + применении асимметричных алгоритмов шифрования. В текущей версии + реализован алгоритм RSA с длиной ключа от 1024 до 16384 бит. В + будущих версиях планируется добавление других алгоритмов, + основанных на ECC, а также схем, совмещающих симметричные и + асимметричные шифры.</p> + + <p>Используемый алгоритм уникален для каждого продукта. Ключи, + созданные с одним алгоритмом, не подойдут к другому, поэтому + смена алгоритмов после создания хоть одной лицензии не + допускается. Модуль защиты, располагающийся в защищаемой + программе, "знает" каким алгоритмом должен быть зашифрован + серийный номер и не примет ключ, созданный другим алгоритмом или + тем же алгоритмом, но с другими параметрами (скажем, с другой + длиной ключа).</p> + + <h3>Алгоритм RSA</h3> + + <p>Шифрование серийного номера алгоритмом RSA происходит по + следующей схеме:</p> + + <ul> + <li><strong>Добавление случайных данных в начало + номера</strong> - метод основывается на RFC2313, однако + реализация немного отличается от описаной там. В начало + серийного номера добавляютя байты: 00 02 NN...NN 00, где NN..NN + - от 8 до 16 случайных ненулевых байт. Количество байт + выбирается случайным, однако принимается во внимание длина + серийного номера и максимальная вместительность ключа.</li> + + <li><strong>Добавление случайных данных в конец номера</strong> + - окончательное количество байт в серийном номере должно + равняться количеству бит в ключах алгоритма, деленному на 8. + Серийный номер дополняется до этого числа байт случайными + данными. В результате получается следующий формат серийного + номера: 00 02 NN..NN 00 DD..DD MM..MM, где NN - набор случайных + ненулевых байтов, DD - исходный серийный номер, MM -набор + случайных байтов (в т.ч. и нулевых). Суммарная длина + последовательности должна равняться количеству бит, + применяемому в алгоритме, деленному на 8.</li> + + <li><strong>Шифрование</strong> - производится по стандатной + схеме, реализованной во многих библиотеках, работающих с + большими числами. Генератор на PHP содержит всю необходимую + информацию в открытом виде.</li> + + <li><strong>Упаковка</strong> - полученный после шифрования + набор байт кодируется в base-64 - это и есть серийный номер, + который отправляется покупателю.</li> + </ul><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/keygen/index.htm b/help/ru/manager/keygen/index.htm new file mode 100644 index 0000000..2650150 --- /dev/null +++ b/help/ru/manager/keygen/index.htm @@ -0,0 +1,121 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Генераторы ключей</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Генераторы ключей</h1><strong>Зачем они нужны?</strong> + + <p>Помимо VMProtect, серийные номера могут генерироваться другими + программами - генераторами. Это нужно для автоматизации выдачи + номеров без участия человека. Покупатель покупает продукт, + регистратор делает HTTP-запрос на сайт производителя, там + запускается программа-генератор и на основе данных о покупателе + формирует серийный номер. Номер отправляется покупателю и + производителю. Производитель вносит его в базу VMProtect вручную, + через окно импорта лицензий.</p><strong>Принцип работы</strong> + + <p>Система лицензирования VMProtect построена на асимметричных + алгоритмах, поэтому для генерации серийных номеров требуется + секретный ключ продукта. Этот ключ можно экспортировать в окне + свойств продукта и передать программе-генератору подходящим для + нее способом.</p> + + <p>Программа-генератор вызывается регистратором через + HTTP-запрос. Генератор на PHP может быть вызван напрямую, + генератор в виде DLL - косвенно, но алгоритм остается одним и тем + же:</p> + + <ul> + <li>Получить данные о пользователе от регистратора</li> + + <li>Добавить необходимую информацию, которую указал + производитель</li> + + <li>Сформировать серийный номер</li> + + <li>Зашифровать его одним из алгоритмов</li> + + <li>Передать результат регистратору</li> + </ul><strong>Существуют ли готовые генераторы?</strong> + + <p>С системой лицензирования поставляется три готовых генератора + серийных номеров <a href="keygen_dll.htm">в виде DLL</a>, + <a href="keygen_net.htm">для платформы .Net</a> и <a href= + "keygen_php.htm">реализованный на PHP</a>.</p><strong>Можно ли + сделать свой генератор?</strong> + + <p>Можно. Формат серийного номера находится <a href= + "serial_format.htm">здесь</a>, алгоритмы шифрования серийного + номера описаны <a href= + "algorithms.htm">здесь</a>.</p><strong>Насколько это + безопасно?</strong> + + <p>В общем случае - вполне безопасно. Однако есть несколько + рекомендаций, которым стоит следовать:</p> + + <ul> + <li><strong>Используйте протокол HTTPS</strong> - если ваш + регистратор умеет делать запрос по HTTPS, а ваш хостинг + позволяет отвечать на такие запросы, то этот вариант + предпочтительнее обычного HTTP, т.к. поток данных будет + зашифрован и сгенерированный серийный номер сможет получить + только регистратор.</li> + + <li><strong>"Спрячьте" генератор</strong> - убедитесь, что + генератор нельзя вызвать случайно. Адрес + www.site.com/keygen.php - плохая идея. А вот + www.site.com/abc123.php - уже лучше. Убедитесь, что на + генератор нет внешних ссылок, что он не показывается при + просмотре содержимого директории сайта и не помещайте его в + служебные файлы типа robots.txt. Чем меньше известно о + расположении генератора - тем лучше. Как вариант - можно + вынести генератор на другой сайт.</li> + + <li><strong>Убедитесь, что вас вызывает регистратор</strong> - + в программе, обрабатывающей запрос от регистратора, необходимо + проверить IP-адрес вызывающей стороны. Обычно регистраторы + публикуют список адресов, с которых они могут вызвать + генератор. Найдите такой у вашего регистратора и добавьте + проверку. В случае несовпадения адреса, лучше не выдавать + понятных ошибок. Не возвращайте ничего или верните ошибку 404. + Не давайте повода понять, почему вызов оказался неудачен.</li> + + <li><strong>Проверяйте входные параметры</strong> - в + настройках продукта у регистратора обычно дается возможность + указать строку запроса, который регистратор будет делать для + получения лицензии. Скажем, вы хотите получать имя + пользователя, адрес его электронной почты, дату продажи и номер + заказа. Убедитесь при получении запроса, что все параметры + переданы и что все они имеют корректный формат. Не отвечайте на + запросы с ошибками. О любых ошибках уведомляйте себя отправкой + e-mail со всеми параметрами, с которыми был вызван генератор. + Это поможет разобраться в причинах проблемы.</li> + + <li><strong>Добавьте "пароль"</strong> - укажите в запросе, + посылаемом регистратором, дополнительный параметр - пароль. С + неочевидным именем и значением. Проверяйте его на принимающей + стороне. В случае несовпадения или отсутствия - не генерируйте + номер.</li> + </ul><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/keygen/keygen_dll.htm b/help/ru/manager/keygen/keygen_dll.htm new file mode 100644 index 0000000..5e8134e --- /dev/null +++ b/help/ru/manager/keygen/keygen_dll.htm @@ -0,0 +1,284 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Генератор ключей: Windows-версия</title> +</head> + +<body> + <h1>Генераторы ключей: Windows-версия</h1> + + <h3>Описание</h3> + + <p>Генератор для Windows представляет собой DLL-файлы для + платформ x86 и x64, заголовочный файл языка C и lib-файл, + совместимый с MSVC. Таким образом, библиотека может быть как слинкована статически, так + и загружаться динамически.</p> + + <p>Все файлы генератора находятся в каталоге + <strong>Keygen\DLL</strong>, там же находится тестовое + приложение, которое генерирует серийные номера.</p> + + <h3>API генератора</h3> + + <p>Генератор экспортирует всего две функции: одна непосредственно + генерирует серийный номер, вторая - освобождает память, + выделенную первой. Начнем с первой и основной функции:</p> + <pre class="code"><strong>VMProtectErrors</strong> __stdcall <strong>VMProtectGenerateSerialNumber</strong>( + <strong>VMProtectProductInfo *</strong> pProductInfo, + <strong>VMProtectSerialNumberInfo *</strong> pSerialInfo, + <strong>char **</strong> pSerialNumber + ); +</pre> + + <p>Первый параметр - указатель на структуру + <strong>VMProtectProductInfo</strong>, содержимое которой + выгружается в VMProtect (см. <a href= + "../licenses.htm#export">Экспорт параметров продукта</a>). + Структура содержит приватный ключ продукта, используемый алгоритм + и количество бит, а также идентификатор продукта. Подробнее о + заполнении этой структуры написано ниже.</p> + + <p>Второй параметр - указатель на структуру + <strong>VMProtectSerialNumberInfo</strong>, содержимое которой + переносится в генерируемый серийный номер. Структура содержит все + поля серийного номера, а также битовую маску, определяющую какие + именно поля должны быть записаны в серийный номер.</p> + <pre class="code">struct <strong>VMProtectSerialNumberInfo</strong> +{ + <strong>INT</strong> flags; + <strong>wchar_t *</strong> pUserName; + <strong>wchar_t *</strong> pEMail; + <strong>DWORD</strong> dwExpDate; + <strong>DWORD</strong> dwMaxBuildDate; + <strong>BYTE</strong> nRunningTimeLimit; + <strong>char *</strong> pHardwareID; + <strong>size_t</strong> nUserDataLength; + <strong>BYTE *</strong> pUserData; +}; +</pre> + + <p>Поле <strong>flags</strong> содержит битовые флаги из набора + <strong>VMProtectSerialNumberFlags</strong>, описанного перед + структурой:</p> + + <ul> + <li><strong>HAS_USER_NAME</strong> - поместить в серийный номер + имя пользователя, находящееся в переменной + <strong>pUserName</strong>.</li> + + <li><strong>HAS_EMAIL</strong> - поместить в серийный номер + e-mail пользователя, находящийся в переменной + <strong>pEMail</strong>.</li> + + <li><strong>HAS_EXP_DATE</strong> - серийный номер перестанет + действовать поле окончания дня, указанного в переменной + <strong>dwExpDate</strong>.</li> + + <li><strong>HAS_MAX_BUILD_DATE</strong> - серийный номер будет + подходить только к версиям продукта, созданным до даты, + указанной в переменной <strong>dwMaxBuildDate</strong>.</li> + + <li><strong>HAS_TIME_LIMIT</strong> - программа перестанет + работать по истечении времени, указанного в переменной + <strong>nRunningTimeLimit</strong> (время указывается в минутах + и не может превышать 255).</li> + + <li><strong>HAS_HARDWARE_ID</strong> - программа будет работать + только на оборудовании с идентификатором, указанным в + переменной <strong>pHardwareID</strong>.</li> + + <li><strong>HAS_USER_DATA</strong> - поместить в серийный номер + пользовательские данные длинной + <strong>nUserDataLength</strong>, расположенные по адресу, + указанному в переменной <strong>pUserData</strong>.</li> + </ul> + + <p>Третий параметр - указатель на указатель. Туда будет записан + адрес сгенерированного серийного номера. После генерации номер + необходимо скопировать, а адрес передать во вторую функцию API + генератора, которая освободит занимаемую серийным номером + память.</p> + <pre class="code"><strong>void</strong> __stdcall <strong>VMProtectFreeSerialNumberMemory</strong>(<strong>char *</strong> pSerialNumber); +</pre> + + <p>Функция <strong>VMProtectGenerateSerialNumber</strong> + возвращает значение типа <strong>VMProtectErrors</strong>, + содержащее 0 в случае успешной генерации номера или код ошибки в + противном случае. Возможны следующие коды ошибок:</p> + + <ul> + <li><strong>ALL_RIGHT</strong> - ошибок нет, номер сгенерирован + успешно.</li> + + <li><strong>UNSUPPORTED_ALGORITHM</strong> - в первом параметре + функции передан некорректный алгоритм шифрования ключа.</li> + + <li><strong>UNSUPPORTED_NUMBER_OF_BITS</strong> - в первом + параметре функции передано некорректное количество бит в + ключе.</li> + + <li><strong>USER_NAME_IS_TOO_LONG</strong> - длина имени + пользователя в кодировке UTF-8 превысила 255 байт.</li> + + <li><strong>EMAIL_IS_TOO_LONG</strong> - длина e-mail + пользователя в кодировке UTF-8 превысила 255 байт.</li> + + <li><strong>USER_DATA_IS_TOO_LONG</strong> - длина + пользовательских данных превышает 255 байт.</li> + + <li><strong>HWID_HAS_BAD_SIZE</strong> - идентификатор + оборудования имеет некорректный размер.</li> + + <li><strong>PRODUCT_CODE_HAS_BAD_SIZE</strong> - идентификатор + продукта, переданный в первом параметре функции, имеет неверный + размер.</li> + + <li><strong>SERIAL_NUMBER_TOO_LONG</strong> - серийный номер + слишком длинный и не помещается в указанное в алгоритме количество + бит.</li> + + <li><strong>BAD_PRODUCT_INFO</strong> - первый параметр функции + некорректен или NULL.</li> + + <li><strong>BAD_SERIAL_NUMBER_INFO</strong> - второй параметр + функции некорректен или NULL.</li> + + <li><strong>BAD_SERIAL_NUMBER_CONTAINER</strong> - третий + параметр функции не указывает на ячейку памяти для записи + адреса серийного номера.</li> + + <li><strong>NOT_EMPTY_SERIAL_NUMBER_CONTAINER</strong> - третий + параметр функции не указывает на пустую ячейку, в ячейке должно + быть значение NULL.</li> + + <li><strong>BAD_PRIVATE_EXPONENT</strong> - значение приватной + экспоненты в первом параметре функции некорректно.</li> + + <li><strong>BAD_MODULUS</strong> - значение модуля в первом + параметре функции некорректно.</li> + </ul> + + <p>Ошибки делятся на две категории: те, что связаны с + некорректными параметрами или с содержимым первого параметра + функции, и все остальные. Ошибки первой категории редки и + являются признаком некорректной настройки структуры. Имеет смысл + выгрузить информацию о продукте повторно и убедиться, что + структура заполняется правильно. Пример правильного заполнения + приведен ниже.</p> + + <p>Ошибки второй категории связаны с попыткой вместить в ключ + больше данных, чем это возможно ввиду его размера. В таком случае + разумно будет отправить регистратору вместо ключа текст "Ключ + будет выслан в течение суток", а всю необходимую информацию + отправить себе по почте. Ключ в таком случае генерируется в + VMProtect в ручном режиме, какие-то данные обрезаются, чтобы + уместить все необходимое в максимальный размер + ключа.</p> + + <h3>Пример использования</h3> + + <p>Ниже приведен пример кода, который вызывает две вышеописанные + функции и генерирует серийный номер. Обратите внимание на блок + кода, расположенный в самом начале. Пример не будет работать пока + вы не замените его на блок, выгруженный для продукта из + VMProtect:</p> + <pre class="code">////////////////////////////////////////////////////////////////////////// +// !!! this block should be generated by VMProtect !!! /// +////////////////////////////////////////////////////////////////////////// + +<strong>VMProtectAlgorithms</strong> g_Algorithm = ALGORITHM_RSA; +<strong>size_t</strong> g_nBits = 0; +<strong>byte</strong> g_vModulus[1]; +<strong>byte</strong> g_vPrivate[1]; +<strong>byte</strong> g_vProductCode[1]; + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +<strong>int</strong> _tmain(<strong>int</strong> argc, <strong>_TCHAR*</strong> argv[]) +{ + <strong>VMProtectProductInfo</strong> pi; + pi.algorithm = g_Algorithm; + pi.nBits = g_nBits; + pi.nModulusSize = sizeof(g_vModulus); + pi.pModulus = g_vModulus; + pi.nPrivateSize = sizeof(g_vPrivate); + pi.pPrivate = g_vPrivate; + pi.nProductCodeSize = sizeof(g_vProductCode); + pi.pProductCode = g_vProductCode; + + <strong>VMProtectSerialNumberInfo</strong> si = {0}; + si.flags = HAS_USER_NAME | HAS_EMAIL; + si.pUserName = L"John Doe"; + si.pEMail = L"john@doe.com"; + <strong>char *</strong> pBuf = NULL; + <strong>VMProtectErrors</strong> res = <strong>VMProtectGenerateSerialNumber</strong>(&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> diff --git a/help/ru/manager/keygen/keygen_net.htm b/help/ru/manager/keygen/keygen_net.htm new file mode 100644 index 0000000..f2d8d36 --- /dev/null +++ b/help/ru/manager/keygen/keygen_net.htm @@ -0,0 +1,115 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Генератор ключей: .Net-версия</title> + <style type="text/css"> +/*<![CDATA[*/ + div.c2 {text-align: center} + p.c1 {color:red;} + /*]]>*/ + </style> +</head> + +<body> + <h1>Генераторы ключей: .Net-версия</h1> + + <h3>Описание</h3> + + <p>.Net-версия генератора ключей преставляет собой сборку, + содержащую все необходимое для генерации серийных номеров. + Исходные коды находятся в каталоге <strong>Keygen\Net</strong> в + виде двух проектов: KeyGen (непосредственно генератор серийных + номеров) и Usage (пример использования генератора).</p> + + <p class="c1">Генератор поставляется в исходных кодах, чтобы + иметь возможность пересобрать его под нужную версию .Net + Framework, однако крайне не рекомендуется вносить изменения в его + код. В будущих версиях VMProtect возможно добавление новых + возможностей в генератор, что приведет к необходимости повторной + модификации кода. Также возможно появление трудноуловимых ошибок. + В случае нахождения ошибки в оригинальном коде генератора или + пожеланий по его улучшению - обращайтесь в службу + поддержки.</p> + + <h3>Использование генератора</h3> + + <p>Возьмите за основу код из проекта <strong>Usage</strong>, + добавьте в Ваш проект ссылку на сборку VMProtect.KeyGen.dll, + после чего Вы сможете генерировать серийные номера в вашем + приложении. Для нормальной работы генератор должен понимать, + к какому продукту Вы собираетесь генерировать серийные номера. + Для этого на закладке "Лицензии" VMProtect нажмите кнопку + «Экспорт» и в выпадающем списке выберите «Параметры для + KeyGen.Net». В текстовом поле ниже появятся несколько строк + текста, которые необходимо скопировать и перенести в Ваше + приложение в виде строковой константы.</p> + + <p>Пример вызова генератора представлен ниже:</p> + <pre> +try +{ + string data = @""; // put the exported data here + Generator g = new Generator(data); + g.UserName = "John Doe"; + g.EMail = "john@doe.com"; + g.ExpirationDate = DateTime.Now.AddMonths(1); + g.MaxBuildDate = DateTime.Now.AddYears(1); + g.RunningTimeLimit = 15; + g.HardwareID = "AQIDBAgHBgU="; + g.UserData = new byte[] { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }; + string serial = g.Generate(); + Console.WriteLine("Serial number:\n{0}\n", serial); +} +catch (Exception ex) +{ + Console.WriteLine("Error: {0}", ex); +} + +</pre> + + <p>Строку, скопированную в окне экспорта VMProtect, необходимо + поместить в переменную <strong>data</strong>, которая будет + передана параметром в конструктор класса генератора серийных + номеров. В случае каких-либо проблем с разбором данных продукта, + конструктор выбросит исключение с описанием проблемы. Если + конструктор отработал успешно, то генератор готов к созданию + серийных номеров.</p> + + <p>Серийный номер может содержать различную информацию, которая + задается через свойства генератора. Пример выше показывает, как + заполнить абсолютно все поля серийного номера. Отдельные поля + имеют ограничения. Например, поля <strong>User Name</strong> и + <strong>E-Mail</strong> не могут принять строки, которые в + кодировке UTF-8 будут иметь длину, превышающую 255 символов. В + случае подачи некорректных данных, свойства выбрасывают исключения с + описанием проблемы.</p> + + <p>По окончании настройки генератора вызывается метод + <strong>Generate()</strong>, который и создает серийный номер. На + этом этапе происходит компоновка всех данных номера, подсчет + контрольных сумм и, непосредственно, шифрование. В случае, если + объем данных превышает максимально допустимую длину, метод выбросит + исключение.</p> + + <p>В случае, если необходимо сгенерировать несколько серийных + номеров, можно использовать класс генератора несколько раз, не + пересоздавая его. Чтобы "очистить" любое из свойств генератора, + ему нужно присвоить значение <strong>null</strong>.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/keygen/keygen_php.htm b/help/ru/manager/keygen/keygen_php.htm new file mode 100644 index 0000000..7df459a --- /dev/null +++ b/help/ru/manager/keygen/keygen_php.htm @@ -0,0 +1,143 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Генератор ключей: UNIX-версия</title> +</head> + +<body> + <h1>Генераторы ключей: UNIX-версия</h1> + + <h3>Описание</h3> + + <p>UNIX-версия генератора ключей преставляет собой PHP-файл, + содержащий все необходимое для генерации серийных номеров. Файл + находится в каталоге <strong>Keygen\PHP</strong>, ниже + рассмотрены основные моменты его + использования.</p> + + <h3>Настройка генератора</h3> + + <p>В самом начале PHP-файла располагается код настройки + генератора:</p> + <pre class="code">////////////////////////////////////////////////////////////////////////////////////////////// +// The following lines should be generated by VMProtect License Manager +$exported_algorithm = "RSA"; +$exported_bits = 2048; +$exported_private = "PJvj4kEpoQMIpYK+9wEt......xKeiSZgzdiln8Q=="; +$exported_modulus = "rOlny/3QgZb/VmGr3CmY......I6ESAUmtQ+RBqQ=="; +$exported_product_code = "oLQdGUn8kVk="; +////////////////////////////////////////////////////////////////////////////////////////////// +</pre> + + <p>Этот код генерируется автоматически в VMProtect (см. <a href= + "../licenses.htm#export">Экспорт параметров продукта</a>) и + уникален для каждого конкретного продукта. Очень важно + скопировать его без ошибок, в противном случае генератор будет + работать некорректно.</p><strong>Содержимое ключа</strong> + + <p>Далее в генераторе задается содержимое серийного номера. + Содержимое задается массивом, ниже задаются все возможные + параметры ключа, однако в реальных условиях часть из них может + отсутствовать:</p> + <pre class="code">$params = <strong>array</strong>( + user_name => "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> diff --git a/help/ru/manager/keygen/serial_format.htm b/help/ru/manager/keygen/serial_format.htm new file mode 100644 index 0000000..d11d34f --- /dev/null +++ b/help/ru/manager/keygen/serial_format.htm @@ -0,0 +1,260 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Формат серийного номера</title> + <style type="text/css"> +/*<![CDATA[*/ + th {text-align:left;} + table {border-collapse:collapse; margin-top: 4px;} + td,th {border: 1px solid #B0B0B0; padding-left:10;padding-right:10;} + /*]]>*/ + </style> +</head> + +<body> + <h1>Формат серийного номера</h1> + + <h3>Структура серийного номера</h3> + + <p>Серийный номер состоит из блоков. Каждый блок + начинается с байта идентификатора, который определяет его + содержимое и, возможно, длину. Последним всегда идет блок с + идентификатором 255, содержащий контрольную сумму всего серийного + номера, за исключением последнего блока.</p> + + <p>В зависимости от типа блока, он может иметь фиксированную или + переменную длину. Во втором случае обычно длина идет в следующем + за идентификатором блока байте. Подробно формат каждого блока + описан ниже.</p> + + <h3>Формат блоков</h3> + + <table border="1" cellspacing="0" cellpadding="2"> + <tr> + <th>ID</th> + + <th>Название</th> + + <th>Размер (байт)</th> + + <th>Описание</th> + + <th>Пример</th> + </tr> + + <tr> + <td>0x01</td> + + <td>Версия</td> + + <td>1</td> + + <td>Блок содержит версию серийного номера размером в 1 байт. + Версия должна быть равна 1.</td> + + <td>01 01</td> + </tr> + + <tr> + <td>0x02</td> + + <td>Имя пользователя</td> + + <td>1 + N</td> + + <td>Блок содержит имя пользователя в кодировке UTF-8. Перед + именем пользователя располагается 1 байт длины имени. Таким + образом, длина имени пользователя не может превышать 255 + байт. Завершающий 0 не требуется.</td> + + <td>02 04 4A 5F 48 4E</td> + </tr> + + <tr> + <td>0x03</td> + + <td>E-Mail</td> + + <td>1 + N</td> + + <td>Блок содержит e-mail пользователя в кодировке UTF-8. + Перед e-mail'ом располагается 1 байт длины. Таким образом, + длина e-mail не может превышать 255 байт. Завершающий 0 не + требуется.</td> + + <td>03 07 61 40 62 2E 63 6F 6D</td> + </tr> + + <tr> + <td>0x04</td> + + <td>Идентификатор оборудования</td> + + <td>1 + N</td> + + <td>Блок содержит идентификатор оборудования, возвращенный + функцией <strong>VMProtectGetCurrentHWID()</strong>. Функция + возвращает строку в кодировке base-64, в серийный номер + помещается раскодированный вариант строки. Длина блока данных + должна быть кратна 4. Перед блоком данных располагается байт + длины. Максимальная длина блока - 32 байта.</td> + + <td>04 08 E1 E2 E3 E4 A1 A2 A3 A4</td> + </tr> + + <tr> + <td>0x05</td> + + <td>Дата окончания лицензии</td> + + <td>4</td> + + <td>Блок содержит дату окончания действия серийного номера. + Формат хранения даты описан ниже.</td> + + <td>05 01 0A 07 DA</td> + </tr> + + <tr> + <td>0x06</td> + + <td>Максимальное время работы</td> + + <td>1</td> + + <td>Блок содержит 1 байт с временем работы программы в + минутах. Максимальное время работы, таким образом, может + составлять 255 минут.</td> + + <td>06 05</td> + </tr> + + <tr> + <td>0x07</td> + + <td>Код продукта</td> + + <td>8</td> + + <td>Блок содержит код продукта - 8 байт, которые создаются + VMProtect и выгружаются при экспорте параметров продукта. + Выгружаются они в кодировке base-64, перед помещением в + серийный номер строку необходимо преобразовать в массив байт. + Размер массива должен быть строго равен 8 байтам. + <strong>Этот блок является обязательным, без него защищенная + программа будет работать некорректно!</strong></td> + + <td>07 01 02 03 04 05 06 07 08</td> + </tr> + + <tr> + <td>0x08</td> + + <td>Данные пользователя</td> + + <td>1 + N</td> + + <td>Блок содержит до 255 байт пользовательских данных. + Система лицензирования не анализирует эти данные и возвращает + их при вызове функции + <strong>VMProtectGetSerialNumberData()</strong>. Перед блоком + данных располагается байт, содержащий размер пользовательских + данных.</td> + + <td>08 05 01 02 03 04 05</td> + </tr> + + <tr> + <td>0x09</td> + + <td>Максимальная дата сборки</td> + + <td>4</td> + + <td>Блок содержит максимальную дату сборки приложения, с + которым будет работать этот серийный номер. Формат хранения + даты описан ниже.</td> + + <td>09 01 0A 07 DA</td> + </tr> + + <tr> + <td>0xFF</td> + + <td>Контрольная сумма</td> + + <td>4</td> + + <td>Блок содержит контрольную сумму серийного номера. Блок + располагается последним и контрольная сумма считается для + всех блоков, идущих перед этим. Подробнее о расчете + контрольной суммы написано ниже.</td> + + <td>FF 01 02 03 04</td> + </tr> + </table> + + <h3>Формат хранения даты</h3> + + <p>Даты в серийном номере хранятся в виде двойного слова - + 0xYYYYMMDD. Старшее слово содержит год, а младшее - день и месяц. + Байты расположены в порядке Little Endian - от младшего к + старшему. В случае, если имеется указатель на первый байт записи, + то дата может быть считана и записана следующим кодом:</p> + <pre class="code"><strong>byte *</strong>pDate = 0xNNNNNN; // адрес даты +<strong>*</strong>(<strong>DWORD *</strong>)pDate = (2010 << 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> diff --git a/help/ru/manager/licenses.htm b/help/ru/manager/licenses.htm new file mode 100644 index 0000000..88517d5 --- /dev/null +++ b/help/ru/manager/licenses.htm @@ -0,0 +1,112 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Управление лицензиями</title> +</head> + +<body> + <h1>Управление лицензиями</h1> + + <h3>Инициализация</h3> + + <p>По умолчанию функции лицензирования выключены. Чтобы включить + их, нужно перейти в секцию "Лицензии" раздела "Проект" и создать пару ключей. В + случае, если проект ссылается на базу данных менеджера лицензий + (в старых версиях VMProtect лицензии управлялись отдельной + программой), то будет предложено импортировать эти лицензии в + проект. По окончании инициализации будут доступны опции привязки + кода к серийному номеру, а также появится возможность создавать и + обрабатывать серийные номера.</p> + + <h3>Интерфейс</h3> + + <p>Секция "Лицензии" отображает полный список лицензий в левой панели и + параметры выбранного элемента справа в основной панели.</p> + + <p><img src="../images/licenses1.png" /></p> + + <p>Правая панель отображает подробную информацию о выбранной + лицензии. Также там можно заблокировать серийный номер, + скопировать его в буфер обмена, посмотреть подробную информацию + об идентификаторе оборудования (кликнув по нему).</p> + + <h3 id="AddLicense">Создание лицензии</h3> + + <p>Для того чтобы добавить новую лицензию, необходимо кликнуть + соответствующую кнопку на панели инструментов. + Появится окно создания лицензии:</p> + + <p><img src="../images/project_add_license.png" /></p> + + <p>В верхней части окна задаются основные параметры лицензии. В + нижней можно выбрать, какие из основных параметров попадут в + серийный номер, а также добавить дополнительные параметры: + например, идентификатор оборудования или пользовательские данные. + По окончании заполнения полей нажмите ОК и VMProtect создаст + новую лицензию.</p> + + <h3>Удаление и блокирование лицензий</h3> + + <p>Для удаления лицензии щелкните по ней в списке лицензий правой кнопкой мыши и выберите "Удалить" в контекстном меню. Либо просто выделите лицензию в списке и нажмите Del. Для того чтобы заблокировать лицензию, переключите параметр "Заблокирована" в основной панели справа в состояние "Да".</p><p>Между удалением лицензии и ее блокированием есть + разница. Удаленные серийные номера не блокируются модулем + лицензирования. Они просто перестают существовать в базе данных. + Если лицензия создана ошибочно и серийный номер никогда никому не + отправлялся, то ее можно удалить. Если же серийный номер + скомпрометирован, то лицензию удалять нельзя, ее необходимо + заблокировать. Тогда в модуль лицензирования будет передана + информация об этом номере и он не будет принимать его.</p> + + <h3>Импорт серийных номеров</h3> + + <p>Серийные номера могут быть созданы не только в VMProtect, но и + в сторонних программах - генераторах номеров. Обычно они + применяются для автоматизированной выдачи серийных номеров + регистраторам при продаже лицензий. Чтобы корректно занести такие + номера в базу данных, существует функция импорта серийных + номеров. Для ее активации необходимо нажать сочетание клавиш + Ctrl+I или выбрать пункт "Импортировать" в меню "Проект".</p> + + <p><img src="../images/menu_project_import.png" /></p> + + <p>Первым шагом при импорте серийного номера является окно ввода + номера:</p> + + <p><img src="../images/import_key.png" /></p> + + <p>В случае, если такая лицензия уже есть в базе данных, будет + открыто окно редактирования лицензии. Если лицензии в базе нет, + то будет открыто окно создания лицензии, где можно внести + необходимые правки, после чего, нажатием кнопки ОК, лицензия + заносится в базу данных.</p><a name="export" id="export"></a> + + <h3>Экспорт параметров лицензирования</h3> + + <p>Для корректной работы генераторов ключей, им необходима + информация о секретном ключе продукта. Эту информацию в наиболее + подходящей форме можно получить, нажав кнопку "Экспорт ключа" над + списком лицензий. При этом появится окно экспорта данных:</p> + + <p><img src="../images/export_keys.png" /></p> + + <p>Поле "Формат экспорта" позволяет выбрать один из + поддерживаемых форматов, а поле "Результат экспорта" содержит + данные в виде, наиболее удобном для соответствующего генератора + ключей. Кнопка "Копировать" позволяет скопировать содержимое поля + "Результат экспорта" в буфер обмена.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/api.htm b/help/ru/manager/usage/api.htm new file mode 100644 index 0000000..df533b4 --- /dev/null +++ b/help/ru/manager/usage/api.htm @@ -0,0 +1,312 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Описание функций API лицензирования</title> + <style type="text/css"> +/*<![CDATA[*/ + th {text-align:left;} + table {border-collapse:collapse; margin-top: 4px;} + td,th {border: 1px solid #B0B0B0; padding-left:10;padding-right:10;} + /*]]>*/ + </style> +</head> + +<body> + <h1>Описание функций API лицензирования</h1> + + <p>API системы лицензирования является продолжением API VMProtect + и входит в его SDK. API позволяет задать серийный номер и + получить информацию о нем: подходит он к программе или нет, истек + ли срок действия, на кого зарегистрирован продукт и т.п. Также API + позволяет получить идентификатор оборудования, на котором + выполняется программа.</p><strong id= + "VMProtectSetSerialNumber">VMProtectSetSerialNumber</strong> + + <p>Функция предназначена для загрузки серийного номера в систему + лицензирования. Полный формат вызова представлен ниже:</p> + <pre class="code">int VMProtectSetSerialNumber(const char *SerialNumber); +</pre> + + <p>Входной параметр <strong>SerialNumber</strong> должен + содержать указатель на текстовую строку с серийным номером в + кодировке base-64 и завершаемую нулем ('\0'). Функция возвращает + битовую маску флагов состояния серийного номера, аналогичную той, + что возвращает <strong>VMProtectGetSerialNumberState()</strong>, + подробнее о флагах будет написано ниже. Серийный номер считается + "хорошим", если функция вернула значение 0.</p><br /> + <strong id= + "VMProtectGetSerialNumberState">VMProtectGetSerialNumberState</strong> + + <p>Функция возвращает флаги состояния серийного номера, + предварительно установленного вызовом + <strong>VMProtectSetSerialNumber()</strong>.</p> + <pre class="code">int VMProtectGetSerialNumberState(); +</pre> + + <p>Наличие хотя бы одного установленного флага говорит о + проблемах с серийным номером: программа не должна работать, если + установлен хотя бы один бит. Подробные значениях флагов описаны в + таблице:</p> + + <table border="1" cellspacing="0" cellpadding="2"> + <tr> + <th>Флаг</th> + + <th>Значение</th> + + <th>Описание</th> + </tr> + + <tr> + <td>SERIAL_STATE_FLAG_CORRUPTED</td> + + <td>0x00000001</td> + + <td>Система лицензирования повреждена. Возможные причины: + некорректная настройка проекта защиты, попытка взлома + программы.</td> + </tr> + + <tr> + <td>SERIAL_STATE_FLAG_INVALID</td> + + <td>0x00000002</td> + + <td>Серийный номер некорректен. Флаг выставляется, если + система лицензирования не может расшифровать серийный + номер.</td> + </tr> + + <tr> + <td>SERIAL_STATE_FLAG_BLACKLISTED</td> + + <td>0x00000004</td> + + <td>Серийный номер подходит к продукту, однако занесен в + черный список в VMProtect.</td> + </tr> + + <tr> + <td>SERIAL_STATE_FLAG_DATE_EXPIRED</td> + + <td>0x00000008</td> + + <td>Срок действия серийного номера истек. Подробную + информацию о сроке действия можно получить вызовом + <strong>VMProtectGetSerialNumberData()</strong></td> + </tr> + + <tr> + <td>SERIAL_STATE_FLAG_RUNNING_TIME_OVER</td> + + <td>0x00000010</td> + + <td>Время работы программы истекло. Подробную информацию о + времени работы программы можно получить вызовом + <strong>VMProtectGetSerialNumberData()</strong></td> + </tr> + + <tr> + <td>SERIAL_STATE_FLAG_BAD_HWID</td> + + <td>0x00000020</td> + + <td>Идентификатор оборудования не совпадает с тем, что + записан в серийном номере.</td> + </tr> + + <tr> + <td>SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED</td> + + <td>0x00000040</td> + + <td>Серийный номер не предназначен для работы с этой версией + защищаемой программы. Максимальную дату сборки программы, к + которой подходит этот серийный номер, можно узнать вызовом + <strong>VMProtectGetSerialNumberData()</strong>.</td> + </tr> + </table><br /><br /> + <strong id= + "VMProtectGetSerialNumberData">VMProtectGetSerialNumberData</strong> + + <p>Функция предназначена для получения информации о содержимом + серийного номера, установленного вызовом + <strong>VMProtectSetSerialNumber()</strong>. Формат вызова + представлен ниже:</p> + <pre class="code">bool VMProtectGetSerialNumberData(VMProtectSerialNumberData *Data, int Size); +</pre> + + <p>Первый параметр - указатель на структуру + <strong>VMProtectSerialNumberData</strong>, в которую будет + записана вся необходимая информация. Второй параметр - размер + структуры, передаваемой в первом параметре - служит для контроля + формата структуры. Функция возвращает FALSE в случаях, если система + лицензирования повреждена (см. флаг состояния + SERIAL_STATE_FLAG_CORRUPTED), если на вход подан нулевой адрес + структуры или если переданный размер структуры некорректен. Во + всех остальных случаях функция возвращает TRUE и записывает всю + информацию о серийном номере по указанном адресу. Ниже + описываются все элементы структуры:</p> + + <table border="1" cellspacing="0" cellpadding="2"> + <tr> + <th>Элемент</th> + + <th>Тип</th> + + <th>Описание</th> + </tr> + + <tr> + <td>nState</td> + + <td>int</td> + + <td>Битовая маска флагов проверки ключа. Аналогична той, что + возвращает + <strong>VMProtectGetSerialNumberState()</strong>.</td> + </tr> + + <tr> + <td>wUserName</td> + + <td>wchar_t[256]</td> + + <td>Имя покупателя в кодировке UNICODE, завершаемое + нулем.</td> + </tr> + + <tr> + <td>wEMail</td> + + <td>wchar_t[256]</td> + + <td>E-Mail покупателя в кодировке UNICODE, завершаемый + нулем.</td> + </tr> + + <tr> + <td>dtExpire</td> + + <td>VMProtectDate</td> + + <td>Дата окончания срока действия ключа. Формат структуры + VMProtectDate описан ниже.</td> + </tr> + + <tr> + <td>dtMaxBuild</td> + + <td>VMProtectDate</td> + + <td>Максимальная дата сборки продукта, с которой будет + работать этот ключ. Формат структуры VMProtectDate описан + ниже.</td> + </tr> + + <tr> + <td>bRunningTime</td> + + <td>int</td> + + <td>Количество минут, которое программа будет работать + (максимальная длина сессии). Измеряется в минутах, + отсчитывается с момента запуска программы.</td> + </tr> + + <tr> + <td>nUserDataLength</td> + + <td>unsigned char</td> + + <td>Длина пользовательских данных, размещенных в поле + <strong>bUserData</strong>.</td> + </tr> + + <tr> + <td>bUserData</td> + + <td>unsigned char[255]</td> + + <td>Пользовательские данные, записанные в ключ. Количество + актуальных байт указано в поле + <strong>nUserDataLength</strong>.</td> + </tr> + </table><br /> + + <p>Структура <strong>VMProtectDate</strong> предназначена для + компактного хранения даты. Ее поля описаны в таблице:</p> + + <table border="1" cellspacing="0" cellpadding="2"> + <tr> + <th>Элемент</th> + + <th>Тип</th> + + <th>Описание</th> + </tr> + + <tr> + <td>wYear</td> + + <td>unsigned short</td> + + <td>Год.</td> + </tr> + + <tr> + <td>bMonth</td> + + <td>unsigned char</td> + + <td>Месяц, нумерация начинается с единицы.</td> + </tr> + + <tr> + <td>bDay</td> + + <td>unsigned char</td> + + <td>День, нумерация начинается с единицы.</td> + </tr> + </table><br /> + <br /> + <strong id= + "VMProtectGetCurrentHWID">VMProtectGetCurrentHWID</strong> + + <p>Функция предназначена для получения идентификатора + оборудования, на котором работает программа. Формат вызова + следующий:</p> + <pre class="code">int VMProtectGetCurrentHWID(char * HWID, int Size); +</pre> + + <p>Первый параметр - указатель на область памяти, куда будет + записан идентификатор. Второй параметр - размер области данных. + Функция возвращает количество записанных байт с учетом + завершающего нуля ('\0'). Если вместо первого параметра подать + NULL, то функция вернет необходимое количество байт для записи + номера. Наиболее правильный способ вызова функции следующий:</p> + <pre class="code"><strong>int</strong> nSize = <strong>VMProtectGetCurrentHWID</strong>(NULL, 0); // получим необходимый размер буфера +<strong>char *</strong>pBuf = <strong>new char</strong>[nSize]; // выделим буфер +<strong>VMProtectGetCurrentHWID</strong>(pBuf, nSize); // получим идентификатор +// используем его +<strong>delete</strong> [] pBuf; // освободим память +</pre><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/index.htm b/help/ru/manager/usage/index.htm new file mode 100644 index 0000000..99189c0 --- /dev/null +++ b/help/ru/manager/usage/index.htm @@ -0,0 +1,127 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Интеграция в приложение</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Интеграция в приложение</h1> + + <p>В нескольких шагах, описанных ниже, мы создадим тестовое + приложение, которое будет обращаться к системе лицензирования: + подавать ей серийные номера и получать статус номера и его + содержимое. На первом этапе система лицензирования будет + использоваться в тестовом режиме, а на втором этапе - в + реальном.</p><strong>Режимы работы системы + лицензирования</strong> + + <p>В создании защиты всегда есть два этапа: разработка и + использование. В случае с лицензированием, вы сначала создаете + приложение, потом интегрируете механизмы защиты, добавляете + проверки и блокируете функции. И только потом, после + всестороннего тестирования, продукт передается пользователям и + начинается второй этап. Тестирование защищаемого приложения - + процесс сложный, необходимо убедиться в работоспособности всех + проверок и условных переходов. Создание "настоящих" серийных + номеров на все случаи жизни на этапе тестирования может оказаться + неудобным, поэтому у системы лицензирования есть т.н. "режим + разработки" или "тестовый" режим, при котором никакой защиты не + осуществляется, а реакция системы на серийные номера описывается + в конфигурационном файле. Когда приложение отлажено и корректно + работает с системой лицензирования, VMProtect заменяет "тестовый" + модуль лицензирования на реальный, проверяющий реальные серийные + номера. Это происходит в момент защиты приложения, поэтому + пропустить этот этап по ошибке не получится.</p><strong id="TestMode">Этап 1: + Тестовый режим работы</strong> + + <p>В тестовом режиме реакция системы лицензирования на серийные + номера, все возвращаемые статусы и данные описываются в + конфигурационном файле. Файл называется VMPLicense.ini и должен + располагаться в рабочем каталоге приложения. В 10 шагах, + представленных ниже, мы пройдем от создания простейшего + приложения до полноценного использования системы лицензирования в + тестовом режиме с привязкой к оборудованию и ограничением срока + бесплатных обновлений.</p> + + <ul> + <li><a href="step11_app.htm">Шаг 1.1: Создаем защищаемое + приложение</a></li> + + <li><a href="step12_code.htm">Шаг 1.2: Добавляем код проверки + лицензии</a></li> + + <li><a href="step13_flags.htm">Шаг 1.3: Получаем флаги состояния + номера</a></li> + + <li><a href="step14_name.htm">Шаг 1.4: Получаем имя и e-mail + пользователя</a></li> + + <li><a href="step15_exp.htm">Шаг 1.5: Проверяем срок действия + номера</a></li> + + <li><a href="step16_time.htm">Шаг 1.6: Ограничиваем время работы + программы</a></li> + + <li><a href="step17_maxbuild.htm">Шаг 1.7: Ограничиваем + бесплатные обновления</a></li> + + <li><a href="step18_blacklist.htm">Шаг 1.8: Номера из "черного + списка"</a></li> + + <li><a href="step19_hwid.htm">Шаг 1.9: Привязка к + оборудованию</a></li> + + <li><a href="step1A_userdata.htm">Шаг 1.10: Пользовательские + данные</a></li> + </ul><strong id="RealMode">Этап 2: Реальный режим работы</strong> + + <p>В реальном режиме работы системы лицензирования VMProtect + помещает в защищаемое приложение специальный модуль + лицензирования. Модуль выполняет все те же функции, что и + тестовый код в SDK, но работает не с ini-файлом, а с содержимым + серийного номера. В следующих пяти шагах мы защитим простое + приложение полноценной защитой на основе VMProtect и системы + лицензирования.</p> + + <ul> + <li><a href="step21_src.htm">Шаг 2.1: Создаем новое защищаемое + приложение</a></li> + + <li><a href="step22_vmp.htm">Шаг 2.2: Создаем проект защиты в + VMProtect</a></li> + + <li><a href="step23_product.htm">Шаг 2.3: Первый запуск + защищенного продукта</a></li> + + <li><a href="step24_test.htm">Шаг 2.4: Тестируем + результат</a></li> + + <li><a href="step25_codelock.htm">Шаг 2.5: Привязываем код к + серийному номеру</a></li> + </ul><strong>Дополнительная информация</strong> + + <p>Значения всех битовых флагов, форматы структур и параметры + вызова функций можно посмотреть в разделе <a href="api.htm">API + системы лицензирования</a>. Этот раздел удобно использовать как + справочник, тогда как шаги, описанные выше, позволяют легко + реализовать готовые типовые схемы защиты.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step11_app.htm b/help/ru/manager/usage/step11_app.htm new file mode 100644 index 0000000..cb5afbd --- /dev/null +++ b/help/ru/manager/usage/step11_app.htm @@ -0,0 +1,62 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 1.1: Создаем защищаемое приложение</title> +</head> + +<body> + <h1>Шаг 1.1: Создаем защищаемое приложение</h1> + + <p>Первым шагом будет создание приложения. Это будет простое + приложение, без интерфейса пользователя и каких-либо серьезных + возможностей. Нашей задачей будет передать системе лицензирования + серийный номер и получить от нее ответ.</p> + <pre class="code">#include <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> diff --git a/help/ru/manager/usage/step12_code.htm b/help/ru/manager/usage/step12_code.htm new file mode 100644 index 0000000..75bad46 --- /dev/null +++ b/help/ru/manager/usage/step12_code.htm @@ -0,0 +1,105 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 1.2: Добавляем код проверки лицензии</title> +</head> + +<body> + <h1>Шаг 1.2: Добавляем код проверки лицензии</h1><strong>Подключаем + VMProtect SDK</strong> + + <p>Если вы этого еще не сделали, то сейчас самое время подключить + к проекту VMProtect SDK. SDK это три файла: заголовочный файл + (VMProtectSDK.h), файл библиотеки (VMProtectSDK32.lib) и dll-файл + с реализацией (VMProtectSDK32.dll). Для 64-битной платформы есть + отдельные реализации библиотеки и dll-файла.</p> + + <p>Помещаем dll-файл в рабочий каталог нашего приложения, + файл заголовков и библиотечный файл - рядом с исходниками, включаем + файл заголовков в основной файл:</p> + <pre class="code">#include <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> diff --git a/help/ru/manager/usage/step13_flags.htm b/help/ru/manager/usage/step13_flags.htm new file mode 100644 index 0000000..a392b38 --- /dev/null +++ b/help/ru/manager/usage/step13_flags.htm @@ -0,0 +1,96 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 1.3: Получаем флаги состояния серийного номера</title> +</head> + +<body> + <h1>Шаг 1.3: Получаем флаги состояния серийного + номера</h1><strong>Удобная функция для печати флагов</strong> + + <p>Первым делом добавим в наш файл одну удобную функцию, которая + будет печатать в человеческом виде значения флагов состояния + серийного номера. Код функции приведен ниже:</p> + <pre class="code">#define PRINT_HELPER(state, flag) if (state & flag) printf("%s ", #flag) +void print_state(INT state) +{ + if (state == 0) + { + printf("state = 0\n"); + return; + } + + printf("state = "); + PRINT_HELPER(state, SERIAL_STATE_FLAG_CORRUPTED); + PRINT_HELPER(state, SERIAL_STATE_FLAG_INVALID); + PRINT_HELPER(state, SERIAL_STATE_FLAG_BLACKLISTED); + PRINT_HELPER(state, SERIAL_STATE_FLAG_DATE_EXPIRED); + PRINT_HELPER(state, SERIAL_STATE_FLAG_RUNNING_TIME_OVER); + PRINT_HELPER(state, SERIAL_STATE_FLAG_BAD_HWID); + PRINT_HELPER(state, SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED); + printf("\n"); +} +</pre> + + <p>Несмотря на свой размер, функция очень простая - она + последовательно проверяет все битовые флаги и печатает те, что + присутствуют в переменной состояния. Заменим + <strong>printf</strong> после проверки номера на вызов + <strong>print_state</strong>, заодно временно поправим серийный + номер, который подается в систему лицензирования:</p> + <pre class="code">char *serial = "Xserialnumber1"; // зададим номер непосредственно в коде для простоты +int res = VMProtectSetSerialNumber(serial); +print_state(res); +</pre> + + <p>Если запустить эту программу, то на консоль выведется + следующее:</p> + <pre class="code">state = SERIAL_STATE_FLAG_INVALID +please register! +</pre> + + <p>Вернем теперь старый серийный номер, убрав "1", и запустим + программу еще раз:</p> + <pre class="code">state = 0 +We are registered. +</pre> + + <p>Теперь, когда мы можем видеть флаги состояние серийного + номера, перейдем к получению флагов и данных из серийного + номера.</p><strong>Получение состояния номера</strong> + + <p>Состояние номера можно получить тремя способами: вызвав + <strong>VMProtectSetSerialNumber()</strong>, вызвав + <strong>VMProtectGetSerialNumberState()</strong> и вызвав + <strong>VMProtectGetSerialNumberData()</strong> - флаги состояния + будут помещены в одно из полей структуры. Каждый из методов + предназначен для использования в разное время. Первая проверка + серийного номера происходит непосредственно при его установке. В + этот момент нужно отсекать некорректные номера, номера с истекшим + сроком действия, номера из черного списка и т.п. Некоторые + ограничения - скажем, максимальное время работы продукта или срок + действия номера, имеет смысл проверять и в процессе работы + программы. Тут оптимально воспользоваться простым и быстрым + методом <strong>VMProtectGetSerialNumberState()</strong>, а в + случае, если нужно получить подробную информацию о данных в + серийном номере, можно использовать более мощную функцию + <strong>VMProtectGetSerialNumberData()</strong>.</p><br /> + <a href="step14_name.htm">Следующий шаг</a> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step14_name.htm b/help/ru/manager/usage/step14_name.htm new file mode 100644 index 0000000..c6b6759 --- /dev/null +++ b/help/ru/manager/usage/step14_name.htm @@ -0,0 +1,53 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 1.4: Получаем имя и e-mail пользователя</title> +</head> + +<body> + <h1>Шаг 1.4: Получаем имя и e-mail пользователя</h1> + + <p>Начнем с простого: получим из серийного номера имя и e-mail + пользователя (часто показываются в окне About). Для этого нам + придется прописать их в ini-файл. Добавим еще две строчки к нашим + двум:</p> + <pre class="code">[TestLicense] +AcceptedSerialNumber=Xserialnumber +UserName=John Doe +EMail=john@doe.com +</pre> + + <p>А в самой программе, в случае успешной регистрации, добавим + получение этих данных и вывод их на экран:</p> + <pre class="code">VMProtectSerialNumberData sd = {0}; +VMProtectGetSerialNumberData(&sd, sizeof(sd)); +printf("name = %ls,\ne-mail = %ls\n", sd.wUserName, sd.wEMail); +</pre> + + <p>Структура содержит данные в UNICODE, поэтому в + <strong>printf()</strong> использованы спецификаторы %ls вместо %s. + Программа должна вывести на экран текст:</p> + <pre class="code">state = 0 +We are registered. +name = John Doe, +e-mail = john@doe.com +</pre><br /> + <a href="step15_exp.htm">Следующий шаг</a> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step15_exp.htm b/help/ru/manager/usage/step15_exp.htm new file mode 100644 index 0000000..19169c7 --- /dev/null +++ b/help/ru/manager/usage/step15_exp.htm @@ -0,0 +1,59 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 1.5: Проверяем срок действия серийного номера</title> +</head> + +<body> + <h1>Шаг 1.5: Проверяем срок действия серийного номера</h1> + + <p>Поместите в ini-файл строчку вида ExpDate=YYYYMMDD - например, + такую:</p> + <pre class="code">ExpDate=20000101 +</pre> + + <p>Важно, чтобы дата, указанная в строке, уже прошла. Т.е. + максимум - вчера. Запустив программу, вы увидите следующее:</p> + <pre class="code">state = SERIAL_STATE_FLAG_DATE_EXPIRED +please register! +</pre> + + <p>Добавим получение дополнительной информации перед выходом с + сообщением "please register":</p> + <pre class="code">if (res) +{ + VMProtectSerialNumberData sd = {0}; + VMProtectGetSerialNumberData(&sd, sizeof(sd)); + printf("exp. date: y = %d, m = %d, d = %d\n", sd.dtExpire.wYear, sd.dtExpire.bMonth, sd.dtExpire.bDay); + printf("please register!\n"); + return 0; +} +</pre> + + <p>Повторный запуск приложения даст нам больше подробностей:</p> + <pre class="code">state = SERIAL_STATE_FLAG_DATE_EXPIRED +exp. date: y = 2000, m = 1, d = 1 +please register! +</pre> + + <p>Удалите из ini-файла строку ExpDate=..., чтобы она не мешала + нам в дальнейшем.</p><br /> + <a href="step16_time.htm">Следующий шаг</a> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step16_time.htm b/help/ru/manager/usage/step16_time.htm new file mode 100644 index 0000000..8ccd5d6 --- /dev/null +++ b/help/ru/manager/usage/step16_time.htm @@ -0,0 +1,79 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 1.6: Ограничиваем время работы программы</title> +</head> + +<body> + <h1>Шаг 1.6: Ограничиваем время работы программы</h1> + + <p>Вы можете ограничить время работы программы с момента запуска. + Это может быть полезно для демонстрационных целей: выдается + полноценный серийный номер, однако программа работает не более + пяти минут. Система лицензирования не закрывает такую программу + принудительно по истечении указанного времени, а лишь уведомляет + об окончании времени выставлением флага состояния. Зададим + ограничение времени работы в одну минуту, добавив в ini-файл + строчку:</p> + <pre class="code">TimeLimit=1 +</pre> + + <p>Модифицируем программу следующим образом:</p> + <pre class="code">int main(int argc, char **argv) +{ + char *serial = "Xserialnumber"; // зададим номер непосредственно в коде для простоты + + int res = VMProtectSetSerialNumber(serial); + print_state(res); + if (res) return 0; + + VMProtectSerialNumberData sd = {0}; + VMProtectGetSerialNumberData(&sd, sizeof(sd)); + printf("I will run for %d minute(s)\n", sd.bRunningTime); + print_state(VMProtectGetSerialNumberState()); + Sleep(60 * 1000 * sd.bRunningTime); + printf("After %d minute(s):\n", sd.bRunningTime); + print_state(VMProtectGetSerialNumberState()); + + return 0; +} +</pre> + + <p>Программа выводит состояние серийного номера в момент старта, + потом считывает максимальное время работы, ждет, пока оно пройдет + и выводит состояние номера еще раз. Для одной минуты мы получим + следующий результат:</p> + <pre class="code">state = 0 +I will run for 1 minute(s) +state = 0 +After 1 minute(s): +state = SERIAL_STATE_FLAG_RUNNING_TIME_OVER +</pre> + + <p>Защищаемая программа должна анализировать состояние серийного + номера с определенной периодичностью и завершить свою работу в + случае появления такого флага. Система лицензирования не делает + этого автоматически, т.к. программе может требоваться освободить + какие-то ресурсы, записать данные в файл и т.д. Также программа + может не завершаться по истечении данного времени, а переходить в + более ограниченный режим работы. Система лицензирования оставляет + эти вопросы на усмотрение разработчика.</p><br /> + <a href="step17_maxbuild.htm">Следующий шаг</a> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step17_maxbuild.htm b/help/ru/manager/usage/step17_maxbuild.htm new file mode 100644 index 0000000..d76c271 --- /dev/null +++ b/help/ru/manager/usage/step17_maxbuild.htm @@ -0,0 +1,85 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 1.7: Ограничиваем бесплатные обновления</title> +</head> + +<body> + <h1>Шаг 1.7: Ограничиваем бесплатные обновления</h1><strong>Схема + работы</strong> + + <p>В момент защиты приложения VMProtect запоминает дату, когда это + происходило. Эта дата является для системы лицензирования датой + сборки приложения. В серийном номере можно прописать максимальную + дату сборки, для которой подойдет этот номер. Таким образом, если + при создании ключа Вы пропишете в него текущую дату + 1 год, то + ключ подойдет ко всем релизам Вашей программы, которые вы + выпустите в течение года. К релизу, выпущенному через год и 1 + день ключ уже не подойдет и у пользователя будет выбор: + пользоваться более старой версией или купить новый ключ, который + будет работать еще год.</p><strong>Пробуем на деле</strong> + + <p>Поместите в ini-файл строчку вида MaxBuildDate=YYYYMMDD - + например, такую:</p> + <pre class="code">MaxBuildDate=20000101 +</pre> + + <p>В тестовом режиме система лицензирования считает датой сборки + сегодняшнее число, поэтому важно, чтобы дата, указанная в строке, + уже прошла. Т.е. максимум - вчера. Модифицируйте исходный код + функции <strong>main()</strong>, чтобы он выглядел так:</p> + <pre class="code">int main(int argc, char **argv) +{ + char *serial = "Xserialnumber"; // зададим номер непосредственно в коде для простоты + + int res = VMProtectSetSerialNumber(serial); + print_state(res); + + if (res) + { + VMProtectSerialNumberData sd = {0}; + VMProtectGetSerialNumberData(&sd, sizeof(sd)); + printf("max. build date: y = %d, m = %d, d = %d\n", sd.dtMaxBuild.wYear, sd.dtMaxBuild.bMonth, sd.dtMaxBuild.bDay); + printf("please register!\n"); + return 0; + } + + printf("I'm registered\n"); + + return 0; +} +</pre> + + <p>Тогда при запуске программы вы увидите следующее:</p> + <pre class="code">state = SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED +max. build date: y = 2000, m = 1, d = 1 +please register! +</pre> + + <p>Заменив в ini-файле дату на сегодняшнюю или завтрашнюю, мы + получим "рабочую" программу:</p> + <pre class="code">state = 0 +I'm registered +</pre> + + <p>Удалите из ini-файла строку MaxBuildDate=..., чтобы она не + мешала нам в дальнейшем.</p><br /> + <a href="step18_blacklist.htm">Следующий шаг</a> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step18_blacklist.htm b/help/ru/manager/usage/step18_blacklist.htm new file mode 100644 index 0000000..f0a1eab --- /dev/null +++ b/help/ru/manager/usage/step18_blacklist.htm @@ -0,0 +1,64 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 1.8: Номера из "черного списка"</title> +</head> + +<body> + <h1>Шаг 1.8: Номера из "черного списка"</h1> + + <p>Номер, помеченный в VMProtect как "заблокированный", больше не + должен приниматься системой лицензирования. При очередной защите + приложения VMProtect запишет в защищаемый файл хеш от номеров + черного списка, вследствие чего система лицензирования в этом приложении откажет при попытке + установить такой номер.</p> + + <p>Сократим до минимума код функции <strong>main()</strong>:</p> + <pre class="code">int main(int argc, char **argv) +{ + char *serial = "Xserialnumber"; // зададим номер непосредственно в коде для простоты + + int res = VMProtectSetSerialNumber(serial); + print_state(res); + + return 0; +} +</pre> + + <p>Запустим программу и убедимся, что система лицензирования + принимает наш серийный номер:</p> + <pre class="code">state = 0 +</pre> + + <p>Теперь занесем наш номер в черный список с точки зрения + системы лицензирования. Для этого в ini-файл добавим строку:</p> + <pre class="code">BlackListedSerialNumber=Xserialnumber +</pre> + + <p>И снова запускаем программу:</p> + <pre class="code">state = SERIAL_STATE_FLAG_BLACKLISTED +</pre> + + <p>Сообщать ли пользователю о занесении его номера в черный список, + или просто сообщить, что номер неверный - оставлено на усмотрение + разработчика. Система лицензирования лишь сообщает программе о + факте использования заблокированного номера.</p><br /> + <a href="step19_hwid.htm">Следующий шаг</a> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step19_hwid.htm b/help/ru/manager/usage/step19_hwid.htm new file mode 100644 index 0000000..354206b --- /dev/null +++ b/help/ru/manager/usage/step19_hwid.htm @@ -0,0 +1,123 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 1.9: Привязка к оборудованию</title> + <style type="text/css"> +/*<![CDATA[*/ + div.c2 {text-align: center} + p.c1 {color:red;} + /*]]>*/ + </style> +</head> + +<body> + <h1>Шаг 1.9: Привязка к оборудованию</h1><strong>Получение + идентификатора оборудования</strong> + + <p>Прежде чем привязываться к оборудованию, необходимо получить + идентификатор оборудования. Идентификатор помещается в серийный + номер и при передаче этого номера системе лицензирования + происходит проверка соответствия идентификаторов. Поэтому для + начала получим идентификатор нашего оборудования. Сократим + <strong>main()</strong> до самого короткого варианта:</p> + <pre class="code">int main(int argc, char **argv) +{ + int nSize = VMProtectGetCurrentHWID(NULL, 0); + char *buf = new char[nSize]; + VMProtectGetCurrentHWID(buf, nSize); + printf("HWID: %s\n", buf); + delete [] buf; + return 0; +} +</pre> + + <p>Запустив эту программу, мы получим тестовый идентификатор + оборудования, используемый по умолчанию:</p> + <pre class="code">HWID: myhwid +</pre> + + <p>Чтобы изменить идентификатор, используемый по умолчанию, + добавьте в ini-файл строку:</p> + <pre class="code">MyHWID=test +</pre> + + <p>Запустив программу после этого, мы увидим, что система + лицензирования теперь считает "test" идентификатором + оборудования:</p> + <pre class="code">HWID: test +</pre> + + <p class="c1"><strong>Внимание!</strong> реальный идентификатор + оборудования программа будет выдавать только после ее обработки в + VMProtect.</p><br /> + <strong>Серийный номер с привязкой к оборудованию</strong> + + <p>Чтобы наш тестовый серийный номер был привязан к оборудованию, + добавим в ini-файл еще одну строчку, на этот раз с + идентификатором, "записанным" в номер:</p> + <pre class="code">KeyHWID=test +</pre> + + <p>А функцию <strong>main()</strong> слегка усложним, она снова + будет подавать серийный номер и анализировать получаемый + результат:</p> + <pre> +int main(int argc, char **argv) +{ + int nSize = VMProtectGetCurrentHWID(NULL, 0); + char *buf = new char[nSize]; + VMProtectGetCurrentHWID(buf, nSize); + printf("HWID: %s\n", buf); + delete [] buf; + + char *serial = "Xserialnumber"; + int res = VMProtectSetSerialNumber(serial); + print_state(res); + return 0; +} +</pre> + + <p>Запустив код, получим следующий результат:</p> + <pre class="code">HWID: test +state = 0 +</pre> + + <p>Система лицензирования сравнила текущий идентификатор + оборудования и тот, который был запиан в серийном номере. + Идентификаторы совпали и функция + <strong>VMProtectSetSerialNumber()</strong> вернула 0 - серийный + номер подходит.</p> + + <p>Попробуем теперь "запустить" нашу программу на другом + оборудовании. Для этого поменяем значение "test" параметра MyHWID + в ini-файле на "new test". И снова запустим программу:</p> + <pre class="code">HWID: new test +state = SERIAL_STATE_FLAG_BAD_HWID +</pre> + + <p>На этот раз система лицензирования вернула флаг + SERIAL_STATE_FLAG_BAD_HWID, означающий несовпадение реально + идентификатора оборудования с тем, что хранится в серийном + номере. Текущий идентификатор оборудования, выведенный на экран - + "new test", а в серийном номере хранится "test". Поменяв в + ini-файле значение параметра KeyHWID на "new test" можно добиться + работы серийного номера и на этом "оборудовании".</p><br /> + <a href="step1A_userdata.htm">Следующий шаг</a> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step1A_userdata.htm b/help/ru/manager/usage/step1A_userdata.htm new file mode 100644 index 0000000..15fc5de --- /dev/null +++ b/help/ru/manager/usage/step1A_userdata.htm @@ -0,0 +1,76 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 1.10: Пользовательские данные</title> +</head> + +<body> + <h1>Шаг 1.10: Пользовательские данные</h1> + + <p>Серийный номер может содержать до 255 байт произвольных + данных, которые система лицензирования без изменений передает + вызывающей программе. Это может быть какая-то дополнительная + информация о продаже, данные, без которых не будет работать + полная версия, или еще что-нибудь. Изменим функцию + <strong>main()</strong>, чтобы она считывала данные из серийного + номера и показывала их на экране:</p> + <pre class="code">int main(int argc, char **argv) +{ + char *serial = "Xserialnumber"; + int res = VMProtectSetSerialNumber(serial); + print_state(res); + if (res) return 0; + + VMProtectSerialNumberData sd = {0}; + VMProtectGetSerialNumberData(&sd, sizeof(sd)); + printf("Serial number has %d byte(s) of data\n", sd.nUserDataLength); + for (int i = 0; i < sd.nUserDataLength; i++) + printf("%02X ", sd.bUserData[i]); + printf("\n"); + return 0; +} +</pre> + + <p>Ini-файл при этом сократим до такого вида:</p> + <pre class="code">[TestLicense] +AcceptedSerialNumber=Xserialnumber +</pre> + + <p>Теперь запустим программу и убедимся, что наш серийный номер + подходит, но не содержит никаких данных:</p> + <pre class="code">state = 0 +Serial number has 0 byte(s) of data +</pre> + + <p>Чтобы добавить пользовательские данные в серийный номер, + необходимо создать в ini-файле переменную UserData и присвоить ей + строчку из HEX-символов. Символы должны идти парами, т.е. длина + строки должна быть кратна 2. Строка может быть, например, + такой:</p> + <pre class="code">UserData=010203A0B0C0D0E0 +</pre> + + <p>В этом случае при запуске программы мы получим следующий + результат:</p> + <pre class="code">state = 0 +Serial number has 8 byte(s) of data +01 02 03 A0 B0 C0 D0 E0 +</pre><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step21_src.htm b/help/ru/manager/usage/step21_src.htm new file mode 100644 index 0000000..65a2ec7 --- /dev/null +++ b/help/ru/manager/usage/step21_src.htm @@ -0,0 +1,109 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 2.1: Создаем новое защищенное приложение</title> +</head> + +<body> + <h1>Шаг 2.1: Создаем новое защищенное приложение</h1> + + <p>Если на первом этапе мы создавали несколько разных тестовых + приложений для изучения API системы лицензирования, то на втором этапе + приложение будет одно. Оно также будет консольным и в нем будет + функция <strong>foo()</strong>, которая может работать только в + зарегистрированной версии. Вот код нашего тестового + приложения:</p> + <pre class="code">#include <windows.h> +#include <stdio.h> +#include "VMProtectSDK.h" + +#define PRINT_HELPER(state, flag) if (state & flag) printf("%s ", #flag) +void print_state(INT state) +{ + if (state == 0) + { + printf("state = 0\n"); + return; + } + + printf("state = "); + PRINT_HELPER(state, SERIAL_STATE_FLAG_CORRUPTED); + PRINT_HELPER(state, SERIAL_STATE_FLAG_INVALID); + PRINT_HELPER(state, SERIAL_STATE_FLAG_BLACKLISTED); + PRINT_HELPER(state, SERIAL_STATE_FLAG_DATE_EXPIRED); + PRINT_HELPER(state, SERIAL_STATE_FLAG_RUNNING_TIME_OVER); + PRINT_HELPER(state, SERIAL_STATE_FLAG_BAD_HWID); + PRINT_HELPER(state, SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED); + printf("\n"); +} + +char *read_serial(const char *fname) +{ + FILE *f; + if (0 != fopen_s(&f, fname, "rb")) return NULL; + fseek(f, 0, SEEK_END); + int s = ftell(f); + fseek(f, 0, SEEK_SET); + char *buf = new char[s + 1]; + fread(buf, s, 1, f); + buf[s] = 0; + fclose(f); + return buf; +} + +// метод foo() очень короткий, но он нам нужен в виде отдельной функции +// поэтому мы попросим компилятор не делать его inline +__declspec(noinline) void foo() +{ + printf("I'm foo!\n"); +} + +int main(int argc, char **argv) +{ + char *serial = read_serial("serial.txt"); + int res = VMProtectSetSerialNumber(serial); + delete [] serial; + if (res) + { + printf("serial number is bad\n"); + print_state(res); + return 0; + } + printf("serial number is correct, calling foo()\n"); + foo(); + printf("done\n"); + return 0; +} +</pre> + + <p>Скомпилируем программу без отладочной информации, но в + настройках линкера попросим создать MAP-файл, который потребуется + для работы VMProtect. При запуске программы мы должны увидеть + следующий текст:</p> + <pre class="code">serial number is bad +state = SERIAL_STATE_FLAG_INVALID +</pre> + + <p>В настоящий момент система лицензирования все еще работает в + тестовом режиме, т.к. файл еще не был обработан VMProtect'ом и в + него не был внедрен модуль лицензирования. На <a href= + "step22_vmp.htm">следующем шаге</a> мы создадим проект VMProtect + и попробуем защитить нашу программу.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step22_vmp.htm b/help/ru/manager/usage/step22_vmp.htm new file mode 100644 index 0000000..bf0ac9b --- /dev/null +++ b/help/ru/manager/usage/step22_vmp.htm @@ -0,0 +1,42 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 2.2: Создаем проект защиты в VMProtect</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Шаг 2.2: Создаем проект защиты в VMProtect</h1> + + <p>Теперь, когда тестовая программа готова, скомпилирована и + рядом с ней находится ее MAP-файл, мы можем запустить VMProtect + Ultimate и открыть исполняемый файл. Нам нужно будет добавить в + проект две функции: _main (так Visual Studio переименовала нашу + функцию main()) и foo(). Обе функции видны в списке функций в + VMProtect в разделе "Функции".</p> + + <!-- <p class="c1"><br /><img src="../../images/real_project_functions.png" alt="Дерево проекта" /></p> --> + + <p>Далее необходимо инициализировать систему лицензирования. + Перейдите на вкладку "Лицензии" и создайте пару кючей длиной 2048 + бит.</p><br /> + <a href="step23_product.htm">Следующий шаг</a> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step23_product.htm b/help/ru/manager/usage/step23_product.htm new file mode 100644 index 0000000..bf5784b --- /dev/null +++ b/help/ru/manager/usage/step23_product.htm @@ -0,0 +1,70 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 2.3: Первый запуск защищенного продукта</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Шаг 2.3: Первый запуск защищенного продукта</h1> + + <p>Система лицензирования инициализирована, так что мы можем + попробовать скомпилировать проект VMPrtoect и запустить + защищенный файл. Запустив его из командной строки мы получим + следующее сообщение:</p> + <pre class="code">C:\test>dummy_app.vmp.exe +serial number is bad +state = SERIAL_STATE_FLAG_INVALID +</pre> + + <p>Запустив программу depends.exe, мы можем убедиться, что наш + защищенный файл более не связан с библиотекой VMProtectSDK.dll, а + значит модуль лицензирования встроен в приложение. Список + используемых DLL можно посмотреть и в VMProtect, открыв + защищенный файл и выбрав из раздела "Свойства" секцию "Импорты".</p> + + <p><img src="../../images/depends.png" /></p> + + <p>Наша защищаемая программа читает серийный номер из файла + serial.txt. Поскольку этого файла сейчас нет, то модулю лицензирования + подается пустой номер, который также не считается корректным. + Перейдем на закладку "лицензии" и сгенерируем серийный номер. + Подробно эта процедура описана <a href= + "../licenses.htm">здесь</a>, мы создадим самый простой серийный + номер без каких-либо ограничений.</p> + + <p><img src="../../images/project_add_license.png" /></p> + + <p>Затем скопируем серийный номер (в свойствах лицензии выделим поле + "Серийный номер" и нажмем Ctrl+C), создадим рядом с + защищенным приложением файл serial.txt и вставим туда серийный + номер. После запуска программы мы увидим следующее:</p> + <pre class="code">C:\test>dummy_app.vmp.exe +serial number is correct, calling foo() +I'm foo +done +</pre> + + <p>Система лицензирования проверила серийный номер и посчитала + его корректным. На <a href="step24_test.htm">следующем шаге</a> мы + попробуем применить некоторые ограничения и посмотрим что из + этого выйдет.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step24_test.htm b/help/ru/manager/usage/step24_test.htm new file mode 100644 index 0000000..31f5ed8 --- /dev/null +++ b/help/ru/manager/usage/step24_test.htm @@ -0,0 +1,90 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 2.4: Тестируем результат</title> +</head> + +<body> + <h1>Шаг 2.4: Тестируем результат</h1><strong>Срок действия + серийного номера</strong> + + <p>Создадим еще один серийный номер с ограничением срока + действия - скажем, 2005-м годом. Эта дата уже прошла и наш номер + должен быть недействительным. Перейдите на закладку "Лицензии" и + нажмите кнопку "Добавить лицензию". В появившемся окне поставьте + галочку "Срок годности" и введите "30 сентября 2005 года". + Создайте номер, скопируйте его и поместите в файл seral.txt, + после чего запустите программу:</p> + <pre class="code">C:\test>dummy_app.vmp.exe +serial number is bad +state = SERIAL_STATE_FLAG_DATE_EXPIRED +</pre> + + <p>Модуль лицензирования вернул флаг "срок действия номера + закончен". Вернем рабочий номер обратно в файл serial.txt и + убедимся, что его модуль лицензирования примет без проблем.</p> + <pre class="code">C:\test>dummy_app.vmp.exe +serial number is correct, calling foo() +I'm foo +done +</pre><strong>Занесение номера в черный список</strong> + + <p>Предположим, что наш "хороший" серийный номер выложен в + Интернет. Нам необходимо его заблокировать, чтобы в следующих + версиях программы он уже не работал. Для этого мы выбираем его в + списке номеров и нажимаем кнопку "Заблокировать". Сам факт + нажатия кнопки не блокирует серийный номер в защищенном + приложении, однако после повторной защиты файла, он откажется + принимать этот серийный номер. Проверим. Если сейчас запустить + нашу программу, то она примет заблокированный номер без проблем, + т.к. это старая версия программы и она еще не знает о + блокировке:</p> + <pre class="code">C:\test>dummy_app.vmp.exe +serial number is correct, calling foo() +I'm foo +done +</pre> + + <p>Сделаем копию нашей программы и назовем ее + "dummy_app1.vmp.exe", а после этого перейдем в VMProtect и + повторно защитим наше приложение, после чего запустим новую + версию программы:</p> + <pre class="code">C:\test>dummy_app.vmp.exe +serial number is bad +state = SERIAL_STATE_FLAG_BLACKLISTED +</pre> + + <p>Теперь для сравнения еще раз запустим старую версию + программы:</p> + <pre class="code">C:\test>dummy_app1.vmp.exe +serial number is correct, calling foo() +I'm foo +done +</pre> + + <p>Старая версия ничего не знает о блокировании номера и + продолжает работать как и раньше. </p><br /> + <br /><p>На <a href= + "step25_codelock.htm">последнем шаге</a> мы попробуем привязать + выполняемый код к серийному номеру. Перед этим разблокируйте + серийный номер и перезащитите приложение в VMProtect, чтобы оно + снова принимало наш серийный номер. Или создайте новую + лицензию.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step25_codelock.htm b/help/ru/manager/usage/step25_codelock.htm new file mode 100644 index 0000000..8cbe5c4 --- /dev/null +++ b/help/ru/manager/usage/step25_codelock.htm @@ -0,0 +1,144 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 2.5. Привязка кода к серийному номеру</title> + <style type="text/css"> +/*<![CDATA[*/ + p.c2 {color:red;} + span.c1 {background-color:yellow;} + /*]]>*/ + </style> +</head> + +<body> + <h1>Шаг 2.5. Привязка кода к серийному номеру</h1> + + <p>Одним из наиболее популярных способов взлома программ является + поиск проверки серийного номера и последующего условного + перехода. Если номер корректен, то ход выполнения программы идет + по одной ветке, если некорректен, то по другой. Хакер находит + этот переход и заменяет его на безусловный переход на + "правильную" ветку. Давайте "взломаем" таким образом нашу + тестовую программу. На уровне исходников, конечно же. "Отключим" + условный переход:</p> + <pre class="code">char *serial = read_serial("serial.txt"); +int res = VMProtectSetSerialNumber(serial); +delete [] serial; +if (<span class="c1">false &&</span> res) +{ +</pre> + + <p>Теперь наша программа примет любой серийный номер и будет + работать как ни в чем не бывало. Безусловно, если файл защищен + VMProtect, то даже опытному хакеру потребуется не один месяц, + чтобы найти и исправить этот переход так, как сделали это мы. А с + учетом того, что правильно защищенная программа проверяет + серийный номер не в одном месте и не всегда, то даже такая + простая проверка уже достаточно надежна. Однако мы пойдем + дальше.</p><strong>Привяжем код к серийному номеру</strong> + + <p class="c2"><strong>Внимание!</strong> демо-версия VMProtect + имеет ограничение на количество обрабатываемых функций: + обрабатывается только одна функция. Поэтому в случае + использования демо-версии, необходимо включать в проект только + функцию foo(), т.к. в противном случае демо-версия VMProtect + может выбрать для защиты функцию main() и привязка кода к + серийному номеру не сработает.</p> + + <p>Система лицензирования VMProtect позволяет привязать код одной + или нескольких функций к серийному номеру так, что они не будут + работать без корректного номера. Тело функции виртуализируется, + потом шифруется и может быть расшифровано только при наличии + корректного серийного номера. То есть даже если хакер найдет и + исправит условный переход в коде проверки номера, функции, + привязанные к номеру, все равно не будут работать. Давайте + попробуем. В VMProtect в разделе "Функции" выберем функцию <strong>foo()</strong> и в + правой панели изменим значение опции "Привязать к серийному номеру" на "Да".</p> + + <p><img src="../../images/lock_to_serial.png" /></p> + + <p>После этого защитим наше приложение. С учетом + того, что оно "взломано", поместим в файл serial.txt произвольный + текст и запустим приложение. В консоли появится текст:</p> + <pre class="code">C:\test>dummy_app.vmp.exe +serial number is correct, calling foo() +</pre> + + <p>То есть хакер "исправил" нужный условный переход и программа + пошла по "правильной" ветке. Однако в момент вызова + <strong>foo()</strong> программа выводит сообщение:</p> + + <p><img src="../../images/codelock_error.png" /></p> + + <p>Так как мы привязали функцию <strong>foo()</strong> к + серийному номеру, а у хакера его нет, то при попытке расшифровать + код функции модуль лицензирования выдал сообщение о невозможности + продолжить выполнение программы. После нажатия кнопки "ОК" + программа завершится и в консоли мы не увидим строчки + "done".</p><strong>Что привязывать к серийному номеру?</strong> + + <p>Привязывать к серийному номеру имеет смысл те функции, которые + вызываются только в зарегистрированной версии программы. Так как + привязка возможна только при использовании виртуализации, то + необходимо принимать во внимание возможное падение + производительности. Скажем, если текстовый редактор не позволяет + сохранять результаты своей работы в демо-версии, то к серийному + номеру можно привязать функцию сохранения документа. Если эта + функция вызывает ряд других в процессе работы, то их привязывать + уже не обязательно, так как без основной функции от них будет + немного толку.</p> + + <p>Также необходимо помнить, что вызов привязанной функции без + серийного номера приведет к завершению работы программы без + возможности сохранения результатов работы, поэтому тщательно + тестируйте защищаемую программу, чтобы она не позволяла вызвать + такие функции в демо-режиме. В примере с текстовым редактором + убедитесь, что в демо-режиме пункт меню "Сохранить" всегда + неактивен, что комбинация Ctrl+S не срабатывает и что при + закрытии программы также не предлагается сохранить изменения. В + противном случае пользователь может составить негативное мнение о + вашей программе.</p><strong>Привязка к серийному номеру и + нерабочие номера</strong> + + <p>При вызове функции <strong>VMProtectSetSerialNumber()</strong> + модуль лицензирования проверяет переданный серийный номер и + зашифрованные участки кода будут выполняться только в том случае, + если на момент проверки серийный номер был полностью корректным - + не занесенным в черный список, с правильным идентификатором + оборудования, с неистекшим сроком годности и т.п. В этом случае все + зашифрованные процедуры будут выполняться до завершения работы + приложения или до нового вызова + <strong>VMProtectSetSerialNumber()</strong>.</p> + + <p>Некоторые ограничения могут "сработать" в процессе выполнения + программы: например, может истечь время работы программы или + окончится срок действия серийного номера. В этом случае модуль + лицензирования продолжит расшифровывать и выполнять функции, + привязанные к серийному номеру. Это делается потому, что + защищенному приложению будет сложно отследить момент срабатывания + ограничений и соответствующим образом изменить модель своего + поведения (заблокировать пункты меню и т.п). Если модуль + лицензирования неожиданно для приложения перестанет выполнять + привязанные к серийному номеру участки кода, это с большой + вероятностью приведет к неработоспособности приложения. Поэтому + все решается в момент установки серийного номера и именно в этот + момент определяется режим, в котором будет работать + приложение.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/menu_edit.htm b/help/ru/menu_edit.htm new file mode 100644 index 0000000..db8c5c6 --- /dev/null +++ b/help/ru/menu_edit.htm @@ -0,0 +1,61 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Меню "Правка"</title> + <style type="text/css"> +/*<![CDATA[*/ + div.c2 {text-align: center} + /*]]>*/ + </style> +</head> + +<body> + <h1>Меню "Правка"</h1> + <br /><img src= + "images/menu_edit.png" alt="Image" /> + + <ul> + <li><strong>Отменить</strong> - отменить последние + исправления;</li> + + <li><strong>Повторить</strong> - восстановить последние + отмененные исправления;</li> + + <li><strong>Вырезать</strong> - переместить выделенные данные в + буфер обмена;</li> + + <li><strong>Копировать</strong> - скопировать выделенные данные + в буфер обмена;</li> + + <li><strong>Вставить</strong> - вставить из буфера обмена;</li> + + <li><strong>Удалить</strong> - удалить выделенный элемент;</li> + + <li><strong>Поиск</strong> - поиск фрагмента текста + <p><img src="images/expert_find.png" alt="Поиск" /></p> + </li> + + <li><a name="Goto" id="Goto"><strong>Перейти на + адрес</strong></a> - перейти на заданный адрес защищаемого + приложения. Возможен переход на введенный адрес либо на адрес + объекта, выбранного в списке "Функции". Возможен также поиск объекта по названию; + <p><br /><img src="images/properties_dump_goto.png" alt="Image" /></p> + </li> + </ul> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html>
\ No newline at end of file diff --git a/help/ru/menu_file.htm b/help/ru/menu_file.htm new file mode 100644 index 0000000..761919c --- /dev/null +++ b/help/ru/menu_file.htm @@ -0,0 +1,58 @@ +<!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><img src="images/menu_file.png" /></p> + + <ul> + <li><a name="Open" id="Open"><strong>Открыть</strong></a> - + выбрать исполняемый файл приложения, которое необходимо + защитить, или файл проекта (*.vmp). Можно выбрать файл для открытия из списка ранее защищенных приложений, который отображается в меню Файл. Доступ к функции открытия файлов также + возможен с помощью кнопки <img src="images/button_open.png" /> + на панели инструментов. Нужный исполняемый файл + также можно перетащить в окно VMProtect;</li> + + <li><strong>Сохранить проект</strong> - сохранить установки + защиты приложения в файл формата "*.vmp". Файл настроек проекта + будет сохранен в ту же папку, где находится исполняемый модуль + защищаемого приложения. Функция сохранения проекта доступна по + кнопке <img src="images/button_save.png" /> на + панели инструментов;</li> + + <li><a name="SaveProjectAs" id= + "SaveProjectAs"><strong>Сохранить проект как</strong></a> - + сохранить файл проекта в файл с новым именем;</li> + + <li><strong>Закрыть</strong> - завершить работу с текущим + проектом;</li> + + <li><strong>Выход</strong> - завершить работу с + программой.</li> + </ul> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html>
\ No newline at end of file diff --git a/help/ru/menu_help.htm b/help/ru/menu_help.htm new file mode 100644 index 0000000..f8398ef --- /dev/null +++ b/help/ru/menu_help.htm @@ -0,0 +1,38 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Меню "Справка"</title> + <style type="text/css"> +/*<![CDATA[*/ + div.c2 {text-align: center} + /*]]>*/ + </style> +</head> + +<body> + <h1>Меню "Справка"</h1> + <p><img src="images/menu_help.png" /></p> + + <ul> + <li><strong>Домашняя страница</strong> - перейти на домашнюю страницу VMProtect;</li> + <li><strong>Содержание</strong> - открыть справку VMProtect;</li> + <li><strong>О программе</strong> - просмотреть основные сведения о программе VMProtect.</li> + </ul> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/menu_project.htm b/help/ru/menu_project.htm new file mode 100644 index 0000000..c0e8582 --- /dev/null +++ b/help/ru/menu_project.htm @@ -0,0 +1,66 @@ +<!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><img src="images/menu_project.png" /></p> + + <ul> + <li><strong>Добавить функцию</strong> - добавить в список защищаемых объектов новую функцию. Можно задать как точный адрес функции, так и найти нужную функцию поиском по ее имени: + <p><img src="images/project_add_function.png"/></p></li> + <li><strong>Добавить папку</strong> - добавить папку в проект: + <p><img src="images/project_add_folder.png" /></p> + + <p>Использование папок не влияет на защиту находящихся в них + объектов, а служит для систематизации отображения защищаемых + объектов в дереве проекта. Перемещать объекты в папку можно + простым перетаскиванием (drag-n-drop);</p></li> + + <li><strong>Добавить лицензию</strong> - добавить лицензию в проект: + <p><img src="images/project_add_license.png" /></p> + + <p>Добавляет новую лицензию пользователя и генерирует лицензионный ключ на основе пользовательских данных: имя покупателя, e-mail, дата, номер заказа и других. Внутрь ключа может быть записана как указанная информация, так и дополнительные ограничения функциональности лицензии: например, число запусков или конечная дата действия ключа.<br /> + Для добавления лицензии необходимо сначала сгенерировать пару ключей:</p> + <p><img src="images/project_generate_keys.png" /></p></li> + + <li><strong>Экспортировать ключ</strong> - экспортирует ключи проекта в выбранный формат <a href="manager/keygen/index.htm">генератора ключей</a>: + <p><img src="images/export_keys.png" /></p></li> + + <li><strong>Импортировать</strong> - добавляет к проекту лицензии, импортированные из серийного номера, либо из другого проекта.</li> + + <li><strong>Компилировать</strong> - компилировать защищаемое + приложение с текущими параметрами защиты. Для компиляции + проекта также можно нажать кнопку <img src="images/button_compilation.png" /> на панели + инструментов.</li> + + <li><strong>Выполнить</strong> - запустить защищаемое + приложение. Исходный/защищенный исполняемый файл приложения + также можно запустить нажатием кнопки <img src="images/button_execute.png" /> на панели + инструментов. Нажатие на стрелочку позволяет задать параметры командной строки.</li> + </ul> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html>
\ No newline at end of file diff --git a/help/ru/menu_tools.htm b/help/ru/menu_tools.htm new file mode 100644 index 0000000..a4473bb --- /dev/null +++ b/help/ru/menu_tools.htm @@ -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><img src="images/menu_tools.png" /></p> + + <ul> + <li><strong>Водяные знаки</strong> - служит для вызова диалогового окна управления <a href="watermarks.htm">водяными знаками</a>: + <p><img src="images/watermarks_setup.png" /></p></li> + <li><strong>Настройки</strong> - вызывает диалог настроек программы: + <p><img src="images/preferences.png" /></p></li> + </ul> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/mode_console.htm b/help/ru/mode_console.htm new file mode 100644 index 0000000..b2cd6fe --- /dev/null +++ b/help/ru/mode_console.htm @@ -0,0 +1,71 @@ +<!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>После создания проекта в <a href="main_window.htm">GUI + режиме</a> в дальнейшем может использоваться консольная версия + (VMProtect_Con.exe), вызов которой осуществляется следующим + образом:</p> + + <p><strong>VMProtect_Con Файл [Выходной файл] [-pf Файл проекта] + [-sf Файл скрипта] [-lf Файл с параметрами лицензирования] [-bd Дата сборки (yyyy-mm-dd)] [-wm Название водяного знака] + [-we]</strong></p> + + <ul> + <li><strong>Файл</strong> - имя исполняемого файла, который + необходимо защитить (*.exe, *.dll и т.д.), или имя файла + проекта (*.vmp). Если в качестве исходного файла указан файл + проекта, то имя исполняемого файла будет браться из файла + проекта.</li> + + <li><strong>Выходной файл</strong> - имя и путь к защищенному + файлу, который должен быть создан после обработки исходного + файла. Если параметр не задан, его значение берется из файла + проекта.</li> + + <li><strong>Файл проекта</strong> - имя и путь к файлу проекта, + созданного в <a href="main_window.htm">GUI режиме</a>. Если + параметр не задан, поиск файла проекта *.vmp будет + осуществляться в папке с исполняемым файлом.</li> + + <li><strong>Файл скрипта</strong> - имя файла, содержащего + <a href="script.htm">скрипт</a>, с помощью которого будет + обработан защищаемый файл. Если параметр не задан, будет использоваться скрипт из текущего файла проекта.</li> + + <li><strong>Файл с параметрами лицензирования</strong> - имя файла, содержащего <a href="manager/licenses.htm">параметры лицензирования</a>. + Если параметр не задан, будут использовать параметры лицензирования из текущего файла проекта.</li> + + <li><strong>Дата сборки</strong> - дата сборки приложения в формате "yyyy-mm-dd". Если параметр не задан, будет использоваться текущая дата. + Дата сборки записывается в защищаемое приложение и используется системой лицензирования при проверке серийных номеров, содержащих поле "<a href="manager/licenses.htm#AddLicense">Максимальная дата сборки</a>".</li> + + <li><strong>Название водяного знака</strong> - название + <a href="watermarks.htm">водяного знака</a>, который будет + вставлен в защищаемый файл. Если название водяного файла не + указано, в защищенный файл будет вставлен водяной знак, который + был указан при создании проекта.</li> + + <li><strong>we</strong> - при использовании данного параметра + все предупреждения будут отображаться как ошибки.</li> + </ul><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/project.htm b/help/ru/project.htm new file mode 100644 index 0000000..1ca6f53 --- /dev/null +++ b/help/ru/project.htm @@ -0,0 +1,34 @@ +<!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><img src="images/project_functions.png" /></p> + + Раздел "Проект" содержит следующие секции: + <ul><li><a href="project_functions.htm">Функции для защиты</a> - позволяет выбрать объекты для защиты</li> + <li><a href="manager/licenses.htm">Лицензии</a> - позволяет управлять лицензиями и серийными номерами</li> + <li><a href="project_files.htm">Файлы</a> - позволяет включить в защищаемый EXE файл дополнительные файлы данных или DLL</li> + <li><a href="project_script.htm">Скрипт</a> - позволяет расширить возможности защиты за счет использования встроенного скриптового языка на базе LUA</li> + <li><a href="project_options.htm">Опции</a> - позволяет настроить параметры защиты приложения</li> + </ul> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/project_files.htm b/help/ru/project_files.htm new file mode 100644 index 0000000..6a7194b --- /dev/null +++ b/help/ru/project_files.htm @@ -0,0 +1,43 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Секция "Файлы"</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Секция "Файлы"</h1> + + <p>Секция "Файлы" позволяет включить в защищаемый EXE файл + необходимые для его работы файлы данных, включая изображения, текстовые ресурсы, а также динамически подгружаемые библиотеки. Все виды данных, включая DLL, в процессе работы защищенного EXE файла будут загружаться из памяти процесса без + предварительной записи на диск.</p> + <p><img src="images/project_file_protection.png" /></p> + + <p>Кнопка <strong>Добавить файл</strong> на панели инструментов главного окна программы позволяет добавить к защищаемому EXE файлу новый файл. Также можно добавить новый файл с помощью контекстного меню:</p> + <p><img src="images/project_file_menu.png" /></p> + + <p>Для изменения свойств выбранного файла, выберите его в списке слева и отредактируйте название, имя файла или дополнительные свойства.</p> + <p><img src="images/project_file_settings.png" /></p> + + <p>Чтобы удалить файл из списка защищаемых, щелкните его правой кнопкой и выберите "Удалить", либо просто выделите файл и нажмите Del.</p> + <p><img src="images/project_file_delete.png" /></p> + <p>Щелкнув правой кнопкой по названию секции можно исключить файл из компиляции. Настройки исключения из компиляции сохраняются в файл проекта.</p> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/project_functions.htm b/help/ru/project_functions.htm new file mode 100644 index 0000000..d5841e9 --- /dev/null +++ b/help/ru/project_functions.htm @@ -0,0 +1,134 @@ +<!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> + <p><img src="images/project_functions.png" /></p> + <h3 id="AddFunction">Добавление функции</h3> + <p>Для того чтобы добавить новый объект в проект, нажмите кнопку "Добавить функцию" на панели инструментов, либо выберите этот пункт в контекстном меню:</p> + <p><img src="images/project_functions_menu.png" /></p> + <p>Появится диалог добавления функции:</p> + <p><img src="images/project_add_function.png" /></p> + <p>Задайте адрес функции или выберите нужную функцию из списка на вкладке "Функции", начав набирать ее имя в строке быстрого поиска. Вы можете добавить сразу несколько функций, используя множественное выделение. Все выделенные функции будут добавлены с выбраными опциями защиты.</p> + <p><strong>Опции</strong></p> + <ul> + <li><a name="CompilationTypes" id= + "CompilationTypes"><strong>Тип компиляции</strong></a> - + выбрать тип компиляции объекта. Правильный выбор способа защиты + от изучения и взлома для каждого защищаемого объекта + (процедуры, функции, фрагмента кода) обеспечит оптимальное + соотношение между защищенностью кода и его быстродействием. + VMProtect позволяет пользователю установить следующие типы + компиляции для каждого защищаемого объекта:</li> + <ul> + <li><strong>Мутация.</strong> Исполняемый код + видоизменяется на уровне команд процессора - существующие + команды видоизменяются, добавляются различные мусорные + команды и т.д. Данный тип компиляции относительно слабо + защищает обрабатываемый код от взлома и анализа и главным + образом препятствует определению обрабатываемых функций с + помощью сигнатурных анализаторов (PEiD+KANAL, IDA+FLIRT и + т.д.). Этот тип компиляции целесообразно применять при + защите библиотечных функций, так как они, как правило, не + нуждаются в защите от взлома и анализа и достаточно будет + только изменить их сигнатуры, чтобы взломщик не смог + автоматически определить, какие именно библиотеки + используются в приложении. При использовании мутации + степень защиты от взлома и анализа низкая, скорость + исполнения кода высокая.</li> + + <li><strong>Виртуализация.</strong> Исполняемый код + переводится в байт-код, исполняемый на виртуальной машине. + Данный тип компиляции следует применять для всех критичных + участков кода, где помимо противодействия взлому и анализу + важна скорость работы. При использовании виртуализации + степень защиты от взлома и анализа средняя, скорость + исполнения кода средняя.</li> + + <li><strong>Ультра (мутация + виртуализация).</strong> + Исполняемый код видоизменяется на уровне команд процессора + и уже после этого переводится в байт-код, исполняемый на + виртуальной машине. Данный тип компиляции следует применять + для всех участков кода, где не важна скорость работы. + Степень защиты от взлома и анализа высокая, скорость + исполнения кода низкая.</li> + </ul> + + <li id="LockToKey"><strong>Привязать к серийному номеру</strong> - при включении данной опции защищенная функция будет <a href="manager/features.htm#lock">недоступна без ввода валидного серийного номера</a>. Таким образом можно, например, ограничивать доступ к определенным функциям приложения в незарегистрированной версии.</li> + </ul> + + <p id="Search"><strong>Поиск</strong></p> + + <p>Необходимые объекты можно отыскать по их имени в универсальном быстром поиске:</p> + <p><img src="images/project_functions_search.png" /></p> + + <p>В строке поиска можно использовать стандартные символы подстановки:</p> + <ul> + <li><strong>*</strong> - заменяет группу символов произвольной длины;</li> + <li><strong>?</strong> - заменяет любой одиночный символ.</li> + </ul> + + <h3 id="AddFolder">Добавление папки</h3> + <p>Добавление папки осуществляется с помощью контекстного меню:</p> + <p><img src="images/project_functions_menu.png" /></p> + <p>Папки используются для группировки защищаемых объектов в + дереве проекта, а также для группового изменения параметров + защиты (включение в компиляцию, тип компиляции) для всех + объектов из этой папки.</p> + <p>Задайте имя новой папке:</p> + <p><img src="images/project_add_folder.png" /></p> + + <h3>Редактирование объектов</h3> + <p>В правой части окна отображается содержимое выбранного + объекта. Если в дереве проекта выбран защищаемый объект, то с + правой стороны отображается дизассемблированное представление + этого объекта:</p> + + <p><img src="images/project_functions_content.png" alt= + "Код" /></p> + <p>Щелчок правой кнопкой мыши по строчке кода вызывает контекстное меню:</p> + <p><img src="images/project_functions_menu3.png" /></p> + <ul> + <li><a name="ExtAddress" id="ExtAddress"><strong>Внешний + адрес</strong></a> - включить выбранный адрес в список <a href= + "project_options_external_addresses.htm">внешних адресов</a>;</li> + + <li><strong>Конец функции</strong> - ограничить список + команд, которые будут обработаны в процессе компиляции;</li> + </ul> + + <p>Если в дереве проекта выбрана папка, то с правой стороны + отображается список функций, входящих в эту папку:</p> + + <p><img src="images/project_functions_content2.png" /></p> + + <p>Перемещать функции из папки в папку можно простым + перетаскиванием при помощи мыши.</p> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/project_options.htm b/help/ru/project_options.htm new file mode 100644 index 0000000..c60f49e --- /dev/null +++ b/help/ru/project_options.htm @@ -0,0 +1,125 @@ +<!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/project_options.png" /></p> + + <h3>Файл</h3> + + <ul> + <li><strong id="MemoryProtection">Защита памяти</strong> - + данная опция позволяет защитить образ файла в памяти от + каких-либо изменений (целостность данных проверяется по всем + секциям, не имеющим атрибут WRITABLE). Проверка целостности + образа происходит до передачи управления оригинальной точке + входа в программу. В случае нарушения целостности будет + показано соответствующее сообщение с полным прекращением + дальнейшего выполнения программы.</li> + + <li><strong id="ImportProtection">Защита импорта</strong> - + данная опция позволяет спрятать от взломщика список API, + которые использует защищенная программа (рекомендуется + использовать совместно с упаковкой выходного файла).</li> + + <li><strong id="ResourceProtection">Защита ресурсов</strong> - + данная опция позволяет зашифровать ресурсы программы (кроме + иконок, манифеста и других служебных ресурсов).</li> + + <li> + <strong id="PackOutputFile">Упаковать выходной файл</strong> + - данная опция позволяет упаковать защищенный файл, что + уменьшает его размер. Распаковка происходит автоматически при + запуске защищенного файла. Весь процесс распаковки происходит + в оперативной памяти без какой-либо записи данных на диск. + + <p>При использовании данной опции рекомендуется включить + <a href="dictionary.htm#EntryPoint">EntryPoint</a> в список + защищаемых объектов.<br /> + <strong>Важно:</strong><br /> + При старте программы после распаковки кода управление будет + передано EntryPoint. Если код EntryPoint будет + завиртуализирован, то этот код будет выполнен на том же + исполнителе ВМ, что и код самого распаковщика. Совместная + виртуализация EntryPoint с упаковкой защищенного файла + препятствует "ручной" распаковке защищенного файла, т.к. + взломщику надо будет восстановить код EntryPoint для + получения работоспособного образа файла.</p> + </li> + <li> + <strong id="Additional">Дополнительные</strong> + - дополнительные настройки защиты:</li> + <ul> + <li> + <strong id="watermarks">Водяные знаки</strong> - позволяет добавить в проект <a href="watermarks.htm">водяные знаки</a>. + </li> + <li><strong id="VMSectionName">Сегменты ВМ</strong> - + при компиляции в файл будут добавлены дополнительные сегменты, в + которые будут записаны различные данные (завиртуализированный, + промутированный код, исполнители ВМ, водяные знаки и т.п.). + Данная опция позволяет задать названия для новых сегментов. + Рекомендуется изменять стандартное название сегментов ".vmp" + (например, на ".UPX").</li> + <li><strong>Удалять отладочную информацию</strong> - удаление отладочной информации компилятора затруднит анализ кода приложения злоумышленником.</li> + <li><strong>Удалять настраиваемые элементы</strong> - некоторые + компиляторы (в частности Delphi) создают для EXE файлов список + настраиваемых элементов, которые не используются операционной + системой при загрузке EXE файлов. При включенной опции область, + занятая под список настраиваемых элементов, будет + использоваться под нужды ВМ.</li> + </ul> + + </ul> + + <h3>Обнаружение</h3> + + <ul> + <li><strong id="DebuggerDetection">Отладчик</strong> - данная опция препятствует отладке + защищенного файла. Существуют 2 типа отладчиков: User-mode + (отладчики пользовательского режима: OllyDBG, WinDBG и т.п.) и + Kernel-mode (отладчики режима ядра: SoftICE, Syser и т.п.). + Обнаружение отладчика происходит до передачи управления + оригинальной точке входа в программу. В случае обнаружения + отладчика будет показано соответствующее сообщение с + прекращением дальнейшего выполнения программы.</li> + + <li><strong id="VirtualizationToolsDetection">Инструменты виртуализации</strong> - данная опция препятствует + запуску защищенного файла в различных виртуальных средах: + VMware, Virtual PC, VirtualBox, Sandboxie. Обнаружение + виртуальной среды происходит до передачи управления + оригинальной точке входа в программу. В случае обнаружения + виртуальной среды будет показано соответствующее сообщение с + прекращением дальнейшего выполнения программы.</li> + </ul> + + <h3>Сообщения</h3> + <p>В данном разделе можно задать сообщения, выводимые программой при обнаружении отладчика, инструментов виртуализации, повреждении файла или попытке исполнения кода, защищенного серийным номером.</p> + + <h3 id="LicensingParameters">Параметры лицензирования</h3> + + <p>В качестве файла с параметрами лицензирования выберите файл + проекта, созданного в <a href="manager/licenses.htm">менеджере + лицензий</a>. По умолчанию используется текущий файл проекта.</p> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/project_options_external_addresses.htm b/help/ru/project_options_external_addresses.htm new file mode 100644 index 0000000..cc8dff5 --- /dev/null +++ b/help/ru/project_options_external_addresses.htm @@ -0,0 +1,80 @@ +<!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> + + При защите кода место, освободившееся в + процессе компиляции, VMProtect использует для своих нужд, в + том числе для хранения различных данных + (завиртуализированного, промутированного кода, исполнителей + ВМ и т.п.). В связи с этим могут возникать различные + ситуации, когда "внутрь" защищенного кода может происходить + переход из других частей программы (адреса, на которые может + происходить переход, называются внешними). Подобные ситуации + могут возникать при использовании маркеров кода, когда + происходит переход из незащищенного участка программы внутрь + маркера: + <pre class="code">VMProtectBegin(nil); +for I:=0 to 10 do +begin + Inc(J); + VMProtectEnd; +end; +</pre> + + <p>В виде ассемблерных команд данный цикл выглядит следующим + образом:</p> + <pre class="code">----------------- начало маркера ---------------- +0044D12C mov eax, 0000000B +0044D131 inc ebx +----------------- конец маркера ----------------- +0044D132 dec eax +0044D133 jnz 0044D131 +</pre> + + <p>Очевидно, что после виртуализации команд с адресами + 0044D12C и 0044D131 при выполнении незавиртуализированной + команды условного перехода по адресу 0044D133 возникнет + ошибка (т.к. по адресу 0044D131 вместо оригинального кода + будут записаны различные данные или просто мусор). Для + рассматриваемого примера адрес 0044D131 будет являться + внешним.</p> + + <p>При включении опции "Режим отладки" на место оригинального + кода будет записана команда INT 03, являющаяся обычной точкой + останова и служебной командой при работе под отладчиком. При + запуске защищенной программы из-под отладчика в случае + передачи управления по адресу 0044D131 произойдет вызов точки + останова, а при открытии окна отладчика можно будет увидеть, + по какому адресу произошел данный переход.</p> + + <p>При обнаружении подобных переходов рекомендуется проверить + правильность расстановки маркеров кода. Если защищаемый код + не помечен маркерами или невозможно изменить логику + приложения так, чтобы внутрь защищаемого кода не было + перехода из других частей программы, то, используя + графическую версию приложения, данные адреса <a href= + "project_functions.htm#ExtAddress">следует пометить как + внешние</a>.</p> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/project_script.htm b/help/ru/project_script.htm new file mode 100644 index 0000000..083c534 --- /dev/null +++ b/help/ru/project_script.htm @@ -0,0 +1,34 @@ +<!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>Секция "Скрипт" раздела "Проект" предназначена для создания программ на встроенном <a href="script.htm">скриптовом языке</a>:</p> + <p><img src="images/project_script.png" /></p> + + <p>Основная панель предназначена для редактирования самого + скрипта. С помощью контекстного меню можно манипулировать фрагментами кода.</p> + <p>Отдельные блоки кода (циклы, функции) можно свернуть или развернуть, нажав на значок иерархии (плюс или минус) рядом с номером строки.</p> + <p>Щелкнув правой кнопкой мыши по заголовку секции, можно исключить скрипт из компиляции. Скрипт, исключенный из компиляции, не обрабатывается и не исполняется программой. Эта настройка сохраняется в свойствах проекта.</p> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/recommendations.htm b/help/ru/recommendations.htm new file mode 100644 index 0000000..b459b3a --- /dev/null +++ b/help/ru/recommendations.htm @@ -0,0 +1,233 @@ +<!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> + + <h3>Процедура регистрации</h3> + + <p>Типичной ошибкой программистов, разрабатывающих собственную + схему регистрации экземпляра приложения, является вынос процедуры + проверки корректности введенного регистрационного ключа в + отдельную функцию c понятным возвращаемым значением:</p> + <pre class="indent code">function CheckRegistration(const RegNumber: String): Boolean; +begin + if RegNumber='123' then + Result:=True + else + Result:=False; +end; + +procedure TForm1.Button1Click(Sender: TObject); +begin + ... + if not CheckRegistration(RegNumber) then + exit; + Application.CreateForm(TForm2, Form2); + Form2.ShowModal; + ... +end; +</pre> + + <p>При подобном подходе к проверке регистрационного кода + взломщику нет необходимости вникать в алгоритм проверки ключа, а + будет достаточно изменить код в начале процедуры проверки таким + образом, чтобы она всегда возвращала значение, + соответствующее корректному регистрационному ключу:</p> + <pre class="indent code">function CheckRegistration(const RegNumber: String): Boolean; +begin + Result:=True; + exit; + ... +end; +</pre> + + <p>Гораздо более эффективным способом является встраивание + проверки корректности регистрационного кода в логику работы + программы таким образом, чтобы невозможно было отделить алгоритм + проверки регистрационного кода от алгоритма работы вызывающей эту + проверку процедуры. Также рекомендуется "примешивать" логику + работы программы в процедуру проверки регистрационного кода так, + чтобы "обход" регистрационной процедуры приводил к ошибкам в + работе приложения. Для примера, приведенного выше, это можно + сделать следующим образом:</p> + <pre class="indent code">function CheckRegistration(const RegNumber: String): Boolean; +begin + if RegNumber='123' then + begin + Application.CreateForm(TForm2, Form2); + Result:=True + end + else + Result:=False; +end; + +procedure TForm1.Button1Click(Sender: TObject); +begin + ... + Form2:=nil; + if not CheckRegistration(RegNumber) then + exit; + Form2.ShowModal; + ... +end; +</pre> + + <p>При подобной реализации функции CheckRegistration для "обхода" + проверки регистрационного ключа взломщику будет необходимо + досконально разбирать работу всей функции проверки ключа. При + защите данного приложения с помощью VMProtect рекомендуется + выполнить виртуализацию не только функции CheckRegistration, но и + процедуры TForm1.Button1Click. Для еще большего усложнения + процесса взлома приложения можно воспользоваться <a href="project_functions.htm#CompilationTypes">режимом защиты + "Ультра"</a>, сочетающим мутацию кода приложения с его последующей + виртуализацией.</p> + + <h3>Проверка регистрационных ключей</h3> + + <p>Очень часто программисты допускают грубейшие ошибки при + реализации самой проверки правильности регистрационного ключа, + производя сравнение введенного ключа с его корректным значением. + При подобной реализации взломщик легко сможет подобрать + корректное значение ключа, просмотрев в процессе трассировки + аргументы, с которыми вызывается функция сравнения строк:</p> + <pre class="indent code">var ValidRegNumber: String; +... +function CheckRegistration(const RegNumber: String): Boolean; +begin + if RegNumber=ValidRegNumber then + Result:=True + else + Result:=False; +end; +</pre> + + <p>Для исключения подобной ситуации при сравнении введенного + значения ключа с его допустимым значением рекомендуется + использовать их хеши, а не реальные значения. По своей сути + хеш-функция необратима, а значит, по результатам проверки хешей + невозможно определить значение допустимого ключа. При взломе + приложения будет необходимо потратить гораздо больше времени на + изучение программы, так как придется исследовать гораздо больше + участков кода, а не только процедуру проверки корректности + введенного ключа:</p> + <pre class="indent code">var + HashOfValidRegNumber: Longint; +... +// Пример использования обобщенного алгоритма хеширования Питера Вейнбергера (PJW) +function HashPJW(const Value: String): Longint; +var I:Integer; + G:Longint; +begin + Result:=0; + for I:=1 to Length(Value) do + begin + Result:=(Result shl 4)+Ord(Value[I]); + G:=Result and $F0000000; + if G<&gt0 then + Result:=(Result xor (G shr 24)) xor G; + end; +end; + +function CheckRegistration(const RegNumber: String): Boolean; +begin + if HashPJW(RegNumber)=HashOfValidRegNumber then + Result:=True + else + Result:=False; +end; +... +initialization + HashOfValidRegNumber:=HashPJW(ValidRegNumber); + +end. +</pre> + + <p>При защите программы с помощью VMProtect целесообразно + защитить функции HashPJW и CheckRegistration для усложнения + работы взломщика.</p> + + <h3>Хранение результата проверки регистрации</h3> + + <p>Как правило, программисты, затратившие много времени на + реализацию самой процедуры регистрации, не уделяют достаточного + внимания защите самого результата регистрации программы. В + приведенном ниже примере перед вызовом функции проверки + корректности регистрационного номера контролируется состояние + глобальной переменной, хранящей результат проверки регистрации. + Для взломщика поиск глобальной переменной не представляет + трудностей - достаточно будет сравнить сегменты данных ДО и ПОСЛЕ + регистрации. Кстати, аналогичный принцип лежит в основе работы + известной программы ArtMoney.</p> + <pre class="indent code">var IsRegistered: Boolean; +... +procedure TForm1.Button1Click(Sender: TObject); +begin + ... + if not IsRegistered then + IsRegistered:=CheckRegistration(RegNumber); + if not IsRegistered then + exit; + ... +end; +</pre> + + <p>Для исключения подобной ситуации рекомендуется результаты всех + проверок, отвечающих за регистрацию программы, хранить в + динамической памяти, так как в этом случае сканирование секций + данных на предмет изменения ячеек памяти ДО и ПОСЛЕ регистрации + окажется бесполезным. Простейший пример, демонстрирующий хранение + результата в динамически выделяемой памяти, приведен ниже.</p> + <pre class="indent code">type PBoolean = ^Boolean; + +var IsRegistered: PBoolean; +... +procedure TForm1.Button1Click(Sender: TObject); +begin + ... + if not IsRegistered^ then + IsRegistered^:=CheckRegistration(RegNumber); + if not IsRegistered^ then + exit; + ... +end; +... +initialization + New(IsRegistered); +</pre> + + <p>Выше приведены простейшие примеры реализации встроенных в + приложение механизмов защиты. Варианты реальной реализации + процедуры регистрации, функции проверки регистрационного ключа + или организации хранения результата проверки регистрационного + ключа ограничены только фантазией разработчика. Однако в любом + случае при разработке механизмов защиты приложения следует знать + о возможных ошибках и не повторять их.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/ru.qhcp b/help/ru/ru.qhcp new file mode 100644 index 0000000..8805876 --- /dev/null +++ b/help/ru/ru.qhcp @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" ?> +<QHelpCollectionProject version="1.0"> + <docFiles> + <generate> + <file> + <input>ru.qhp</input> + <output>../../bin/ru.qch</output> + </file> + </generate> + <register> + <file>../../bin/ru.qch</file> + </register> + </docFiles> +</QHelpCollectionProject>
\ No newline at end of file diff --git a/help/ru/ru.qhp b/help/ru/ru.qhp new file mode 100644 index 0000000..e737a7c --- /dev/null +++ b/help/ru/ru.qhp @@ -0,0 +1,260 @@ +<?xml version="1.0" encoding="UTF-8"?> +<QtHelpProject version="1.0"> + <namespace>ru.com.vmpsoft.vmprotect.3.0</namespace> + <virtualFolder>doc</virtualFolder> + <customFilter name="VMProtect 3.0"> + <filterAttribute>vmpg</filterAttribute> + <filterAttribute>3.0</filterAttribute> + </customFilter> + <filterSection> + <filterAttribute>vmpg</filterAttribute> + <filterAttribute>3.0</filterAttribute> + <toc><section title="Введение" ref="terms.htm"> + <section title="Словарь терминов" ref="dictionary.htm" /> + <section title="Изучение, взлом и защита программного обеспечения" ref="software_protection.htm" /> + <section title="Что такое VMProtect?" ref="about_vmprotect.htm" /> + <section title="Рекомендации по защите" ref="recommendations.htm" /> + <section title="История изменений" ref="history.htm" /> + </section> + <section title="Работа с VMProtect" ref="work.htm"> + <section title="Подготовка проекта" ref="create_project.htm"> + <section title="Использование MAP-файла" ref="use_map_file.htm" /> + <section title="Использование маркеров" ref="use_markers.htm" /> + <section title="Функции SDK" ref="sdk_functions.htm" /> + </section> + <section title="Главное окно" ref="main_window.htm"> + <section title="Главное меню" ref="main_menu.htm"> + <section title="Меню "Файл"" ref="menu_file.htm" /> + <section title="Меню "Правка"" ref="menu_edit.htm" /> + <section title="Меню "Проект"" ref="menu_project.htm" /> + <section title="Меню "Инструменты"" ref="menu_tools.htm" /> + <section title="Меню "Справка"" ref="menu_help.htm" /> + </section> + <section title="Панель инструментов" ref="toolbar.htm" /> + <section title="Раздел "Проект"" ref="project.htm"> + <section title="Секция "Функции для защиты"" ref="project_functions.htm" /> + <section title="Секция "Лицензии"" ref="manager/licenses.htm" /> + <section title="Секция "Файлы"" ref="project_files.htm" /> + <section title="Секция "Скрипт"" ref="project_script.htm" /> + <section title="Секция "Опции"" ref="project_options.htm" /> + </section> + <section title="Раздел "Функции"" ref="functions.htm" /> + <section title="Раздел "Свойства"" ref="info.htm"> + <section title="Секция "Директории"" ref="info_directories.htm" /> + <section title="Секция "Сегменты"" ref="info_segments.htm" /> + <section title="Секция "Импорты"" ref="info_imports.htm" /> + <section title="Секция "Экспорты"" ref="info_exports.htm" /> + <section title="Секция "Ресурсы"" ref="info_resources.htm" /> + <section title="Секция "Калькулятор"" ref="info_calc.htm" /> + <section title="Секция "Дамп"" ref="info_dump.htm" /> + </section> + </section> + <section title="Консольная версия" ref="mode_console.htm" /> + </section> + <section title="Система лицензирования" ref="manager/index.htm"> + <section title="Возможности системы лицензирования VMProtect" ref="manager/features.htm" /> + <section title="Как работает система лицензирования?" ref="manager/howitworks.htm" /> + <section title="Интеграция в приложение" ref="manager/usage/index.htm"> + <section title="Этап 1: Тестовый режим работы" ref="manager/usage/index.htm#TestMode"> + <section title="Шаг 1: Создаем защищаемое приложение" ref="manager/usage/step11_app.htm" /> + <section title="Шаг 2: Добавляем код проверки лицензии" ref="manager/usage/step12_code.htm" /> + <section title="Шаг 3: Получаем флаги состояния серийного номера" ref="manager/usage/step13_flags.htm" /> + <section title="Шаг 4: Получаем имя и e-mail пользователя" ref="manager/usage/step14_name.htm" /> + <section title="Шаг 5: Проверяем срок действия серийного номера" ref="manager/usage/step15_exp.htm" /> + <section title="Шаг 6: Ограничиваем время работы программы" ref="manager/usage/step16_time.htm" /> + <section title="Шаг 7: Ограничиваем бесплатные обновления" ref="manager/usage/step17_maxbuild.htm" /> + <section title="Шаг 8: Номера из "черного списка"" ref="manager/usage/step18_blacklist.htm" /> + <section title="Шаг 9: Привязка к оборудованию" ref="manager/usage/step19_hwid.htm" /> + <section title="Шаг 10: Пользовательские данные" ref="manager/usage/step1A_userdata.htm" /> + </section> + <section title="Этап 2: Реальный режим работы" ref="manager/usage/index.htm#RealMode"> + <section title="Шаг 1: Создаем новое защищенное приложение" ref="manager/usage/step21_src.htm" /> + <section title="Шаг 2: Создаем проект защиты в VMProtect" ref="manager/usage/step22_vmp.htm" /> + <section title="Шаг 3: Создаем продукт в менеджере лицензий" ref="manager/usage/step23_product.htm" /> + <section title="Шаг 4: Тестируем результат" ref="manager/usage/step24_test.htm" /> + <section title="Шаг 5: Привязываем код к серийному номеру" ref="manager/usage/step25_codelock.htm" /> + </section> + <section title="Описание функций API лицензирования" ref="manager/usage/api.htm" /> + </section> + <section title="Генераторы ключей" ref="manager/keygen/index.htm"> + <section title="Windows-версия" ref="manager/keygen/keygen_dll.htm" /> + <section title=".Net-версия" ref="manager/keygen/keygen_net.htm" /> + <section title="UNIX-версия" ref="manager/keygen/keygen_php.htm" /> + <section title="Формат серийного номера" ref="manager/keygen/serial_format.htm" /> + <section title="Алгоритмы шифрования серийных номеров" ref="manager/keygen/algorithms.htm" /> + </section> + <section title="Система Активации" ref="manager/activation.htm"> + <section title="Настройка Активации в VMProtect" ref="manager/activation/vmprotect.htm" /> + <section title="Поддержка Активации в Web License Manager" ref="manager/activation/weblm.htm" /> + <section title="API Активации" ref="manager/activation/api.htm" /> + </section> + </section> + <section title="Использование скриптов" ref="script.htm"> + <section title="Классы" ref="script_classes.htm" /> + <section title="Встроенные функции" ref="script_functions.htm" /> + <section title="События" ref="script_events.htm" /> + </section> + <section title="Водяные знаки" ref="watermarks.htm"> + <section title="Вкладка "Настройка"" ref="watermarks_setup.htm" /> + <section title="Вкладка "Поиск"" ref="watermarks_search.htm" /> + </section> + <section title="Ответы на вопросы" ref="faq.htm" /> + <section title="Контактная информация" ref="contacts.htm" /> + </toc> + <keywords> + <keyword id="default" ref="terms.htm"/> + <keyword id="project::functions" ref="project_functions.htm"/> + <keyword id="project::options" ref="project_options.htm"/> + <keyword id="project::script" ref="project_script.htm"/> + <keyword id="project::files" ref="project_files.htm"/> + <keyword id="project::licenses" ref="manager/licenses.htm"/> + <keyword id="project::mapfunctions" ref="functions.htm"/> + <keyword id="project::details" ref="info.htm"/> + <keyword id="functions::setup" ref="project_functions.htm#AddProcedure"/> + <keyword id="functions::search" ref="project_functions.htm#Search"/> + <keyword id="watermarks::setup" ref="watermarks_setup.htm"/> + <keyword id="watermarks::search" ref="watermarks_search.htm"/> + <keyword id="settings" ref="menu_tools.htm#Settings"/> + <keyword id="contacts" ref="contacts.htm"/> + </keywords> + <files> + <file>default.css</file> + <file>about_vmprotect.htm</file> + <file>contacts.htm</file> + <file>create_project.htm</file> + <file>default.css</file> + <file>dictionary.htm</file> + <file>faq.htm</file> + <file>functions.htm</file> + <file>history.htm</file> + <file>info.htm</file> + <file>info_calc.htm</file> + <file>info_directories.htm</file> + <file>info_dump.htm</file> + <file>info_exports.htm</file> + <file>info_imports.htm</file> + <file>info_resources.htm</file> + <file>info_segments.htm</file> + <file>info_calc.htm</file> + <file>main_menu.htm</file> + <file>menu_file.htm</file> + <file>menu_edit.htm</file> + <file>menu_project.htm</file> + <file>menu_tools.htm</file> + <file>menu_help.htm</file> + <file>main_window.htm</file> + <file>mode_console.htm</file> + <file>project.htm</file> + <file>project_files.htm</file> + <file>project_functions.htm</file> + <file>project_options.htm</file> + <file>project_options_external_addresses.htm</file> + <file>project_script.htm</file> + <file>recommendations.htm</file> + <file>script.htm</file> + <file>script_classes.htm</file> + <file>script_events.htm</file> + <file>script_functions.htm</file> + <file>sdk_functions.htm</file> + <file>software_protection.htm</file> + <file>terms.htm</file> + <file>toolbar.htm</file> + <file>use_map_file.htm</file> + <file>use_markers.htm</file> + <file>watermarks.htm</file> + <file>watermarks_search.htm</file> + <file>watermarks_setup.htm</file> + <file>about_vmprotect.htm</file> + <file>work.htm</file> + <file>images/activation_setup.png</file> + <file>images/button_compilation.png</file> + <file>images/button_execute.png</file> + <file>images/button_open.png</file> + <file>images/button_project.png</file> + <file>images/button_save.png</file> + <file>images/button_action.png</file> + <file>images/button_search.png</file> + <file>images/delphi_project.png</file> + <file>images/expert_find.png</file> + <file>images/export_keys.png</file> + <file>images/functions.png</file> + <file>images/import_key.png</file> + <file>images/licenses1.png</file> + <file>images/lock_to_serial.png</file> + <file>images/main_window.png</file> + <file>images/menu_edit.png</file> + <file>images/menu_file.png</file> + <file>images/menu_help.png</file> + <file>images/menu_project.png</file> + <file>images/menu_project_import.png</file> + <file>images/menu_tools.png</file> + <file>images/preferences.png</file> + <file>images/project_add_folder.png</file> + <file>images/project_add_function.png</file> + <file>images/project_add_license.png</file> + <file>images/project_file_delete.png</file> + <file>images/project_file_menu.png</file> + <file>images/project_file_protection.png</file> + <file>images/project_file_settings.png</file> + <file>images/project_functions.png</file> + <file>images/project_functions_content.png</file> + <file>images/project_functions_content2.png</file> + <file>images/project_functions_menu.png</file> + <file>images/project_functions_menu2.png</file> + <file>images/project_functions_menu3.png</file> + <file>images/project_functions_search.png</file> + <file>images/project_generate_keys.png</file> + <file>images/project_options.png</file> + <file>images/project_script.png</file> + <file>images/properties_directory.png</file> + <file>images/properties_dump.png</file> + <file>images/properties_dump_goto.png</file> + <file>images/properties_export.png</file> + <file>images/properties_import.png</file> + <file>images/properties_resources.png</file> + <file>images/properties_segments.png</file> + <file>images/properties_calc.png</file> + <file>images/watermarks_add.png</file> + <file>images/watermarks_menu.png</file> + <file>images/watermarks_search.png</file> + <file>images/watermarks_setup.png</file> + <file>images/delphi_map.png</file> + <file>images/visual_studio_map.png</file> + <file>manager/activation/api.htm</file> + <file>manager/activation/vmprotect.htm</file> + <file>manager/activation/weblm.htm</file> + <file>images/weblm_1.png</file> + <file>images/weblm_2.png</file> + <file>manager/keygen/algorithms.htm</file> + <file>manager/keygen/index.htm</file> + <file>manager/keygen/keygen_dll.htm</file> + <file>manager/keygen/keygen_net.htm</file> + <file>manager/keygen/keygen_php.htm</file> + <file>manager/keygen/serial_format.htm</file> + <file>manager/usage/api.htm</file> + <file>images/codelock_error.png</file> + <file>images/depends.png</file> + <file>manager/usage/index.htm</file> + <file>manager/usage/step11_app.htm</file> + <file>manager/usage/step12_code.htm</file> + <file>manager/usage/step13_flags.htm</file> + <file>manager/usage/step14_name.htm</file> + <file>manager/usage/step15_exp.htm</file> + <file>manager/usage/step16_time.htm</file> + <file>manager/usage/step17_maxbuild.htm</file> + <file>manager/usage/step18_blacklist.htm</file> + <file>manager/usage/step19_hwid.htm</file> + <file>manager/usage/step1A_userdata.htm</file> + <file>manager/usage/step21_src.htm</file> + <file>manager/usage/step22_vmp.htm</file> + <file>manager/usage/step23_product.htm</file> + <file>manager/usage/step24_test.htm</file> + <file>manager/usage/step25_codelock.htm</file> + <file>manager/activation.htm</file> + <file>manager/features.htm</file> + <file>manager/howitworks.htm</file> + <file>manager/index.htm</file> + <file>manager/licenses.htm</file> + </files> + </filterSection> +</QtHelpProject> diff --git a/help/ru/script.htm b/help/ru/script.htm new file mode 100644 index 0000000..288a14b --- /dev/null +++ b/help/ru/script.htm @@ -0,0 +1,37 @@ +<!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 обладает мощным встроенным скриптовым + языком <a href="http://www.lua.org/">LUA</a>, использование которого позволяет расширить возможности + VMProtect на каждом этапе обработки защищаемого файла.</p> + + <p>Синтаксис языка LUA похож на JavaScript, однако в отличие от последнего он не содержит классов в явном виде. Тем не менее, скриптовый язык позволяет легко формировать такие механизмы объектно-ориентированного программирования, как классы, наследование и события. Примеры использования скриптов находятся в каталоге "VMProtect/Examples/Scripts".</p> + <ul> + <li><a href="script_classes.htm">Классы</a></li> + <li><a href="script_functions.htm">Встроенные функции</a></li> + <li><a href="script_events.htm">События</a></li> + </ul> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/script_classes.htm b/help/ru/script_classes.htm new file mode 100644 index 0000000..ae7b33e --- /dev/null +++ b/help/ru/script_classes.htm @@ -0,0 +1,1188 @@ +<!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>Встроенный скриптовый язык <a href="http://www.lua.org/about.html">LUA</a> программы VMProtect является + объектно-ориентированным: по синтаксису, идеалогии и реализации он во многом похож на JavaScript. + В состав скриптового языка входят как стандартные классы, + обеспечивающие базовую функциональность, так и специализированные + классы, предоставляющие доступ к функционалу защиты приложения. + </p> + +<h3>Иерархия классов</h3> +<ul> +<li><a href="#Core">Core</a><ul> + <li><a href="#Watermarks">Watermarks</a><ul> + <li><a href="#Watermark">Watermark</a></li> + </ul></li> + <li><a href="#Licenses">Licenses</a><ul> + <li><a href="#License">License</a></li> + </ul></li> + <li><a href="#Files">Files</a><ul> + <li><a href="#File">File</a></li> + </ul></li> + <li><a href="#Folders">Folders</a><ul> + <li><a href="#Folder">Folder</a></li> + </ul></li> + + <li><a href="#PEFile">PEFile</a><ul> + <li><a href="#PEFormat">PEFormat</a><ul> + </ul></li> + <li><a href="#PEArchitecture">PEArchitecture</a><ul> + <li><a href="#PESegments">PESegments</a><ul> + <li><a href="#PESegment">PESegment</a></li> + </ul></li> + <li><a href="#PESections">PESections</a><ul> + <li><a href="#PESection">PESection</a></li> + </ul></li> + <li><a href="#PEDirectories">PEDirectories</a><ul> + <li><a href="#PEDirectory">PEDirectory</a></li> + </ul></li> + <li><a href="#PEImports">PEImports</a><ul> + <li><a href="#PEImport">PEImport</a></li> + </ul></li> + <li><a href="#PEExports">PEExports</a><ul> + <li><a href="#PEExport">PEExport</a></li> + </ul></li> + <li><a href="#PEResources">PEResources</a><ul> + <li><a href="#PEResource">PEResource</a></li> + </ul></li> + <li><a href="#PEFixups">PEFixups</a><ul> + <li><a href="#PEFixup">PEFixup</a></li> + </ul></li> + </ul></li> + </ul></li> + <li><a href="#MacFile">MacFile</a><ul> + <li><a href="#MacFormat">MacFormat</a><ul> + </ul></li> + <li><a href="#MacArchitecture">MacArchitecture</a><ul> + <li><a href="#MacSegments">MacSegments</a><ul> + <li><a href="#MacSegment">MacSegment</a></li> + </ul></li> + <li><a href="#MacSections">MacSections</a><ul> + <li><a href="#MacSection">MacSection</a></li> + </ul></li> + <li><a href="#MacCommands">MacCommands</a><ul> + <li><a href="#MacCommand">MacCommand</a></li> + </ul></li> + <li><a href="#MacSymbols">MacSymbols</a><ul> + <li><a href="#MacSymbol">MacSymbol</a></li> + </ul></li> + <li><a href="#MacImports">MacImports</a><ul> + <li><a href="#MacImport">MacImport</a></li> + </ul></li> + <li><a href="#MacExports">MacExports</a><ul> + <li><a href="#MacExport">MacExport</a></li> + </ul></li> + <li><a href="#MacFixups">MacFixups</a><ul> + <li><a href="#MacFixup">MacFixup</a></li> + </ul></li> + </ul></li> + </ul></li> + <li><a href="#MapFunctions">MapFunctions</a><ul> + <li><a href="#MapFunction">MapFunction</a><ul> + <li><a href="#References">References</a><ul> + <li><a href="#Reference">Reference</a></li> + </ul></li> + </ul></li> + </ul></li> + <li><a href="#IntelFunctions">IntelFunctions</a><ul> + <li><a href="#IntelFunction">IntelFunction</a><ul> + <li><a href="#IntelSegment">IntelSegment</a><ul> + <li><a href="#IntelRegistr">IntelRegistr</a></li> + <li><a href="#IntelCommandType">IntelCommandType</a></li> + <li><a href="#IntelFlag">IntelFlag</a></li> + <li><a href="#IntelCommand">IntelCommand</a><ul> + <li><a href="#OperandType">OperandType</a><ul> + <li><a href="#IntelOperand">IntelOperand</a></li> + </ul></li> + </ul></li> + </ul></li> + <li><a href="#CommandLinks">CommandLinks</a><ul> + <li><a href="#LinkType">LinkType</a><ul> + <li><a href="#CommandLink">CommandLink</a></li> + </ul></li> + </ul></li> + </ul></li> + </ul></li> +</ul></li> +<li><a href="#FFILibrary">FFILibrary</a><ul> + <li><a href="#FFIFunction">FFIFunction</a></li> +</ul></li> +</ul> + +<h3>Ядро</h3> + +<p id="ProjectOption">Опции проекта:</p> +<pre class="code"> +enum ProjectOption { + None, + Pack, + ImportProtection, + MemoryProtection, + ResourceProtection, + CheckDebugger, + CheckKernelDebugger, + CheckVirtualMachine, + StripFixups, + StripDebugInfo, + DebugMode +} +</pre> + +<p id="Core">Класс для работы с ядром VMProtect:</p> +<pre class="code" id="Core"> +class Core { +public: + string projectFileName(); // возращает имя проекта + void saveProject(); // сохраняет проект + string inputFileName(); // возвращает имя исходного файла для текущего проекта + string outputFileName(); // возращает имя выходного файла для текущего проекта + void setOutputFileName(string name); // устанавливает имя выходного файла для текущего проекта + string watermarkName(); // возвращает имя водяного знака из текущего проекта + void setWatermarkName(string name); // устанавливает имя водяного знака для текущего проекта + int options(); // возвращает <a href="#ProjectOption">опции</a> для текущего проекта + void setOptions(int options); // устанавливает опции для текущего проекта + string vmSectionName(); // возвращает имя сегмента ВМ для текущего проекта + void setVMSectionName(); // устанавливает имя сегмента ВМ для текущего проекта + <a href="#Licenses">Licenses</a> licenses(); // возвращает список лицензий для текущего проекта + <a href="#Files">Files</a> files(); // возвращает список файлов для текущего проекта + <a href="#Watermarks">Watermarks</a> watermarks(); // возвращает список водяных знаков + <a href="#PEFile">PEFile</a>/<a href="#MacFile">MacFile</a> inputFile(); // возвращает исходный файл + <a href="#PEFile">PEFile</a>/<a href="#MacFile">MacFile</a> outputFile(); // возвращает выходной файл + <a href="#PEArchitecture">PEArchitecture</a>/<a href="#MacArchitecture">MacArchitecture</a> inputArchitecture(); // возвращает исходную архитектуру + <a href="#PEArchitecture">PEArchitecture</a>/<a href="#MacArchitecture">MacArchitecture</a> outputArchitecture(); // возвращает выходную архитектуру +}; +</pre> + +<h3>Водяные знаки</h3> + +<p id="Watermarks">Класс для работы со списком <a href="watermarks.htm">водяных знаков</a>:</p> +<pre class="code"> +class Watermarks { +public: + <a href="#Watermark">Watermark</a> item(int index); // возвращает водяной знак с индексом index + int count(); // возвращает количество водяных знаков в списке + <a href="#Watermark">Watermark</a> itemByName(string name); // возвращает водяной знак с именем name + <a href="#Watermark">Watermark</a> add(string name, string value); // добавляет водяной знак с именем name и значением value +} +</pre> + +<p id="Watermark">Класс для работы с водяным знаком:</p> +<pre class="code"> +class Watermark { +public: + string name(); // возвращает имя водяного знака + string value(); // возвращает значение водяного знака + bool blocked(); // возвращает признак "Заблокирован" + void setBlocked(bool value); // устанавливает признак "Заблокирован" +} +</pre> + +<h3>Лицензии</h3> + +<p id="Licenses">Класс для работы со списком <a href="manager/licenses.htm">лицензий</a>:</p> +<pre class="code"> +class Licenses { +public: + int keyLength(); // возвращает размер ключа + string publicExp(); // возвращает публичную экспоненту + string privateExp(); // возвращает приватную экспоненту + string modulus(); // возвращает модулус + <a href="#License">License</a> item(int index); // возвращает лицензию с индексом index + int count(); // возвращает количество лицензий в списке +} +</pre> + +<p id="License">Класс для работы с лицензией:</p> +<pre class="code"> +class License { +public: + string date(string format = "%c"); // возвращает дату лицензии + string customerName(); // возвращает имя владельца лицензии + string customerEmail(); // возвращает адрес электронной почты владельца лицензии + string orderRef(); // возвращает номер заказа, по которому приобретена лицензия + string comments(); // возвращает комментарии к лицензии + string serialNumber(); // возвращает серийный номер лицензии + bool blocked(); // возвращает признак "Заблокирован" + void setBlocked(bool value); // устанавливает признак "Заблокирован" +} +</pre> + +<h3>Файлы</h3> + +<p id="Files">Класс для работы со списком <a href="project_files.htm">файлов</a>:</p> +<pre class="code"> +class Files { +public: + <a href="#File">File</a> item(int index); // возвращает файл с индексом index + int count(); // возвращает количество файлов в списке +} +</pre> + +<p id="File">Класс для работы с <a href="project_files.htm">файлом</a>:</p> +<pre class="code"> +class File { +public: + string name(); // возвращает название файла + string fileName(); // возвращает имя файла + int options(); // возвращает опции + void setName(string name); // устанавливает название файла + void setFileName(string name); // устанавливает имя файла + void setOptions(); // устанавлиает опции +} +</pre> + +<h3>Папки</h3> + +<p id="Folders">Класс для работы с пользовательскими папками:</p> +<pre class="code"> +class Folders { +public: + int count(); // возвращает количество папок в списке + <a href="#Folder">Folder</a> item(int index); // возвращает папку с индексом index + <a href="#Folder">Folder</a> add(string name); // добавляет новую папку + void clear(); // очищает список +}; +</pre> + +<p id="Folder">Класс для работы с пользовательской папкой:</p> +<pre class="code" id="Folder"> +class Folder { +public: + int count(); // возвращает количество подпапок + <a href="#Folder">Folder</a> item(int index); // возвращает подпапку с индексом index + <a href="#Folder">Folder</a> add(string name); // добавляет новую подпапку + string name(); // возвращает имя папки + void clear(); // очищает список подпапок + void destroy(); // уничтожает папку и все дочерние подпапки +}; +</pre> + +<h3>PE файлы</h3> + +<p id="PEFormat">Константы для работы с PE форматом:</p> +<pre class="code"> +enum PEFormat { + // Directory Entries + IMAGE_DIRECTORY_ENTRY_EXPORT, + IMAGE_DIRECTORY_ENTRY_IMPORT, + IMAGE_DIRECTORY_ENTRY_RESOURCE, + IMAGE_DIRECTORY_ENTRY_EXCEPTION, + IMAGE_DIRECTORY_ENTRY_SECURITY, + IMAGE_DIRECTORY_ENTRY_BASERELOC, + IMAGE_DIRECTORY_ENTRY_DEBUG, + IMAGE_DIRECTORY_ENTRY_ARCHITECTURE, + IMAGE_DIRECTORY_ENTRY_TLS, + IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG, + IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT, + IMAGE_DIRECTORY_ENTRY_IAT, + IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT, + IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR, + // Section characteristics + IMAGE_SCN_CNT_CODE, + IMAGE_SCN_CNT_INITIALIZED_DATA, + IMAGE_SCN_CNT_UNINITIALIZED_DATA, + IMAGE_SCN_MEM_DISCARDABLE, + IMAGE_SCN_MEM_NOT_CACHED, + IMAGE_SCN_MEM_NOT_PAGED, + IMAGE_SCN_MEM_SHARED, + IMAGE_SCN_MEM_EXECUTE, + IMAGE_SCN_MEM_READ, + IMAGE_SCN_MEM_WRITE, + // Resource types + RT_CURSOR, + RT_BITMAP, + RT_ICON, + RT_MENU, + RT_DIALOG, + RT_STRING, + RT_FONTDIR, + RT_FONT, + RT_ACCELERATOR, + RT_RCDATA, + RT_MESSAGETABLE, + RT_GROUP_CURSOR, + RT_GROUP_ICON, + RT_VERSION, + RT_DLGINCLUDE, + RT_PLUGPLAY, + RT_VXD, + RT_ANICURSOR, + RT_ANIICON, + RT_HTML, + RT_MANIFEST, + RT_DLGINIT, + RT_TOOLBAR +}; +</pre> + +<p id="PEFile">Класс для работы с PE файлом:</p> +<pre class="code"> +class PEFile { +public: + string name(); // возвращает имя файла + string format(); // возвращает имя формата "PE" + uint64 size(); // возвращает размер файла + int count(); // возвращает количество архитектур в списке + <a href="#PEArchitecture">PEArchitecture</a> item(int index); // возвращает архитектуру с индексом index + uint64 seek(uint64 offset); // устанавливает файловую позицию + uint64 tell(); // возвращает файловую позицию + int write(string buffer); // записывает буфер в файл +}; +</pre> + +<p id="PEArchitecture">Класс для работы с PE архитектурой:</p> +<pre class="code"> +class PEArchitecture { +public: + string name(); // возвращает имя архитектуры + <a href="#PEFile">PEFile</a> file(); // возвращает родительский файл + uint64 entryPoint(); // возвращает стартовый адрес + uint64 imageBase(); // возвращает стартовый адрес + <a href="#OperandSize">OperandSize</a> cpuAddressSize(); // возвращает битность архитектуры + uint64 size(); // возвращает размер архитектуры + <a href="#PESegments">PESegments</a> segments(); // возвращает список сегментов + <a href="#PESections">PESections</a> sections(); // возвращает список секций + <a href="#PEDirectories">PEDirectories</a> directories(); // возвращает список директорий + <a href="#PEImports">PEImports</a> imports(); // возвращает список импортируемых библиотек + <a href="#PEExports">PEExports</a> exports(); // возвращает список экспортируемых функций + <a href="#PEResources">PEResources</a> resources(); // возвращает список ресурсов + <a href="#PEFixups">PEFixups</a> fixups(); // возвращает список настраиваемых элементов + <a href="#MapFunctions">MapFunctions</a> mapFunctions(); // возвращает список доступных для защиты функций + <a href="#IntelFunctions">IntelFunctions</a> functions(); // возвращает список защищаемых функций + bool addressSeek(uint64 address); // устанавливает файловую позицию + uint64 seek(uint64 offset); // устанавливает файловую позицию + uint64 tell(); // возвращает файловую позицию + int write(string buffer); // записывает буфер в файл +}; +</pre> + +<p id="PESegments">Класс для работы cо списком сегментов для PE архитектуры:</p> +<pre class="code"> +class PESegments { +public: + <a href="#PESegment">PESegment</a> item(int index); // возвращает сегмент с индексом index + int count(); // возвращает количество сегментов в списке + <a href="#PESegment">PESegment</a> itemByAddress(uint64 address); // возвращает сегмент с адресом address +}; +</pre> + +<p id="PESegment">Класс для работы c сегментом для PE архитектуры:</p> +<pre class="code"> +class PESegment { +public: + uint64 address(); // возвращает адрес сегмента + string name(); // возвращает имя сегмента + uint64 size(); // возвращает размер сегмента + int physicalOffset(); // возвращает файловую позицию сегмента + int physicalSize(); // возвращает файловый размер сегмента + int flags(); // возвращает флаги сегмента + bool excludedFromPacking(); // возвращает признак "Исключен из упаковки" + void setName(string name); // устанавливает имя сегмента +}; +</pre> + +<p id="PESections">Класс для работы cо списком секций для PE архитектуры:</p> +<pre class="code"> +class PESections { +public: + <a href="#PESection">PESection</a> item(int index); // возвращает секцию с индексом index + int count(); // возвращает количество секций в списке + <a href="#PESection">PESection</a> itemByAddress(uint64 address); // возвращает секцию с адресом address +}; +</pre> + +<p id="PESection">Класс для работы с секцией для PE архитектуры:</p> +<pre class="code"> +class PESection { +public: + uint64 address(); // возвращает адрес секции + string name(); // возвращает имя секции + uint64 size(); // возвращает размер секции + int offset(); // возвращает файловую позицию секции + <a href="#PESegment">PESegment</a> segment(); // возвращает родительский сегмент +}; +</pre> + +<p id="PEDirectories">Класс для работы с директориями для PE архитектуры:</p> +<pre class="code"> +class PEDirectories { +public: + <a href="#PEDirectory">PEDirectory</a> item(int index); // возвращает директорию с индексом index + int count(); // возвращает количество директорий в списке + <a href="#PEDirectory">PEDirectory</a> itemByType(int type); // возвращает директорию с типом type +}; +</pre> + +<p id="PEDirectory">Класс для работы с директорией для PE архитектуры:</p> +<pre class="code"> +class PEDirectory { +public: + uint64 address(); // возвращает адрес директории + string name(); // возвращает имя директории + uint64 size(); // возвращает размер директории + int type(); // возвращает тип директории + void setAddress(uint64 address); // устанавливает адрес директории + void setSize(int size); // устанавливает размер директории + void clear(); // очищает адрес и размер директории +}; +</pre> + +<p id="PEImports">Класс для работы со списком импортируемых библиотек для PE архитектуры:</p> +<pre class="code"> +class PEImports { +public: + <a href="#PEImport">PEImport</a> item(int index); // возвращает библиотеку с индексом index + int count(); // возвращает количество библиотек в списке + <a href="#PEImport">PEImport</a> itemByName(string name); // возвращает библиотеку с именем name +}; +</pre> + +<p id="PEImport">Класс для работы с импортируемой библиотекой для PE архитектуры:</p> +<pre class="code"> +class PEImport { +public: + string name(); // возвращает имя библиотеки + <a href="#PEImportFunction">PEImportFunction</a> item(int index); // возвращает импортируемую функцию с индексом index + int count(); // возвращает количество импортируемых функций + void setName(string name); // устанавливает имя библиотеки +}; +</pre> + +<p id="PEImportFunction">Класс для работы с импортируемой функцией для PE архитектуры:</p> +<pre class="code"> +class PEImportFunction { +public: + uint64 address(); // возвращает адрес ячейки, в которую записывается адрес импортируемой функции + string name(); // возвращает имя импортируемой функции +}; +</pre> + +<p id="PEExports">Класс для работы со списком экспортируемых функций для PE архитектуры:</p> +<pre class="code"> +class PEExports { +public: + string name(); // возвращает имя библиотеки + void setName(string name); // устанавливает имя библиотеки + <a href="#PEExport">PEExport</a> item(int index); // возвращает экспортируемую функцию с индексом index + int count(); // возвращает количество экспортируемых функций в списке + void clear(); // очищает список + <a href="#PEExport">PEExport</a> itemByAddress(uint64 address); // возвращает экспортируемую функцию с адресом address + <a href="#PEExport">PEExport</a> itemByName(string name); // возвращает экспортируемую функцию с именем name +}; +</pre> + +<p id="PEExport">Класс для работы с экспортируемой функцией для PE архитектуры:</p> +<pre class="code"> +class PEExport { +public: + uint64 address(); // возвращает адрес экспортируемой функции + string name(); // возвращает имя экспортируемой функции + void setName(string name); // устанавливает имя экспортируемой функции + int ordinal(); // возвращает ординал экспортируемой функции + string forwardedName(); // возвращает имя функции, на которую перенаправлена экспортируемая функция + void destroy(); // уничтожает экспортируемую функцию +}; +</pre> + +<p id="PEResources">Класс для работы со списком ресурсов для PE архитектуры:</p> +<pre class="code"> +class PEResources { +public: + <a href="#PEResource">PEResource</a> item(int index); // возвращает ресурс с индексом index + int count(); // возвращает количество ресурсов в списке + void clear(); // очищает список + <a href="#PEResource">PEResource</a> itemByType(int type); // возвращает ресурс с типом type + <a href="#PEResource">PEResource</a> itemByName(string name); // возвращает ресурс с именем name +}; +</pre> + +<p id="PEResource">Класс для работы с ресурсом для PE архитектуры:</p> +<pre class="code"> +class PEResource { +public: + <a href="#PEResource">PEResource</a> item(int index); // возвращает ресурс с индексом index + int count(); // возвращает количество ресурсов в списке + void clear(); // очищает список + uint64 address(); // возвращает адрес ресурса + int size(); // возвращает размер ресурса + string name(); // возвращает имя ресурса + int type(); // возвращает тип ресурса + bool isDirectory(); // возвращает признак "Директория" + void destroy(); // уничтожает ресурс + <a href="#PEResource">PEResource</a> itemByName(string name); // возвращает ресурс с именем name + bool excludedFromPacking(); // возвращает признак "Исключен из упаковки" +}; +</pre> + +<p id="PEFixups">Класс для работы со списком настраиваемых элементов для PE архитектуры:</p> +<pre class="code"> +class PEFixups { +public: + <a href="#PEFixup">PEFixup</a> item(int index); // возвращает элемент с индексом index + int count(); // возвращает количество элементов в списке + <a href="#PEFixup">PEFixup</a> itemByAddress(uint64 address); // возвращает элемент с адресом address +}; +</pre> + +<p id="PEFixup">Класс для работы с настраиваемым элементом для PE архитектуры:</p> +<pre class="code"> +class PEFixup { +public: + uint64 address(); // возвращает адрес элемента +}; +</pre> + +<h3>Mach-O файлы</h3> + +<p id="MacFormat">Константы для работы с Mach-O форматом:</p> +<pre class="code"> +enum MacFormat { + // Load Command Types + LC_SEGMENT, + LC_SYMTAB, + LC_SYMSEG, + LC_THREAD, + LC_UNIXTHREAD, + LC_LOADFVMLIB, + LC_IDFVMLIB, + LC_IDENT, + LC_FVMFILE, + LC_PREPAGE, + LC_DYSYMTAB, + LC_LOAD_DYLIB, + LC_ID_DYLIB, + LC_LOAD_DYLINKER, + LC_PREBOUND_DYLIB, + LC_ROUTINES, + LC_SUB_FRAMEWORK, + LC_SUB_UMBRELLA, + LC_SUB_CLIENT, + LC_SUB_LIBRARY, + LC_TWOLEVEL_HINTS, + LC_PREBIND_CKSUM, + LC_LOAD_WEAK_DYLIB, + LC_SEGMENT_64, + LC_ROUTINES_64, + LC_UUID, + LC_RPATH, + LC_CODE_SIGNATURE, + LC_SEGMENT_SPLIT_INFO, + LC_REEXPORT_DYLIB, + LC_LAZY_LOAD_DYLIB, + LC_ENCRYPTION_INFO, + LC_DYLD_INFO, + LC_DYLD_INFO_ONLY, + LC_LOAD_UPWARD_DYLIB, + LC_VERSION_MIN_MACOSX, + // Section Types + SECTION_TYPE, + SECTION_ATTRIBUTES, + S_REGULAR, + S_ZEROFILL, + S_CSTRING_LITERALS, + S_4BYTE_LITERALS, + S_8BYTE_LITERALS, + S_LITERAL_POINTERS, + S_NON_LAZY_SYMBOL_POINTERS, + S_LAZY_SYMBOL_POINTERS, + S_SYMBOL_STUBS, + S_MOD_INIT_FUNC_POINTERS, + S_MOD_TERM_FUNC_POINTERS, + S_COALESCED, + S_GB_ZEROFILL, + S_INTERPOSING, + S_16BYTE_LITERALS, + S_DTRACE_DOF, + S_LAZY_DYLIB_SYMBOL_POINTERS, + SECTION_ATTRIBUTES_USR, + S_ATTR_PURE_INSTRUCTIONS, + S_ATTR_NO_TOC, + S_ATTR_STRIP_STATIC_SYMS, + S_ATTR_NO_DEAD_STRIP, + S_ATTR_LIVE_SUPPORT, + S_ATTR_SELF_MODIFYING_CODE, + S_ATTR_DEBUG, + SECTION_ATTRIBUTES_SYS, + S_ATTR_SOME_INSTRUCTIONS, + S_ATTR_EXT_RELOC, + S_ATTR_LOC_RELOC +}; +</pre> + +<p id="MacFile">Класс для работы с Mach-O файлом:</p> +<pre class="code"> +class MacFile { +public: + string name(); // возвращает имя файла + string format(); // возвращает имя формата "Mach-O" + uint64 size(); // возвращает размер файла + int count(); // возвращает количество архитектур в списке + <a href="#MacArchitecture">MacArchitecture</a> item(int index); // возвращает архитектуру с индексом index + uint64 seek(uint64 offset); // устанавливает файловую позицию + uint64 tell(); // возвращает файловую позицию + int write(string buffer); // записывает буфер в файл +}; +</pre> + +<p id="MacArchitecture">Класс для работы с Mach-O архитектурой:</p> +<pre class="code"> +class MacArchitecture { +public: + string name(); // возвращает имя архитектуры + <a href="#MacFile">MacFile</a> file(); // возвращает родительский файл + uint64 entryPoint(); // возвращает стартовый адрес + <a href="#OperandSize">OperandSize</a> cpuAddressSize(); // возвращает битность архитектуры + uint64 size(); // возвращает размер архитектуры + <a href="#MacSegments">MacSegments</a> segments(); // возвращает список сегментов + <a href="#MacSections">MacSections</a> sections(); // возвращает список секций + <a href="#MacCommands">MacCommands</a> commands(); // возвращает список загрузочных команд + <a href="#MacSymbols">MacSymbols</a> symbols(); // возвращает список символов + <a href="#MacImports">MacImports</a> imports(); // возвращает список импортируемых библиотек + <a href="#MacExports">MacExports</a> exports(); // возвращает список экспортируемых функций + <a href="#MacFixups">MacFixups</a> fixups(); // возвращает список настраиваемых элементов + <a href="#MapFunctions">MapFunctions</a> mapFunctions(); // возвращает список доступных для защиты функций + <a href="#IntelFunctions">IntelFunctions</a> functions(); // возвращает список защищаемых функций + bool addressSeek(uint64 address); // устанавливает файловую позицию + uint64 seek(uint64 offset); // устанавливает файловую позицию + uint64 tell(); // возвращает файловую позицию + int write(string buffer); // записывает буфер в файл +}; +</pre> + +<p id="MacSegments">Класс для работы cо списком сегментов для Mach-O архитектуры:</p> +<pre class="code"> +class MacSegments { +public: + <a href="#MacSegment">MacSegment</a> item(int index); // возвращает сегмент с индексом index + int count(); // возвращает количество сегментов в списке + <a href="#MacSegment">MacSegment</a> itemByAddress(); // возвращает сегмент с адресом address +}; +</pre> + +<p id="MacSegment">Класс для работы c сегментом для Mach-O архитектуры:</p> +<pre class="code" id="MacSegment"> +class MacSegment { +public: + uint64 address(); // возвращает адрес сегмента + string name(); // возвращает имя сегмента + uint64 size(); // возвращает размер сегмента + int physicalOffset(); // возвращает файловую позицию сегмента + int physicalSize(); // возвращает файловый размер сегмента + int flags(); // возвращает флаги сегмента + bool excludedFromPacking(); // возвращает признак "Исключен из упаковки" +}; +</pre> + +<p id="MacSections">Класс для работы cо списком секций для Mach-O архитектуры:</p> +<pre class="code"> +class MacSections { +public: + <a href="#MacSection">MacSection</a> item(int index); // возвращает секцию с индексом index + int count(); // возвращает количество секций в списке + <a href="#MacSection">MacSection</a> itemByAddress(uint64 address); // возвращает секцию с адресом address +}; +</pre> + +<p id="MacSection">Класс для работы c секцией для Mach-O архитектуры:</p> +<pre class="code"> +class MacSection { +public: + uint64 address(); // возвращает адрес секции + string name(); // возвращает имя секции + uint64 size(); // возвращает размер секции + int offset(); // возвращает файловую позицию секции + <a href="#MacSegment">MacSegment</a> segment(); // возвращает родительский сегмент +}; +</pre> + +<p id="MacCommands">Класс для работы cо списком загрузочных команд для Mach-O архитектуры:</p> +<pre class="code"> +class MacCommands { +public: + <a href="#MacCommand">MacCommand</a> item(int index); // возвращает команду с индексом index + int count(); // возвращает количество команд в списке + <a href="#MacCommand">MacCommand</a> itemByType(int type); // возвращает команду с типом type +}; +</pre> + +<p id="MacCommand">Класс для работы c загрузочной командой для Mach-O архитектуры:</p> +<pre class="code"> +class MacCommand { +public: + uint64 address(); // возвращает адрес команды + int type(); // возвращает тип команды + string name(); // возвращает имя команды + int size(); // возвращает размер команды +}; +</pre> + +<p id="MacSymbols">Класс для работы cо списком символов для Mach-O архитектуры:</p> +<pre class="code"> +class MacSymbols { +public: + <a href="#MacSymbol">MacSymbol</a> item(int index); // возвращает символ с индексом index + int count(); // возвращает количество символов в списке +}; +</pre> + +<p id="MacSymbol">Класс для работы c символом для Mach-O архитектуры:</p> +<pre class="code"> +class MacSymbol { +public: + uint64 value(); // возвращает значение символа + string name(); // возвращает имя символа +}; +</pre> + +<p id="MacImports">Класс для работы со списком импортируемых библиотек для Mach-O архитектуры:</p> +<pre class="code"> +class MacImports { +public: + <a href="#MacImport">MacImport</a> item(int index); // возвращает импортируемую библиотеку с индексом index + int count(); // возвращает количество импортируемых библиотек в списке + <a href="#MacImport">MacImport</a> itemByName(string name); // возвращает импортируемую библиотеку с именем name +}; +</pre> + +<p id="MacImport">Класс для работы с импортируемой библиотекой для Mach-O архитектуры:</p> +<pre class="code"> +class MacImport { +public: + string name(); // возвращает имя импортируемой библиотеки + <a href="#MacImportFunction">MacImportFunction</a> item(int index); // возвращает импортируемую функцию с индексом index + int count(); // возвращает количество импортируемых функций в списке + void setName(string name); // устанавливает имя импортируемой библиотеки +}; +</pre> + +<p id="MacImportFunction">Класс для работы с импортируемой функцией для Mach-O архитектуры:</p> +<pre class="code"> +class MacImportFunction { +public: + uint64 address(); // возвращает адрес ячейки, в которую записывается адрес импортируемой функции + string name(); // возвращает имя импортируемой функции +}; +</pre> + +<p id="MacExports">Класс для работы со списком экспортируемых функций для Mach-O архитектуры:</p> +<pre class="code"> +class MacExports { +public: + string name(); // возвращает имя библиотеки + <a href="#MacExport">MacExport</a> item(); // возвращает экспортируемую функцию с индексом index + int count(); // возвращает количество экспортируемых функций в списке + void clear(); // очищает список + <a href="#MacExport">MacExport</a> itemByAddress(uint64 address); // возвращает экспортируемую функцию с адресом address + <a href="#MacExport">MacExport</a> itemByName(string name); // возвращает экспортируемую функцию с именем name +}; +</pre> + +<p id="MacExport">Класс для работы с экспортируемой функцией для Mach-O архитектуры:</p> +<pre class="code"> +class MacExport { +public: + uint64 address(); // возвращает адрес экспортируемой функции + string name(); // возвращает имя экспортируемой функции + string forwardedName(); // возвращает имя функции, на которую перенаправлена экспортируемая функция + void destroy(); // уничтожает экспортируемую функцию +}; +</pre> + +<p id="MacFixups">Класс для работы со списком настраиваемых элементов для Mach-O архитектуры:</p> +<pre class="code"> +class MacFixups { +public: + <a href="#MacFixup">MacFixup</a> item(int index); // возвращает элемент с индексом index + int count(); // возвращает количество элементов в списке + <a href="#MacFixup">MacFixup</a> itemByAddress(uint64 address); // возвращает элемент с адресом address +}; +</pre> + +<p id="MacFixup">Класс для работы с настраиваемым элементом для Mach-O архитектуры:</p> +<pre class="code"> +class MacFixup { +public: + uint64 address(); // возвращает адрес элемента +}; +</pre> + +<h3>Функции</h3> + +<p id="MapFunctions">Класс для работы со списком функций:</p> +<pre class="code"> +class MapFunctions { +public: + <a href="#MapFunction">MapFunction</a> item(int index); // возвращает функцию с индексом index + int count(); // возвращает количество функций в списке + <a href="#MapFunction">MapFunction</a> itemByAddress(uint64 address); // возвращает функцию с адресом address + <a href="#MapFunction">MapFunction</a> itemByName(string name); // возвращает функцию с именем name +}; +</pre> + +<p id="ObjectType">Типы функций:</p> +<pre class="code"> +enum ObjectType { + Unknown, + Code, + Data, + Export, + Marker, + APIMarker, + Import, + String +}; +</pre> + +<p id="MapFunction">Класс для работы с функцией:</p> +<pre class="code"> +class MapFunction { +public: + uint64 address(); // возвращает адрес функции + string name(); // возвращает имя функции + <a href="#ObjectType">ObjectType</a> type(); // возвращает тип функции + <a href="#References">References</a> references(); // возвращает список ссылок +}; +</pre> + +<p id="References">Класс для работы со списком ссылок:</p> +<pre class="code"> +class References { +public: + <a href="#Reference">Reference</a> item(int index); // возвращает ссылку с индексом index + int count(); // возвращает количество ссылок в списке +}; +</pre> + +<p id="Reference">Класс для работы с ссылкой:</p> +<pre class="code"> +class Reference { +public: + uint64 address(); // возвращает адрес команды + uint64 operandAddress(); // возвращает адрес ссылки +}; +</pre> + +<h3>Функции Intel</h3> + +<p id="IntelFunctions">Класс для работы со списком функций Intel:</p> +<pre class="code"> +class IntelFunctions { +public: + <a href="#IntelFunction">IntelFunction</a> item(int index); // возвращает функцию с индексом index + int count(); // возвращает количество функций в списке + void clear(); // очищает список + <a href="#IntelFunction">IntelFunction</a> itemByAddress(uint64 address); // возвращает функцию с адресом address + <a href="#IntelFunction">IntelFunction</a> itemByName(string name); // возвращает функцию с именем name + <a href="#IntelFunction">IntelFunction</a> addByAddress(uint64 address, <a href="#CompilationType">CompilationType</a> type = ctVirtualization); + // добавляет новую функцию с адресом address и типом компиляции type +}; +</pre> + +<p id="CompilationType">Типы компиляции:</p> +<pre class="code"> +enum CompilationType { + None, + Virtualization, + Mutation, + Ultra +}; +</pre> + +<p id="IntelFunction">Класс для работы с функцией Intel:</p> +<pre class="code"> +class IntelFunction { +public: + uint64 address(); // возвращает адрес функции + string name(); // возвращает имя функции + <a href="#ObjectType">ObjectType</a> type(); // возвращает тип функции + <a href="#IntelCommand">IntelCommand</a> item(int index); // возвращает команду с индексом index + int count(); // возвращает количество команд в списке + <a href="#CompilationType">CompilationType</a> compilationType(); // возвращает тип компиляции + void setCompilationType(<a href="#CompilationType">CompilationType</a> value); // устанавливает тип компиляции + <a href="#CommandLinks">CommandLinks</a> links(); // возвращает список связей + <a href="#IntelCommand">IntelCommand</a> itemByAddress(uint64 address); // возвращает команду с адресом address + void destroy(); // уничтожает функцию + <a href="#Folder">Folder</a> folder(); // возвращает пользовательскую папку + void setFolder(<a href="#Folder">Folder</a> folder); // устанавливает пользовательскую папку +}; +</pre> + +<p id="IntelCommandType">Типы команд Intel:</p> +<pre class="code"> +enum IntelCommandType { + Unknown, Push, Pop, Mov, Add, Xor, Test, Lea, Ud0, Ret, Ssh, Crc, Call, Jmp, + Fstsw, Fsqrt, Fchs, Fstcw, Fldcw, Fild, Fist, Fistp, Fld, Fstp, Fst, Fadd, + Fsub, Fsubr, Fisub, Fisubr, Fdiv, Fcomp, Fmul, Repe, Repne, Rep, DB, DW, DD, DQ, + Movs, Cmps, Scas, Movzx, Movsx, Inc, Dec, Les, Lds, Lfs, Lgs, Lss, Xadd, Bswap, + Jxx, And, Sub, Stos, Lods, Nop, Xchg, Pushf, Popf, Sahf, Lahf, Shl, Shr, Sal, + Sar, Rcl, Rcr, Rol, Ror, Shld, Shrd, Loope, Loopne, Loop, Jcxz, In, Ins, Out, + Outs, Wait, Cbw, Cwde, Cdqe, Cwd, Cdq, Cqo, Clc, Stc, Cli, Sti, Cld, Std, Not, + Neg, Div, Imul, Idiv, Mul, Or, Adc, Cmp, Sbb, Pusha, Popa, Clflush, Pause, + Bound, Arpl, Daa, Das, Aaa, Aam, Aad, Aas, Enter, Leave, Int, Into, Iret, Set, + Cmov, Addpd, Addps, Addsd, Addss, Andpd, Andps, Andnpd, Andnps, Cmppd, Cmpps, + Cmpsd, Cmpss, Comisd, Comiss, Cvtdq2ps, Cvtpd2dq, Cvtdq2pd, Cvtpd2pi, Cvtps2pi, + Cvtpd2ps, Cvtps2pd, Cvtpi2pd, Cvtpi2ps, Cvtps2dq, Cvtsd2si, Cvtss2si, Cvtsd2ss, + Cvtss2sd, Cvttpd2pi, Cvttps2pi, Cvttpd2dq, Cvttps2dq, Cvttsd2si, Cvttss2si, + Divpd, Divps, Divsd, Divss, Maxpd, Maxps, Maxsd, Maxss, Minpd, Minps, Minsd, + Minss, Mulpd, Mulps, Mulsd, Mulss, Orpd, Orps, Movd, Movq, Movntq, Movapd, Movaps, + Movdqa, Movdqu, Movdq2q, Movq2dq, Movhlps, Movhpd, Movhps, Movlhps, Movlpd, + Movlps, Movmskpd, Movmskps, Movnti, Movntpd, Movntps, Movsd, Movss, Movupd, + Movups, Pmovmskb, Psadbw, Pshufw, Pshufd, Pshuflw, Pshufhw, Psubb, Psubw, Psubd, + Psubq, Psubsb, Psubsw, Psubusb, Psubusw, Paddb, Paddw, Paddd, Paddq, Paddsb, + Paddsw, Paddusb, Paddusw, Pavgb, Pavgw, Pinsrw, Pextrw, Pmaxsw, Pmaxub, Pminsw, + Pminub, Pmulhuw, Pmulhw, Pmullw, Pmuludq, Psllw, Pslld, Psllq, Pslldq, Psraw, + Psrad, Psrlw, Psrld, Psrlq, Psrldq, Punpcklbw, Punpcklwd, Punpckldq, Punpcklqdq, + Punpckhqdq, Packusdw, Pcmpgtb, Pcmpgtw, Pcmpgtd, Pcmpeqb, Pcmpeqw, Pcmpeqd, + Emms, Packsswb, Packuswb, Punpckhbw, Punpckhwd, Punpckhdq, Packssdw, Pand, + Pandn, Por, Pxor, Pmaddwd, Rcpps, Rcpss, Rsqrtss, Movsxd, Shufps, Shufpd, Sqrtpd, + Sqrtps, Sqrtsd, Sqrtss, Subpd, Subps, Subsd, Subss, Ucomisd, Ucomiss, Unpckhpd, + Unpckhps, Unpcklpd, Unpcklps, Xorpd, Xorps, Bt, Bts, Btr, Btc, Xlat, Cpuid, + Rsm, Bsf, Bsr, Cmpxchg, Cmpxchg8b, Hlt, Cmc, Lgdt, Sgdt, Lidt, Sidt, Smsw, Lmsw, + Invlpg, Lar, Lsl, Clts, Invd, Wbinvd, Ud2, Wrmsr, Rdtsc, Rdmsr, Rdpmc, Fcom, + Fdivr, Fiadd, Fimul, Ficom, Ficomp, Fidiv, Fidivr, Faddp, Fmulp, Fsubp, Fsubrp, + Fdivp, Fdivrp, Fbld, Fbstp, Ffree, Frstor, Fsave, Fucom, Fucomp, Fldenv, Fstenvm, + Fxch, Fabs, Fxam, Fld1, Fldl2t, Fldl2e, Fldpi, Fldlg2, Fldln2, Fldz, Fyl2x, + Fptan, Fpatan, Fxtract, Fprem1, Fdecstp, Fincstp, Fprem, Fyl2xp1, Fsincos, Frndint, + Fscale, Fsin, Fcos, Ftst, Fstenv, F2xm1, Fnop, Finit, Fclex, Fcompp, Sysenter, + Sysexit, Sldt, Str, Lldt, Ltr, Verr, Verw, Sfence, Lfence, Mfence, Prefetchnta, + Prefetcht0, Prefetcht1, Prefetcht2, Prefetch, Prefetchw, Fxrstor, Fxsave, Ldmxcsr, + Stmxcsr, Fcmovb, Fcmove, Fcmovbe, Fcmovu, Fcmovnb, Fcmovne, Fcmovnbe, Fcmovnu, + Fucomi, Fcomi, Fucomip, Fcomip, Fucompp, Vmcall, Vmlaunch, Vmresume, Vmxoff, + Monitor, Mwait, Xgetbv, Xsetbv, Vmrun, Vmmcall, Vmload, Vmsave, Stgi, Clgi, + Skinit, Invlpga, Swapgs, Rdtscp, Syscall, Sysret, Femms, Getsec, Pshufb, Phaddw, + Phaddd, Phaddsw, Pmaddubsw, Phsubw, Phsubd, Phsubsw, Psignb, Psignw, Psignd, + Pmulhrsw, Pabsb, Pabsw, Pabsd, Movbe, Palignr, Rsqrtps, Vmread, Vmwrite, Svldt, + Rsldt, Svts, Rsts, Xsave, Xrstor, Vmptrld, Vmptrst, Maskmovq, Fnstenv, Fnstcw, + Fstp1, Fneni, Fndisi, Fnclex, Fninit, Fsetpm, Fisttp, Fnsave, Fnstsw, Fxch4, + Fcomp5, Ffreep, Fxch7, Fstp8, Fstp9, Haddpd, Hsubpd, Addsubpd, Addsubps, Movntdq, + Fcom2, Fcomp3, Haddps, Hsubps, Movddup, Movsldup, Cvtsi2sd, Cvtsi2ss, Movntsd, + Movntss, Lddqu, Movshdup, Popcnt, Tzcnt, Lzcnt, Pblendvb, Pblendps, Pblendpd, + Ptest, Movsxbw, Movsxbd, Movsxbq, Movsxwd, Movsxwq, Movsxdq, Muldq, Pcmpeqq, + Movntdqa, Xsaveopt, Maskmovdqu, Ud1, Pcmpgtq, Movzxbw, Movzxbd, Movzxbq, Movzxwd, + Movzxwq, Movzxdq +}; +</pre> + +<p id="IntelSegment">Сегменты Intel:</p> +<pre class="code"> +enum IntelSegment { + None, + es, + cs, + ss, + ds, + fs, + gs +}; +</pre> + +<p id="IntelFlag">Флаги Intel:</p> +<pre class="code"> +enum IntelFlag { + C, + P, + A, + Z, + S, + T, + I, + D, + O +}; +</pre> + +<p id="IntelRegistr">Регистры Intel:</p> +<pre class="code"> +enum IntelRegistr { + eax, + ecx, + edx, + ebx, + esp, + ebp, + esi, + edi, + r8, + r9, + r10, + r11, + r12, + r13, + r14, + r15 +}; +</pre> + +<p id="IntelCommand">Класс для работы с командой Intel:</p> +<pre class="code"> +class IntelCommand { +public: + uint64 address(); // возвращает адрес команды + <a href="#IntelCommandType">IntelCommandType</a> type(); // возвращает тип команды + string text(); // возвращает текстовое представление + int size(); // возвращает размер команды + int dump(int index); // возвращает данные команды по индексу index + <a href="#CommandLink">CommandLink</a> link(); // возвращает связь команды + int flags(); // возвращает флаги команды + <a href="#IntelSegment">IntelSegment</a> baseSegment(); // возвращает базовый сегмент + <a href="#IntelCommandType">IntelCommandType</a> preffix(); // возвращает тип преффиксной команды + <a href="#IntelOperand">IntelOperand</a> operand(int index); // возвращает операнд с индексом index +}; +</pre> + +<p id="OperandType">Типы операндов:</p> +<pre class="code"> +enum OperandType { + None, + Value, + Registr, + Memory, + SegmentRegistr, + ControlRegistr, + DebugRegistr, + FPURegistr, + HiPartRegistr, + BaseRegistr, + MMXRegistr, + XMMRegistr +}; +</pre> + +<p id="OperandSize">Размеры операндов:</p> +<pre class="code"> +enum OperandSize { + Byte, + Word, + DWord, + QWord, + TByte, + OWord, + FWord +}; +</pre> + +<p id="IntelOperand">Класс для работы с операндом команды Intel:</p> +<pre class="code"> +class IntelOperand { +public: + int type(); // возвращает тип операнда + <a href="#OperandSize">OperandSize</a> size(); // возвращает размер операнда + int registr(); // возвращает регистр + int baseRegistr(); // возвращает базовый регистр + int scale(); // возвращает коэффициент + uint64 value(); // возвращает значение +}; +</pre> + +<p id="CommandLinks">Класс для работы со списком связей:</p> +<pre class="code" id="CommandLinks"> +class CommandLinks { +public: + <a href="#CommandLink">CommandLink</a> item(int index); // возвращает связь с индексом index + int count(); // возвращает количество связей в списке +}; +</pre> + +<p id="LinkType">Типы связей:</p> +<pre class="code"> +enum LinkType { + None, + SEHBlock, + FinallyBlock, + DualSEHBlock, + FilterSEHBlock, + Jmp, + JmpWithFlag, + JmpWithFlagNSFS, + JmpWithFlagNSNA, + JmpWithFlagNSNS, + Call, + Case, + Switch, + Native, + Offset, + GateOffset, + ExtSEHBlock, + MemSEHBlock, + ExtSEHHandler, + VBMemSEHBlock +}; +</pre> + +<p id="CommandLink">Класс для работы со связью команды:</p> +<pre class="code"> +class CommandLink { +public: + uint64 toAddress(); // возвращает адрес, на который ссылается связь + <a href="#LinkType">LinkType</a> type(); // возвращает тип связи + <a href="#IntelCommand">IntelCommand</a> from(); // возвращает родительскую команду +}; +</pre> + +<p id="FFILibrary">Класс для работы с библиотекой:</p> +<pre class="code"> +enum ParamType { + "void", + "byte", + "char", + "short", + "ushort", + "int", + "uint", + "long", + "ulong", + "size_t", + "float", + "double", + "string", + "pointer" +}; + +enum CallType { + "default", + "cdecl", + "stdcall" +}; + +class FFILibrary { +public: + string name(); // возвращает имя + uint64 address(); // возвращает адрес в памяти + void close(); + FFIFunction getFunction(string name, ParamType ret, ParamType param1, ...); // возвращает функцию + FFIFunction getFunction(string name, table (ParamType ret, CallType abi, ParamType, ...)); // возвращает функцию +}; +</pre> + +<p id="FFIFunction">Класс для работы с внешней функцией:</p> +<pre class="code"> +class FFIFunction { + string name(); // возвращает имя + uint64 address(); // возвращает адрес в памяти +}; +</pre> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html>
\ No newline at end of file diff --git a/help/ru/script_events.htm b/help/ru/script_events.htm new file mode 100644 index 0000000..9022dc0 --- /dev/null +++ b/help/ru/script_events.htm @@ -0,0 +1,91 @@ +<!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. + Вызов процедур и функций, необходимых на разных этапах создания + защищаемого файла, осуществляется через события, обрабатываемые + ядром VMProtect. При создании скриптов можно установить + собственные обработчики для 5-ти событий, которые вызываются + ядром протектора в следующем порядке:</p> + + <ul> + <li><a href="#OnBeforeCompilation">OnBeforeCompilation</a></li> + <li><a href="#OnBeforeSaveFile">OnBeforeSaveFile</a></li> + <li><a href="#OnBeforePackFile">OnBeforePackFile</a></li> + <li><a href="#OnAfterSaveFile">OnAfterSaveFile</a></li> + <li><a href="#OnAfterCompilation">OnAfterCompilation</a></li> + </ul> + <a name="OnBeforeCompilation"/><pre class="code">function OnBeforeCompilation() + +end</pre> + + <p>Событие вызывается на этапе формирования списка защищаемых + объектов. В обработчике OnBeforeCompilation можно добавить в + проект новые процедуры, а также изменить или удалить уже + существующие.</p> + <a name="OnBeforeSaveFile"/><pre class="code">function OnBeforeSaveFile() + +end</pre> + + <p>Событие вызывается перед записью в выходной файл всех объектов, созданных в + результате компиляции. В обработчике события + OnBeforeSaveFile можно изменить как сам файл, так и некоторые его + свойства (например, список ресурсов, список экспортируемых + функций, имена секций и т.д.), которые впоследствии будут + автоматически записаны в выходной файл.</p> + + <a name="OnBeforePackFile"/><pre class="code">function OnBeforePackFile() + +end</pre> + + <p>Событие вызывается перед упаковкой защищенного файла + приложения. Используя OnBeforePackFile можно внести изменения в + файл, который будет упакован. Данное событие вызывается только + при использовании опции "Упаковать выходной файл".</p> + + <a name="OnAfterSaveFile"/><pre class="code">function OnAfterSaveFile() + +end</pre> + + <p>Событие вызывается после записи всех объектов, созданных в + результате компиляции, в выходной файл. В обработчике события + можно добавить в выходной файл новые данные или изменить ранее + записанные.</p> + + <a name="OnAfterCompilation"/><pre class="code">function OnAfterCompilation() + +end</pre> + + <p>Событие вызывается после компиляции всех объектов, входящих в + проект. На данном этапе пользователю доступен откомпилированный + файл, над которым могут быть выполнены любые необходимые + действия, например добавление электронной подписи + (сертификата).</p><br/> + + <p>При написании обработчиков событий можно создавать собственные + процедуры и функции. Имена событий отображаются в редакторе + скрипта жирным шрифтом.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/script_functions.htm b/help/ru/script_functions.htm new file mode 100644 index 0000000..9b27aee --- /dev/null +++ b/help/ru/script_functions.htm @@ -0,0 +1,53 @@ +<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 доступны функции, дающие возможность + выполнить ряд основных операций. Среди этих функций присутствуют + как общесистемные функции, позволяющие работать со строками, + датами и числами, использовать командную строку программы, + выводить различные сообщения и т.д., так и специализированные + функции, позволяющие работать с ядром VMProtect и водяными + знаками:</p> + + <ul> + <li><a href="http://www.lua.org/manual/5.2/manual.html#6.4">string</a></li> + <li><a href="http://www.lua.org/manual/5.2/manual.html#6.5">table</a></li> + <li><a href="http://www.lua.org/manual/5.2/manual.html#6.6">math</a></li> + <li><a href="http://www.lua.org/manual/5.2/manual.html#6.7">bit32</a></li> + <li><a href="http://www.lua.org/manual/5.2/manual.html#6.8">io</a></li> + <li><a href="http://www.lua.org/manual/5.2/manual.html#6.9">os</a></li> + <li><a href="#VMProtect">vmprotect</a></li> + </ul> + <a name="VMProtect"></a> + <pre class="code"> +namespace vmprotect { + <a href="script_classes.htm#Core">Core</a> core(); // возвращает ядро VMProtect + string extractFilePath(string name); // извлекает путь файла + string extractFileName(string name); // извлекает имя файла + string extractFileExt(string name); // извлекает расширение файла + table commandLine(); // возвращает командную строку + <a href="script_classes.htm#FFILibrary">FFILibrary</a> openLib(string name); // открывает библиотеку +}; +</pre> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/sdk_functions.htm b/help/ru/sdk_functions.htm new file mode 100644 index 0000000..fb00684 --- /dev/null +++ b/help/ru/sdk_functions.htm @@ -0,0 +1,205 @@ +<!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>Функции SDK</title> +</head> + +<body> + <h1>Функции SDK</h1> + + <p>Функции SDK предназначены для интеграции в исходный код + защищаемого приложения и служат для задания границ защищаемых + областей, обнаружения использования средств отладки или + виртуализации.</p> + + <p><strong>Маркеры кода</strong></p> + + <ul> + <li><a href="#VMProtectBegin">VMProtectBegin</a></li> + <li><a href="#VMProtectBeginVirtualization">VMProtectBeginVirtualization</a></li> + <li><a href="#VMProtectBeginMutation">VMProtectBeginMutation</a></li> + <li><a href="#VMProtectBeginUltra">VMProtectBeginUltra</a></li> + <li><a href="#VMProtectBeginVirtualizationLockByKey">VMProtectBeginVirtualizationLockByKey</a></li> + <li><a href="#VMProtectBeginUltraLockByKey">VMProtectBeginUltraLockByKey</a></li> + <li><a href="#VMProtectEnd">VMProtectEnd</a></li> + </ul> + + <p><strong>Сервисные функции</strong></p> + + <ul> + <li><a href="#VMProtectIsProtected">VMProtectIsProtected</a></li> + <li><a href="#VMProtectIsDebuggerPresent">VMProtectIsDebuggerPresent</a></li> + <li><a href="#VMProtectIsVirtualMachinePresent">VMProtectIsVirtualMachinePresent</a></li> + <li><a href="#VMProtectIsValidImageCRC">VMProtectIsValidImageCRC</a></li> + <li><a href="#VMProtectDecryptStringA">VMProtectDecryptStringA</a></li> + <li><a href="#VMProtectDecryptStringW">VMProtectDecryptStringW</a></li> + <li><a href="#VMProtectFreeString">VMProtectFreeString</a></li> + </ul> + + <p><strong>Функции лицензирования</strong></p> + + <ul> + <li><a href="manager/usage/api.htm">VMProtectSetSerialNumber</a></li> + <li><a href="manager/usage/api.htm">VMProtectGetSerialNumberState</a></li> + <li><a href="manager/usage/api.htm">VMProtectGetSerialNumberData</a></li> + <li><a href= "manager/usage/api.htm">VMProtectGetCurrentHWID</a></li> + </ul> + + <p id="VMProtectBegin"><strong>VMProtectBegin</strong></p> + <pre class="code">void VMProtectBegin(const char *MarkerName); +</pre> + + <p><a href="use_markers.htm">Маркер</a> начала защищаемой области + кода. Вызов VMProtectBegin должен находиться перед первой + командой (вызовом процедуры, функции) защищаемого блока кода. + MarkerName задает имя маркера, которое в VMProtect будет иметь + вид "VMProtectMarker"+MarkerNamе. Например, маркер + VMProtectBegin('CheckRegistration') будет выглядеть как + VMProtectMarker "CheckRegistration". Если имя маркера не задано, + ему будет присвоено уникальное имя вида "VMProtectMarker"+номер + маркера по порядку. <a href= + "project_functions.htm#CompilationTypes">Тип компиляции</a> + защищаемой области задается при обработке проекта в + VMProtect.</p> + + <p id="VMProtectBeginVirtualization"><strong>VMProtectBeginVirtualization</strong></p> + <pre class="code">void VMProtectBeginVirtualization(const char *MarkerName); +</pre> + + <p>Маркер начала защищаемой области кода с предустановленным + типом компиляции "виртуализация". MarkerName задает <a href="#VMProtectBegin">имя маркера</a>. + При дальнейшей работе с VMProtect тип + компиляции, заданный маркером, изменить нельзя.</p> + + <p id="VMProtectBeginMutation"><strong>VMProtectBeginMutation</strong></p> + <pre class="code">void VMProtectBeginMutation(const char *MarkerName); +</pre> + + <p>Маркер начала защищаемой области кода с предустановленным + типом компиляции "мутация". MarkerName задает <a href="#VMProtectBegin">имя маркера</a>. + При дальнейшей работе с VMProtect тип компиляции, + заданный маркером изменить, нельзя.</p> + + <p id="VMProtectBeginUltra"><strong>VMProtectBeginUltra</strong></p> + <pre class="code">void VMProtectBeginUltra(const char *MarkerName); +</pre> + + <p>Маркер начала защищаемой области кода с предустановленным + типом компиляции "ультра (мутация + виртуализация)". MarkerName + задает <a href="#VMProtectBegin">имя маркера</a>. При дальнейшей работе с + VMProtect тип компиляции, заданный маркером, изменить + нельзя.</p> + + <p id="VMProtectBeginVirtualizationLockByKey"><strong>VMProtectBeginVirtualizationByKey</strong></p> + <pre class="code">void VMProtectBeginVirtualizationLockByKey(const char *MarkerName); +</pre> + + <p>Маркер начала защищаемой области кода с предустановленным + типом компиляции "виртуализация" и опцией "<a href= + "project_functions.htm#LockToKey">Привязать к ключу</a>". + MarkerName задает <a href="#VMProtectBegin">имя маркера</a>. При + дальнейшей работе с VMProtect тип компиляции, заданный маркером, + изменить нельзя.</p> + + <p id="VMProtectBeginUltraLockByKey"><strong>VMProtectBeginUltraLockByKey</strong></p> + <pre class="code">void VMProtectBeginUltraLockByKey(const char *MarkerName); +</pre> + + <p>Маркер начала защищаемой области кода с предустановленным + типом компиляции "ультра (мутация + виртуализация)" и опцией + "<a href="project_functions.htm#LockToKey">Привязать к + ключу</a>". MarkerName задает <a href="#VMProtectBegin">имя маркера</a>. + При дальнейшей работе с VMProtect тип компиляции, заданный + маркером, изменить нельзя.</p> + + <p id="VMProtectEnd"><strong>VMProtectEnd</strong></p> + <pre class="code">void VMProtectEnd(void); +</pre> + + <p>Маркер конца защищаемой области кода. Вызов VMProtectEnd + должен находиться после последней команды (вызова процедуры, + функции) защищаемого блока кода.</p> + + <p id="VMProtectIsProtected"><strong>VMProtectIsProtected</strong></p> + <pre class="code">bool VMProtectIsProtected(void); +</pre> + + <p>Функция MProtectIsProtected возвращает True если файл обработан VMProtect.</p> + + <p id="VMProtectIsDebuggerPresent"><strong>VMProtectIsDebuggerPresent</strong></p> + <pre class="code">bool VMProtectIsDebuggerPresent(bool CheckKernelMode); +</pre> + + <p>Функция VMProtectIsDebuggerPresent позволяет определить факт + запуска приложения из-под отладчика. Результат ее работы + (True/False) может быть обработан с помощью защитных механизмов, + встроенных в приложение. При CheckKernelMode=False функция + проверяет наличие отладчика User-mode (OllyDBG, WinDBG и т.п.). + При CheckKernelMode=True будет производиться определение как + отладчиков User-mode, так и отладчиков Kernel-mode (SoftICE, + Syser и т.п.). При защите драйверов значение CheckKernelMode не + имеет значения, так как драйвера работают в режиме ядра, поэтому + для них всегда проверяется наличие отладчиков + Kernel-mode.</p> + + <p id="VMProtectIsVirtualMachinePresent"><strong>VMProtectIsVirtualMachinePresent</strong></p> + <pre class="code">bool VMProtectIsVirtualMachinePresent(void); +</pre> + + <p>Функция VMProtectIsVirtualMachinePresent позволяет определить + факт запуска приложения в виртуальной среде: VMware, Virtual PC, + VirtualBox, Sandboxie. Результат ее работы (True/False) может + быть обработан с помощью защитных механизмов, встроенных в + приложение.</p> + + <p id="VMProtectIsValidImageCRC"><strong>VMProtectIsValidImageCRC</strong></p> + <pre class="code">bool VMProtectIsValidImageCRC(void); +</pre> + + <p>Функция VMProtectIsValidImageCRC позволяет определить факт + изменения защищенного модуля в памяти процесса (проверяются только неизменяемые сегменты кода и данных). + Результат ее работы (True/False) может быть обработан с помощью защитных механизмов, встроенных в + приложение.</p> + + <p id="VMProtectDecryptStringA"><strong>VMProtectDecryptStringA</strong></p> + <pre class="code">const char * VMProtectDecryptStringA(const char *Value); +</pre> + + <p>Функция VMProtectDecryptStringA позволяет дешифровать + строковую ANSI константу Value. Для шифрации константы её + необходимо <a href="project_functions.htm#AddFunction">включить + в список защищаемых объектов</a>.</p> + + <p id="VMProtectDecryptStringW"><strong>VMProtectDecryptStringW</strong></p> + <pre class="code">const wchar_t * VMProtectDecryptStringW(const wchar_t *Value); +</pre> + + <p>Функция VMProtectDecryptStringW позволяет дешифровать + строковую Unicode константу Value. Для шифрации константы её + необходимо <a href="project_functions.htm#AddFunction">включить + в список защищаемых объектов</a>.</p> + + <p id="VMProtectFreeString"><strong>VMProtectFreeString</strong></p> + <pre class="code">bool VMProtectFreeString(const void *Value); +</pre> + + <p>Функция VMProtectFreeString освобождает динамическую память, занятую расшифрованной строкой. Освобождение делать не обязательно, но если делать - то только этой функцией. + Повторное использование VMProtectDecryptStringA/VMProtectDecryptStringW с тем же параметром и без уничтожения ранее + расшифрованной строки не будет приводить к дополнительному выделению памяти.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/software_protection.htm b/help/ru/software_protection.htm new file mode 100644 index 0000000..6a3a482 --- /dev/null +++ b/help/ru/software_protection.htm @@ -0,0 +1,126 @@ +<!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> + + <p>Основным инструментом, применяемым для защиты приложений от + взлома, являются <a href= + "dictionary.htm#Protector">программы-протекторы</a>. Защита, + реализуемая большинством протекторов, заключается в том, что они + <a href="dictionary.htm#Pack">упаковывают</a> и/или <a href= + "dictionary.htm#Crypt">шифруют</a> исходный исполняемый файл, + уделяя основное внимание защите процедуры распаковки/расшифровки + файла.</p> + + <p>Подобный алгоритм работы протекторов очень часто оказывается + причиной недостаточной степени защиты обеспечиваемой большинством + из них. В случае если приложение защищено с использованием + упаковки, по окончании работы распаковщика в распоряжении + злоумышленника может оказаться исходный файл, который может быть + получен при дампе определенной области памяти. Более того, для + борьбы с самыми распространенными протекторами взломщики + разработали множество программных инструментов, позволяющих + взламывать защиту в автоматическом режиме. Аналогичный подход + применяется при борьбе с шифрованием: после получения + лицензионного ключа, который в том числе может быть легально + приобретен, взломщик сможет расшифровать защищенные участки + кода.</p> + + <p>Ряд программ-протекторов применяют различные антиотладочные + приемы. Однако применение антиотладки значительно снижает + быстродействие программы. Также следует помнить, что + антиотладочные приемы действенны лишь против динамического + анализа и совершенно не эффективны против статического. Более + того, все антиотладочные приемы, применяемые в современных + протекторах, уже давно изучены, а взломщиками написано множество + утилит, которые их полностью нейтрализуют. На эффективность + использования мониторов активности встроенные в приложение + средства защиты от отладки не влияют.</p> + + <p>Более эффективными методами защиты приложения являются + <a href="dictionary.htm#Obfuscation">обфускация</a> и <a href= + "dictionary.htm#Virtualization">виртуализация</a>, усложняющие + анализ кода защищаемого приложения. В общем случае эффективность + данных методов достигается за счет использования особенностей + человеческого фактора - чем сложнее исходный код, чем больше + ресурсов использует приложение, тем человеку его анализирующему + тяжелее понять логику работы программы, а следовательно, и + взломать примененные средства защиты.</p> + + <p>При обфускации производится запутывание кода приложения за + счет введения дополнительных инструкций. При виртуализации + исходный код преобразуется в <a href= + "dictionary.htm#ByteCode">байт-код</a>, выполнение которого + осуществляется на специальном интерпретаторе, имитирующем + виртуальную машину со специфической системой команд. + Следовательно, применение виртуализации приводит к высокой и + неснижаемой степени запутанности результирующего кода, а при + определенном подходе к реализации этого метода защищенный код не + содержит методов восстановления оригинального кода в явном виде. + Таким образом, важнейшим преимуществом виртуализации является то, + что в момент выполнения виртуализированного участка кода не + происходит его обратного преобразования в машинные коды + процессора, а это исключает возможность получения взломщиком + оригинального кода приложения.</p> + + <p>Задача обратного инжиниринга виртуализированных фрагментов + сводится к изучению архитектуры <a href= + "dictionary.htm#VirtualMachine">виртуальной машины</a>, созданию + дизассемблера, соответствующего архитектуре имитируемого + виртуальной машиной процессора, и анализу дизассемблированного + кода. При определенном подходе к реализации виртуальной машины + задача создания дизассемблера виртуализированного кода становится + достаточно трудоемкой. Единственным недостатком виртуализации + является сравнительно низкая скорость работы, поэтому этот метод + следует применять только для защиты участков кода, некритичных к + скорости исполнения.</p> + + <p>В подавляющем большинстве современных протекторов методы + обфускации и виртуализации играют второстепенную роль, а уровень + их реализации недостаточен, что позволяет взломщикам выполнять + снятие подобной защиты в автоматизированном или ручном режиме. + Еще одним слабым местом многих современных протекторов является + использование недокументированных функций Windows, что создает + ограничения для использования приложения в новых версиях + операционной системы или при включенном режиме DEP.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/terms.htm b/help/ru/terms.htm new file mode 100644 index 0000000..8d96a49 --- /dev/null +++ b/help/ru/terms.htm @@ -0,0 +1,70 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" + "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + <meta name="AppleIcon" content="VMProtect.help/logo.png" /> + <meta name="AppleTitle" content="VMProtect 3.0 Help" /> + + <title>Введение</title> + <style type="text/css"> +/*<![CDATA[*/ + div.c2 {align:center} + hr.c1 {height:1px;border-width:0;color:gray;background-color:gray} + /*]]>*/ + </style> +</head> + +<body> + <h1>Введение</h1> + + <p>Идеального способа защиты программного обеспечения от + несанкционированного использования и распространения не + существует. Ни одна существующая система не обеспечит абсолютную + защиту и не лишит потенциального взломщика самой возможности ее + нейтрализации. Однако использование качественной и эффективной + защиты может максимально усложнить процесс взлома программного + продукта, более того, сделать взлом нецелесообразным с точки + зрения потраченного на это времени и усилий. При создании защиты + программного продукта могут преследоваться различные цели и + решаться разнообразные задачи, однако основа любой схемы защиты - + защита приложения от изучения, так как именно устойчивость к + обратной инженерии определяет эффективность защиты в целом.</p> + + <ul> + <li><a href="dictionary.htm">Словарь терминов</a></li> + + <li><a href="software_protection.htm">Изучение, взлом и + защита программного обеспечения</a></li> + + <li><a href="about_vmprotect.htm">Что такое + VMProtect?</a></li> + + <li><a href="recommendations.htm">Рекомендации по + защите</a></li> + </ul> + + <div class=unhide_if_no_site style="visibility:hidden"> + <h2>См. также</h2> + + <ul> + <li><a href="http://vmpsoft.com/support/user-manual-v3/">Версию + этого руководства на сайте (самую актуальную)</a></li> + </ul> + </div> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/toolbar.htm b/help/ru/toolbar.htm new file mode 100644 index 0000000..2ff8dae --- /dev/null +++ b/help/ru/toolbar.htm @@ -0,0 +1,39 @@ +<!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> + + <ul> + <li>Открытие проекта или защищаемого файла: <img src="images/button_open.png" /></li> + <li>Cохранение проекта: <img src="images/button_save.png" /></li> + <li>Название защищаемого файла: <br /> <img src="images/button_project.png" /></li> + <li>Компиляция проекта: <img src="images/button_compilation.png" /></li> + <li>Запуск оригинального/защищенного файла (нажатием на стрелочку можно задать параметры командной строки): <img src="images/button_execute.png" /></li> + <li>Часто используемая операция (зависит от выбранного раздела): <br /><img src="images/button_action.png" /></li> + <li>Cтрока быстрого поиска: <br /><img src="images/button_search.png" /></li> + </ul> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/use_map_file.htm b/help/ru/use_map_file.htm new file mode 100644 index 0000000..88c0fce --- /dev/null +++ b/help/ru/use_map_file.htm @@ -0,0 +1,55 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Использование MAP-файла</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Использование MAP-файла</h1> + + <p>Для создания MAP-файла необходимо включить соответствующую + опцию в настройках компилятора.</p> + + <h3>Visual Studio</h3> + + <p>Если для разработки приложения используется Visual Studio, эту + операцию выполняют следующим образом: используя главное меню IDE + Visual Studio, входят в свойства проекта (Project - Properties), + где на вкладке "Linker - Debugging" переводят переключатель + "Generate MAP File" в положение "Yes (/MAP)":</p> + <p><img src="images/visual_studio_map.png" /></p> + + <h3>Borland Delphi</h3> + + <p>Если для разработки приложения используется Borland Delphi, + эту операцию выполняют следующим образом: используя главное меню + IDE Delphi, входят в свойства проекта (Project - Options), где на + вкладке "Linker" переводят переключатель секции "MAP file" в + положение "Detailed":</p> + <p><img src="images/delphi_map.png" /></p> + + <p>После включения генерации MAP-файла необходимо полностью + перекомпилировать проект.</p> + + <p>При загрузке MAP-файла VMProtect сравнивает дату и время + модификации защищаемого файла и MAP-файла, и в случае их отличия + MAP-файл не будет загружен.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/use_markers.htm b/help/ru/use_markers.htm new file mode 100644 index 0000000..d86c80f --- /dev/null +++ b/help/ru/use_markers.htm @@ -0,0 +1,134 @@ +<!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>Для защиты отдельных участков кода, а также для защиты + строковых констант в текст программы вставляют маркеры, которые + представляют собой вызов импортируемых процедур, находящихся во + внешней DLL-библиотеке (для 32-разрядных приложений используется + VMProtectSDK32.dll, а для 64-разрядных - VMProtectSDK64.dll; для + защиты драйверов используются VMProtectDDK32.sys и + VMProtectDDK64.sys соответственно) - далее по тексту + VMProtectSDK. Процедуры и функции, находящиеся в VMProtectSDK, не + выполняют каких-либо действий и выступают лишь в роли меток, по + которым VMProtect определяет границы защищаемого кода. Начало и + конец защищаемого блока, соответственно, маркируется следующим + образом:</p> + + <ul> + <li><strong>Delphi</strong> + <pre class="code">uses VMProtectSDK; + +VMProtectBegin(НАЗВАНИЕ_МАРКЕРА); +... +VMProtectEnd; +</pre> + </li> + + <li><strong>C/C++</strong> + <pre class="code">#include "VMProtectSDK.h" + +VMProtectBegin(НАЗВАНИЕ_МАРКЕРА); +... +VMProtectEnd(); +</pre> + </li> + + <li><strong>MASM</strong> + <pre class="code">include VMProtectSDK.inc + +invoke VMProtectBegin,SADD(НАЗВАНИЕ_МАРКЕРА) +... +invoke VMProtectEnd +</pre> + </li> + + <li><strong>Visual Basic</strong> + <pre class="code">VMProtectBegin (StrPtr(НАЗВАНИЕ_МАРКЕРА)) +... +VMProtectEnd +</pre> + </li> + </ul> + + <p>Также вместо VMProtectBegin можно использовать маркеры с + предустановленными <a href= + "project_functions.htm#CompilationTypes">типами + компиляции</a>:</p> + + <ul> + <li>VMProtectBeginVirtualization - маркер будет использовать + тип компиляции "Виртуализация".</li> + + <li>VMProtectBeginMutation - маркер будет использовать тип + компиляции "Мутация".</li> + + <li>VMProtectBeginUltra - маркер будет использовать тип + компиляции "Ультра".</li> + </ul> + + <p>Обработка маркеров производится следующим образом: при анализе + кода защищаемого приложения VMProtect находит все вызовы процедур + и функций VMProtectSDK. Границы защищаемых блоков определяются по + парам маркеров + VMProtectBegin/VMProtectBeginVirtualization/VMProtectBeginMutation/VMProtectBeginUltra + и VMProtectEnd. В процессе обработки проекта с помощью VMProtect + из кода защищаемой программы удаляются как сами маркеры, так и + упоминание о библиотеках VMProtectSDK, поэтому нет необходимости + включать данные библиотеки в дистрибутив программы. Маркеры + удаляются независимо от того, были они включены в компиляцию или + нет. При использовании именованных маркеров их имена также + удаляются.</p> + + <p>Если задано название маркера, ему будет присвоено имя вида + "VMProtectMarker НАЗВАНИЕ_МАРКЕРА". Если название маркера не + задано, ему будет присвоено уникальное имя вида + "VMProtectMarker"+номер маркера по порядку. Однако использование + неименованных маркеров имеет один серьезный недостаток, + заключающийся в том, что при вставке в исходный код программы + нового маркера нумерация неименованных маркеров изменится, + поэтому при защите программ всегда целесообразно использовать + именованные маркеры.</p> + + <p>Важным моментом, который необходимо учитывать при работе с + маркерами, является то, что нельзя допускать переходы из + незащищенных участков внутрь маркера, что может произойти, + например, при пометке маркером только части цикла. В случае если + приложение после защиты с использованием маркеров стало + неработоспособным, адреса переходов из незащищенных участков + можно определить с помощью включения опции "Режим отладки". В + данном режиме, при работе защищенного приложения из-под + отладчика, на месте обнаружения переходов из незащищенного + участка кода в защищенный отладчик будет прерывать выполнение + программы. После обнаружения всех подобных переходов необходимо + изменить местоположение маркеров в коде программы либо, если это + невозможно, пометить эти адреса как внешние, используя + графическую версию VMProtect.</p> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/watermarks.htm b/help/ru/watermarks.htm new file mode 100644 index 0000000..248e3a4 --- /dev/null +++ b/help/ru/watermarks.htm @@ -0,0 +1,45 @@ +<!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 предоставляет уникальную возможность добавления в + защищаемый файл скрытой информации о владельце файла. Водяной + знак представляет собой массив байт, который должен быть уникален + для каждого вашего пользователя. После включения водяных знаков в + защищаемый файл в дальнейшем (например, в случае распространения + взломанной программы) вы всегда сможете определить его владельца + и принять соответствующие меры. Файл базы данных с водяными файлами + хранится в файле "%ApplicationData%/VMProtect Software/VMProtect.dat" + для Windows и в файле "/Users/Shared/VMProtect Software/VMProtect.dat" + для Mac OS X.</p> + + <p>Диалоговое окно "Водяные знаки" содержит две вкладки:</p> + + <ul> + <li><a href="watermarks_setup.htm">Настройка</a></li> + <li><a href="watermarks_search.htm">Поиск</a></li> + </ul><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/watermarks_search.htm b/help/ru/watermarks_search.htm new file mode 100644 index 0000000..eeeba7f --- /dev/null +++ b/help/ru/watermarks_search.htm @@ -0,0 +1,65 @@ +<!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/watermarks_search.png" /></p> + + <ul> + <li><strong>Поиск в файле</strong> - искать в исполняемом файле + приложения. В поле "Имя файла" выберите файл, в котором + необходимо произвести поиск водяных знаков;</li> + + <li><strong>Поиск в модуле</strong> - искать в модуле + выбранного процесса. После выбора в выпадающем списке "Процесс" + нужного процесса в выпадающем списке "Модуль" выберите модуль + этого процесса, в котором необходимо произвести поиск водяных + знаков.</li> + </ul> + + <p>Результаты поиска водяных знаков отображаются в списке, + расположенном в нижней части окна:</p> + + <ul> + <li><strong>Название</strong> - название найденного водяного + знака;</li> + + <li><strong>Количество</strong> - количество копий найденного + водяного знака.</li> + </ul> + + <p><strong>Важно:</strong><br /> + При поиске водяных знаков в неупакованном исполняемом файле может + использоваться любой из этих режимов. Однако, если исполняемый + файл <a href="dictionary.htm#Pack">упакован</a>, то водяные знаки + следует искать только в запущенном приложении (режим "Поиск в + модуле"), так как их поиск в исполняемом файле не даст + каких-либо результатов, из-за того что водяные знаки, как и + остальной код и данные, хранятся в сжатом виде, а распаковка + осуществляется только после запуска приложения.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/watermarks_setup.htm b/help/ru/watermarks_setup.htm new file mode 100644 index 0000000..80cec4d --- /dev/null +++ b/help/ru/watermarks_setup.htm @@ -0,0 +1,49 @@ +<!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/watermarks_setup.png" alt="Настройка водяных знаков" /></p> + + <p>Для добавления водяного знака служит одноименная кнопка. При этом откроется диалоговое + окно:</p> + <p><img src="images/watermarks_add.png" alt="Добавить водяной знак" /></p> + + <ul> + <li><strong>Название</strong> - название водяного знака;</li> + + <li><strong>Значение</strong> - значение водяного знака. При + помощи кнопки "Сгенерировать" можно задать случайное значение + водяного знака. Поле "Значение" состоит из двух столбцов: в + левом столбце можно ввести значение в Hex режиме, в правом + столбце - в виде текста. При вставке водяного знака в + защищаемый файл позиции, имеющие символ "?", будут иметь + случайные значения.</li> + </ul> + <p>Для удаления или переименования водяного знака используйте контекстное меню:</p> + <p><img src="images/watermarks_menu.png" alt="Меню водяного знака" /></p> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html>
\ No newline at end of file diff --git a/help/ru/work.htm b/help/ru/work.htm new file mode 100644 index 0000000..1d8f846 --- /dev/null +++ b/help/ru/work.htm @@ -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>Работа с VMProtect</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Работа с VMProtect</h1> + + <p>Перед началом работы с VMProtect ознакомьтесь со следующими разделами:</p> + + <ul> + <li><a href="create_project.htm">Подготовка проекта</a></li> + <li><a href="main_window.htm">Главное окно</a></li> + <li><a href="mode_console.htm">Консольная версия</a></li> + </ul><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> |