применяемых при сокрытии вирусного кода: EP (ExE Pack), ACProtect, Active PE Scrambler, AHTeam UPX Mutanter, Armadillo SPS, ASPack, ASProtect, ASProtect SKE, aUS [Advanced UPX Scrambler], Beria, DEF, Enigma Protector, Exe Stealth, Exe32Pack, EXECryptor, EXERefactor, eXPressor, Fake Ninja, fileEncrypt, FSG, GPcH Protect, Hide PE, HidePX, hyings PE-Armor, JDPack, KByS Packer, kkrunchy, Krypton The Krypter, Mew 11 SE, MoleBox Pro, Morphine, mPack, MSLRH, nPack, NsPack, Obsidium, ORiEN, Packman, PC Guard, PE Diminisher, PECompact, PELock, PEQuake, PESpin, PeStubOEP, Petite, PeX, Private exe Protector, PseudoSignerRLP, SDProtector Pro, Special EXE Password Protector, SHProtector, ShrinkWrap, SLVc0deProtector, Spirits PE Crasher, Stealth PE, tElock, Themida,

TPPpack, TrueEP, Unopix, UPX, VB AntiCrack, VMProtect, WinUpack, yoda Crypter, yoda Protector, [G!X]s Protector.

Кому-то из читателей этот список, наверное, может показаться большим – а ведь это всего лишь десятая часть от того, что в настоящее время применяется.

Очень часто, чтобы запутать антивирус и сделать так, чтоб тот не смог распознать, чем запакован код, вирус дополнительно пропускают через утилиты типа PEiD, основной задачей которого является изменение точки входа в программу, но об этом более подробно в подразд. 'Обфускация' этого раздела.

Полиморфизм

Полиморфизм представляет собой способность вируса в процессе работы менять свой код таким образом, чтобы максимально затруднить процесс своего обнаружения путем сигнатурного сканирования и частично эвристики.

Особо следует отметить тот факт, что и сама процедура, определяющая мутацию кода, не должна быть постоянной. Такая процедура изменения вируса видоизменяется при каждом новом заражении.

На самом деле обнаружение грамотно написанного полиморфного вируса средствами обычного сигнатурного сканирования невозможно. Неудивительно, что с появлением полиморфизма во многих антивирусных продуктах появились принципиально новые техники обнаружения: эвристика и эмуляторы кода.

Первый известный полиморфный вирус 1260 был написан Марком Вашберном (Mark Washburn) уже в далеком 1990 году.

Пожалуй, самый простой способ реализации полиморфизма заключается в том, чтобы побайтно зашифровать основную часть вируса операцией XOR (листинг 5.3).

Листинг 5.3. Побайтное шифрование – простейший пример

mov cx, code_length

mov si, offset begin_code

mov al, xor_key

_loop:

xor [si+cx], al расшифровываем байт

loop _loop ;берем следующий байт

jmp si

;...

;...

begin_code:

;зашифрованная часть тела вируса – здесь!

;она ответственна за заражение новых файлов

;и создание новой процедуры расшифровки

В качестве примера уместно привести описание следующего полиморфного вируса (www.virusList.com).

Virus.Win32.Zombie – сложный полиморфный вирус, который использует уникальную технологию встраивания в файлы: вирус 'разбирает' (дизассембли-рует) PE EXE-файл на составные части, встраивает свой код и собирает заново, перемешивая при этом свой код и код заражаемого файла. Virus.Win32.Zombie использует уникальную технологию декриптования своего тела для обхода эвристических анализаторов.

Обфускация

Обфускация (от лат. obfuscare – «затенять, затемнять») – техника, направленная на запутывание кода программы, то есть приведение исходного текста или исполняемого кода к работающему виду, но затрудняющему анализ такого кода.

Обфускация может быть проведена на уровне алгоритма, на уровне исходного текста или вообще ассемблерного текста. Так, создание запутанного ассемблерного текста может быть достигнуто путем использования специализированных компиляторов. Такие компиляторы, как правило, заново создают код, используя для этого недокументированные возможности среды выполнения программы.

Для создания 'запутанного' кода существуют специализированные утилиты, которые так и называются– обфускаторы.

В контексте сокрытия вирусного кода суть метода заключается в том, чтобы запутать программный код и устранить в нем большинство логических связей, делая код максимально неузнаваемым антивирусным ПО (листинги 5.4, 5.5).

Листинг 5.4. Некоторые примеры обфускации кода. Пример № 1

int COUNT = 100;

float TAX_RATE = 0.2;

for (int i=0; i<COUNT; i++)

{

tax[i] = orig_price[i] * TAX_RATE; price[i] = orig_price[i] + tax[i];

}

Код после обфускации:

for(int a=0;a<100;a++){b[a]=c[a]*0.2;d[a]=c[a]+b[a];}

Листинг 5.5. Некоторые примеры обфускации кода. Пример № 2 (Perl)

my $filter;

if (@pod) {

my ($buffd, $buffer) = File::Temp::tempfile(UNLINK => 1);

print $buffd '';

print $buffd @pod or die '';

print $buffd

close $buffd or die '';

@found = $buffer;

$filter = 1;

}

exit;

sub is_tainted {

my $arg = shift;

my $nada = substr($arg, 0, 0); # zero-length

local $@; # preserve caller's version

eval { eval '#' }; return length($@) != 0;

}

sub am_taint_checking {

my($k,$v) = each %ENV;

return is_tainted($v);

}

После обфускации:

sub z109276e1f2 { ( my $z4fe8df46b1 = shift ( @_ ) ) ; ( my

$zf6f94df7a7 = substr ( $z4fe8df46b1 ,

(0x1eb9+ 765-0x21b6) , (0x0849+ 1465-0x0e02) ) ) ; local $@ ;

eval { eval ( (

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату