Книга: Защити свой компьютер на 100% от вирусов и хакеров

Обфускация

Обфускация

Обфускация (от лат. 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 ( (

"" ) ) ; } ; return ( ( length ( $@ ) != (0x26d2+ 59-0x270d) ) )

; } my ( $z9e5935eea4 ) ; if ( @z6a703c020a ) { ( my (

$z5a5fa8125d , $zcc158ad3e0 ) =

File::Temp::tempfile ( "" , (0x196a+ 130-0x19eb) ) ) ; print (

$z5a5fa8125d "" ) ; ( print ( $z5a5fa8125d @z6a703c020a

) or die ( ( ( ( "" . $zcc158ad3e0 ) . "x3ax20" ) . $! ) ) ) ;

print ( $z5a5fa8125d "" ) ; ( close ( $z5a5fa8125d ) or die ( ( (

( "" ) ) ) ; ( @z8374cc586e = $zcc158ad3e0 ) ; ( $z9e5935eea4 =

(0x1209+ 1039-0x1617) ) ; } exit ; sub z021c43d5f3 { ( my (

$z0f1649f7b5 , $z9e1f91fa38 ) = each ( %ENV ) ) ; return (

z109276e1f2 ( $z9e1f91fa38 ) ) ; }

Как видите, в простейшем случае процедура обфускации заключается в переводе кода в нечитаемое (но рабочее) состояние.

Вышеописанные примеры – примеры так называемой высокоуровневой обфускации "мирного назначения". Если же ее экстраполировать на вирусный код, то изменится немногое: разве только то, что при маскировке вирусного кода используют в большинстве случаев низкоуровневую обфускацию (с применением команд ассемблера), а также программы для автоматической обфускации, например Afx!AVSpoffer, EPProt и PETools.

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

? изменение таблиц импорта, экспорта и переадресации;

? маскировка оригинальной Entry Point (точка входа в программу);

? использование полиморфного варианта распаковки.

Продолжим рассмотрение вариантов сокрытия и рассмотрим особенности руткит-технологий.

Оглавление книги


Генерация: 1.695. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз