Віруси: виявлення зараження

Проведемо аналогії

Напевно, вже всі чули про такий об’єкт, як комп’ютерний вірус. Що ж являє собою ця субстанція і від куди пішла ця назва? Термін «вірус» прийшов до нас з біології і медицини. Біологічний вірус це неповноцінний організм, що складається з нуклеїнової кислоти (ДНК або РНК, тобто генетичного коду) і захисної білкової оболонки, що дозволяє існувати вірусу в закапсулированном стані. Біологічний вірус оживає лише тоді, коли потрапляє в клітину живого організму і вбудовує свій генетичний код в вихідний. Комп’ютерний вірус діє темі ж методами. І так.

Комп’ютерний вірус це шматок коду (не програма, а лише код), який здатний вбудовуватися в код якої-небудь програми, там самим оживаючи і заражаючи інші програми. Як і у випадку біологічного вірусу, коли хвора людина небезпечний здорового, заражена програма небезпечна для інших програм, оскільки з її допомогою вірус може заражати. При цьому в більшості випадків заражена програма цілком працездатна, а не рідко й не можливо відрізнити від «здорової».

Чим раніше міністерство охорони здоров’я виявить вірусну епідемію, тим м’якше будуть наслідки і тим швидше можна буде локалізувати осередок зараження і позбутися від зарази. Теж саме відбувається і у світі програм. Чим раніше буде виявлено зараження, тим менша кількість програм виявляться «хворими» і тим простіше буде вилікувати комп’ютер. Про свою хворобу першим дізнається сам хворий і тільки він може першим виявити початок епідемії. Так чому б самим програмами не повідомляти нам про своє зараження? Адже присутність вірусу в системі починає відчуватися тоді, коли вже половина всіх програм заражені, а до цього все списується на дрібні глюки.

Як же програма зрозуміє, що вона «хвора»? Повернемося до біології: біологічний вірус вбудовується свій генетичний код в код жертви, тим самим змінюючи його структуру. Комп’ютерний вірус надходить також. А зміни можуть виникнути наступні: код стане довшим або коротшим вихідного; код не змінить свого розміру, але зміниться сам.

Теорія виявлення зараження

Програма повинна сама після запуску провести перевірку свого коду на наявність пошкодження (зараження) і в разі виявлення змін видати попереджуюче повідомлення. Якщо так будуть надходити всі програми, то потрапив в систему вірус буде одразу виявлений, після чого користувач комп’ютера, скориставшись антивірусними програмами, позбудеться від нього. Прийшли до наступного: програма лише виявляє своє зараження, навіть не намагаючись самолечиться; але цього достатньо для своєчасного виявлення зарази.

Як же програма зможе зрозуміти, що її код змінився? Звичайно можна зберігати другу копію коду програми у файлі з іншим ім’ям і порівнювати після запуску, але це не економічно і не ефективно. Насправді достатньо зберігати лише розмір і контрольну суму (число, рівне сумі всіх байт коду програми). Ці дані можуть міститися в окремому файлі і поширюватися разом із самою програмою. Важливо, що б генерація цього файлу проходила тільки для «здорової» програми, попередньо перевірених антивірусом.

Може виникнути питання, а що якщо з’являться нові віруси, здатні змінювати не тільки код самої програми, але і дані контрольного файлу? Так, це можливо. Але можна діяти не за одним шаблоном. Наприклад, у кожному конкретному випадку використовувати різні функції підрахунку контрольної суми, що не дозволить вірусу коректно налаштувати значення під себе. В результаті цей метод дасть можливість виявити як мінімум 99% вірусів.

Практична реалізація

Основна мета, яку я перед собою поставив: домогтися максимальної простоти зміни тексту програми для додавання контролю зараження. У підсумку все звелося до одного модуля, экспортирующему всього одну функцію. Відразу наведу текст цього модуля:

Code:

unit antivirus;

{*******************************************************************************

* Модуль антивірусного захисту програми: ВИЯВЛЕННЯ ЗАРАЖЕННЯ *

* © Акатов Олексій, 2004 рік. *

* aka-alex.narod.ru *

*******************************************************************************}

interface

uses windows, sysutils;

function detection: boolean;

implementation

const infection = ‘Програма заражена вірусом або була пошкоджена.’#10#13 +

‘Проведіть повну перевірку комп’ютера антивірусною програмою!’;

absence = ‘Помилка звернення до контрольного файлу.’#10#13 +

‘Створений новий контрольний файл.’#10#13 +

‘Можливо наявність вірусу в системі!’;

caption = ‘Антивірус’;

controlext = ‘.cts’;

var detect: boolean;

function detection: boolean;

// Результат перевірки:

begin

result := detect;

end; {func detection}

procedure scanner;

// Перевірка зараження:

var controlname: string;

programname: string;

fw: file of longword;

buf: array[1..1024] of byte;

h, i, s: integer;

oldsize, oldsum: longword;

size, sum: longword;

begin

detect := true;

programname := paramstr (0);

controlname := changefileext (programname, controlext);

// Підрахунок контрольної суми і розміру програми:

h := fileopen (programname, fmopenread or fmsharedenywrite);

size := getfilesize (h, nil);

sum := 0;

for i := 1 to do 1024

buf[i] := 0;

repeat

s := fileread (h, buf, 1024);

for i := 1 to s do

inc (sum, buf[i]);

until s < 1024;

fileclose (h);

// Зчитування старих значень:

assignfile (fw, controlname);

{$i-}

reset (fw);

read (fw, oldsize, oldsum);

closefile (fw);

{$i+}

// Перевірка результату:

if ioresult 0 then

begin

rewrite (fw);

write (fw, size, sum);

closefile (fw);

messagebox (0, absence, caption, mb_iconwarning + mb_ok);

end else

if (size oldsize) or (sum oldsum)

then messagebox (0, infection, caption, mb_iconwarning + mb_ok)

else detect := false;

end; {proc scanner}

initialization

scanner;

end.

Розпишу алгоритм, за яким можна досягти бажаного результату:
завершити роботу над програмою;
додати до проекту модуль antivirus, скопіювавши його від сюди;
прописати модуль antivirus в розділі uses модулі, що описує головну форму програми;
відкомпілювати програму (ctrl + f9), але не запускати;
перевірити отриманий exe-файл антивірусом;
якщо він «здоровий», запустити його, в підсумку, з видачею відповідного повідомлення, буде створений контрольний файл: “.cts”;
можна поширювати програму разом із контрольним файлом.

Модуль працює за наступним принципом. Після одержання управління перевіряється наявність контрольного файлу. Якщо він відсутній, то створюється новий, куди записуються розмір програми і контрольна сума. Якщо контрольний файл є, то з нього зчитуються дані, записані при його створенні і порівнюються з даними, отриманими при поточної генерації. Якщо старі значення відрізняються від нових, то видається попередження про можливе зараження.

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

if detection then application.terminate;

У такому варіанті у разі зараження після запуску програми буде видано попередження, після чого програма закриється.

Важливо підключати модуль antivirus тільки коли розробка програми вже завершена і проводиться остання компіляція, т. к. при новій компіляції контрольна суми виявиться вже інший. Якщо все ж необхідно перекомпілювати проект, то треба просто видалити контрольний файл і після чергової компіляції створити його знову (що станеться автоматично).

У висновку: рада розробникам корпорації microsoft

Як відомо, більшість програм запускається не безпосередньо, а через ярлики. У такому разі подібну антивірусний захист можна було б реалізувати і на цьому рівні. Достатньо було б у ярлику зберігати інформацію про розмірі файлу і контрольну суму. А потім, якщо ярлик посилається на програму (тобто на exe-файл, т. к. для інших типів файлів це не потрібно), то автоматично перевіряти ці значення і в разі розбіжності видавати попередження, до того ж не виробляючи запуск підозрілої програми. Такий контроль був би дуже ефективний і будь-який вірус відразу ж був би виявлений навіть без антивірусних програм.

Автор: Олексій Акатов
Джерело: aka-alex.narod.ru

Сайт опублікував цю статтю людини www.cyber-strigalev.ucoz.ru