mirror of
https://github.com/Alukym/VMProtect-Source.git
synced 2025-06-26 19:47:53 -05:00
Initial commit
This commit is contained in:
137
help/ru/create_project.htm
Normal file
137
help/ru/create_project.htm
Normal file
@ -0,0 +1,137 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<link rel="Stylesheet" type="text/css" href="default.css" />
|
||||
<meta http-equiv="Content-Type" content=
|
||||
"text/html; charset=utf-8" />
|
||||
|
||||
<title>Подготовка проекта</title>
|
||||
<style type="text/css">
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Подготовка проекта</h1>
|
||||
|
||||
<p>Для примера рассмотрим простейшее приложение, состоящее из
|
||||
одной формы (Form1), элемента ввода текста (Edit1) и кнопки
|
||||
(Button1). Работа приложения заключается в следующем: при нажатии
|
||||
на кнопку Button1 проверяется корректность введенного пароля и
|
||||
при этом выдается соответствующее сообщение.</p><br />
|
||||
<img src="images/delphi_project.png" />
|
||||
|
||||
<p>Пароль проверяется по простейшему алгоритму: сначала он
|
||||
преобразуется в число, после чего определяется остаток от деления
|
||||
данного числа на 17. Пароль считается правильным, если остаток от
|
||||
деления числового представления пароля на 17 равен 13. Процедура
|
||||
проверки пароля на языке программирования Delphi реализуется
|
||||
следующим образом:</p>
|
||||
<pre class="code">function TForm1.CheckPassword: Boolean;
|
||||
begin
|
||||
Result:=(StrToIntDef(Edit1.Text, 0) mod 17=13);
|
||||
end;
|
||||
|
||||
procedure TForm1.Button1Click(Sender: TObject);
|
||||
begin
|
||||
if CheckPassword then
|
||||
MessageDlg('Correct password', mtInformation, [mbOK], 0)
|
||||
else
|
||||
begin
|
||||
MessageDlg('Incorrect password', mtError, [mbOK], 0);
|
||||
Edit1.SetFocus;
|
||||
end;
|
||||
end;
|
||||
</pre>
|
||||
|
||||
<p>Выбор защищаемых процедур и функций может осуществляться тремя
|
||||
способами:</p>
|
||||
|
||||
<ul>
|
||||
<li>С <a href="use_map_file.htm">использованием MAP-файла</a>,
|
||||
который формируется компилятором при создании исполняемого
|
||||
модуля программы. В MAP-файле содержится вся необходимая
|
||||
информация об именах и адресах всех процедур и функций
|
||||
приложения. В случае использования MAP-файла при работе с
|
||||
VMProtect выбор защищаемых процедур и функций может
|
||||
осуществляться по имени. Используя МАР-файл, после
|
||||
перекомпиляции проекта VMProtect автоматически определит новые
|
||||
адреса процедур и функций.</li>
|
||||
|
||||
<li>С <a href="use_markers.htm">использованием маркеров</a>,
|
||||
которые вставляются в исходный код приложения. Маркеры
|
||||
представляют собой специальные метки, по которым VMProtect
|
||||
определяет границы защищаемого блока. Также VMProtect
|
||||
поддерживает маркеры с предустановленным типом компиляции.
|
||||
Использование маркеров целесообразно, если следует защитить
|
||||
только часть процедуры или функции. При использовании маркеров
|
||||
можно указать части кода, в которых в дальнейшем можно будет
|
||||
защитить строковые константы.</li>
|
||||
|
||||
<li>По адресам защищаемых процедур в исполняемом файле. По
|
||||
сравнению с предыдущими данный способ менее удобен в
|
||||
использовании, так как при любой доработке программы и,
|
||||
соответственно, ее перекомпиляции будет необходимо определять
|
||||
все адреса повторно. Данный способ рекомендуется лишь для
|
||||
защиты программных продуктов, для которых отсутствуют исходные
|
||||
тексты.</li>
|
||||
</ul>
|
||||
|
||||
<p>Использование MAP-файла для определения границ защищаемого
|
||||
кода имеет еще один важный плюс, который требует отдельного
|
||||
рассмотрения. Почти любая процедура или функция, обладающая
|
||||
локальными переменными или использующая стек для хранения
|
||||
регистров и/или промежуточных результатов вычислений, имеет так
|
||||
называемые пролог и эпилог, находящиеся соответственно в начале и
|
||||
в конце скомпилированной процедуры или функции:</p>
|
||||
<pre class="code">push ebp \
|
||||
mov ebp, esp \ пролог
|
||||
push 00 /
|
||||
push ebx /
|
||||
|
||||
...
|
||||
|
||||
pop ebx \
|
||||
pop ecx \ эпилог
|
||||
pop ebp /
|
||||
ret /
|
||||
</pre>
|
||||
|
||||
<p>Из-за особенностей реализации современных компиляторов маркеры
|
||||
кода никогда не охватывают пролог и эпилог (даже если маркерами
|
||||
будет охвачен весь текст функции CheckPassword, находящийся между
|
||||
begin и end). Для взлома будет достаточно откорректировать пролог
|
||||
функции таким образом, чтобы виртуалированный код не был
|
||||
выполнен. Для функции CheckPassword это можно сделать следующим
|
||||
образом:</p>
|
||||
<pre class="code">mov eax, 1
|
||||
ret
|
||||
</pre>
|
||||
|
||||
<p><strong>Важно:</strong><br />
|
||||
Если для выбора виртуализированных участков кода используется
|
||||
MAP-файл, то пролог и эпилог будут тоже завиртуализированы, что
|
||||
повысит защищенность программы. Более того, если одна
|
||||
виртуализированная функция вызывается из другой
|
||||
виртуализированной функции, то передача управления между ними
|
||||
будет осуществлена без перехода на адрес вызываемой функции
|
||||
(вызов будет представлять собой простой переход на другой адрес
|
||||
байт-кода внутри исполнителя виртуальной машины), что также
|
||||
повысит степень защищенности программы, так как внесенные
|
||||
взломщиком в точку входа корректировки окажутся бесполезными. При
|
||||
работе с виртуализированными функциями передача управления точке
|
||||
входа в завиртуализированную функцию будет осуществлена лишь в
|
||||
случае вызова защищенной функции из незащищенного или
|
||||
промутированного участка кода.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
Reference in New Issue
Block a user