mirror of
https://github.com/Obfuscator-Collections/VMProtect.git
synced 2024-12-27 08:49:27 +03:00
138 lines
8.0 KiB
HTML
138 lines
8.0 KiB
HTML
|
<!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>
|