81 lines
4.3 KiB
HTML
81 lines
4.3 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>
|
|||
|
</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>
|