Обфускация

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

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

Для создания «запутанного» кода существуют специализированные утилиты, которые так и называются– обфускаторы. В контексте сокрытия вирусного кода суть метода заключается в том, чтобы запутать программный код и устранить в нем большинство логических связей, делая код максимально неузнаваемым антивирусным ПО .

Некоторые примеры обфускации кода. Пример № 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];

Некоторые примеры обфускации кода. Пример № 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) , (0×0849+ 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 ) . «\x3a\x20» ) . $! ) ) ) ;
print ( $z5a5fa8125d "" ) ; ( close ( $z5a5fa8125d ) or die ( ( ( ( "" ) ) ) ; ( @z8374cc586e = $zcc158ad3e0 ) ; ( $z9e5935eea4 = (0×1209+ 1039-0×1617) ) ; } exit ; sub z021c43d5f3 { ( my ( $z0f1649f7b5 , $z9e1f91fa38 ) = each ( %ENV ) ) ; return ( z109276e1f2 ( $z9e1f91fa38 ) ) ; }

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

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

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

? изменение таблиц импорта, экспорта и переадресации;
? маскировка оригинальной Entry Point (точка входа в программу);
? использование полиморфного варианта распаковки.

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

Яндекс.Метрика