Nothing found for Www Liveinternet Ru Click
Популярные товары:

uinC: Мікстура проти чиїхось а чи Слідами "Чорнобильського" вірусу

  1. Мікстура проти чиїхось а або Слідами "Чорнобильського" вірусу

Мікстура проти чиїхось а
або
Слідами "Чорнобильського" вірусу

Зрештою містер Коберман мало відрізнявся від тих курчат,
яких патрали, а потім зашивали бабуся.
Р. Бредбері. Мешканець з верхньої кімнати.

ВСТУП

Ось уже кілька років минуло після пам'ятної дати 26 квітня 1999 року, коли сотні тисяч (а, може бути, і мільйони) комп'ютерів у всьому світі відразу були перетворені "Чорнобильським" вірусом в непрацездатні купи металів і напівпровідників. Але чи багато хто витягли з цієї події дійсно корисні уроки?

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

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

Ця стаття для тих, хто хоче побачити на власні очі і помацати власними руками, що собою являє "Чорнобильський" вірус (офіційне найменування - Win95.CIH), і чого варто чекати від декількох десятків вірусів, які вже написані, і які продовжують створюватися вірусопісателямі- плагіаторами по його образом і подобою.

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

МІФ ПРО "чорнобильських" вірус

Жив собі, і вчився в одному з університетів острова Тайвань молода людина на ім'я Чен Інг Хау. Одного разу захотілося йому написати комп'ютерний вірус. Невідомо, який він був студент, але програміст -дуже хороший. Чен Інг Хау вмів писати 32-розрядні Windows-додатки на мові асемблера, до того ж він десь якось отримав доступ до недокументованим подробиць будови MS Windows 95. (Не схоже, що він сам все "расхакал" - надто вже глибоко лежать в надрах операційної системи використані ним "секрети", так що для доступу до них "котлован рити" треба, а не "свердловину бурити"). Сказано зроблено. Всю весну 1998 р Чен Інг Хау наполегливо працював, і вірус у нього вийшов на славу: компактний, раціонально написаний і ретельно налагоджений. Настільки ретельно, що на зараженій машині був практично непомітний. Засмутився Чен Інг Хау: хто ж на вірус увагу зверне, хто ж його автора згадаєте незлим тихим словом? Засмутився ... і вставив в вірус фрагмент, який дві речі робить: 26 апреля Flash-BIOS комп'ютера стирає, а на додачу ще й великі області вінчестера (в тому числі і системні) "сміттям" заповнює.

Потім Чен Інг Хау похвалився цим вірусом перед своїми друзями, які самі такі речі писати не вміли, зате протягом травня місяця 1998 р швидко поширили вірус по машинам всього університету. Начальство університету провело "службове розслідування", виявило автора і за дві секунди відрахувало його зі студентів. А тут до нього відразу і повістка з військкомату прийшла, і відправився Чен Інг Хау в доблесні збройні сили острова Тайвань чистити зубною щіткою тайванські сортири, прати тайванським дідам тайванські онучі і робити все інше, що належить тайванським солдатам по тайваньському Статуту.

А вірус пішов далі, і виявився в Інтернеті, на сайтах, що містять різні корисні утиліти. Ймовірно, свої пустотливі рученята до цього доклали друзі Чен Інг Хау, а також друзі цих друзів. Цей факт практично відразу, на початку літа, відзначили всі антивірусні компанії світу, випустивши попереджають прес-релізи та оновлення антивірусних баз. Але місяць йшов за місяцем, вірус тихо і непомітно розповзався по світу, нічого не вибухало, а користувачі зазвичай завжди плюють на всякі там прес-релізи і ніколи не запускають свої НортонАнтівіруси і ДокторСоломони, поки їх смажений півень НЕ клюне в одне місце. Дійшло до того, що восени 1998 р мало не кожен другий CD, виготовлений нашими вітчизняними комп'ютерними піратами, містив програми, заражені вірусом Win95.CIH.

Час розплати настав 26 квітня 1999 р Комп'ютерний світ здригнувся ... але було вже пізно.

А Чен Інг Хау перевели з тайванською казарми в тайванську камеру. Кілька місяців він "парився на кіче", його допитували і місцеві тайванські "копи", і заїжджі з Америки "феди" ... Потім був суд, на якому з'ясувалося, що конкретно на острові Тайвань комп'ютерів постраждало не дуже багато, і тому садити автора на кшталт б як і нема за що. Чен Інг Хау виявився кимось на зразок національного героя і отримав пропозиції від низки великих тайваньських фірм зайнятися цікавою високооплачуваною роботою.

Пройшли роки. Але тисячі лазерних дисків із зараженими іграшками і софтом і раніше лежать на поличках у користувачів і програмістів. Вихідні тексти вірусу легко знайти в Інтернеті. Чи не кожен другий знову написаний комп'ютерний вірус, призначений для зараження Windows-програм, містить готові шматки коду, без особливих роздумів і часом навіть без розуміння сенсу "видерті" з Win95.CIH.

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

Як досліджувати алгоритм РОБОТИ ВІРУСУ?

Поставимо простий експеримент: запустимо в своїй системі програму, заражену вірусом Win95.CIH.1003. Саме ця модифікація вірусу привільно "гуляла" по нашій країні в 1998-99 рр. Попрацюємо деякий час в цій системі, і антивірусний сканер повідомить, що "зараза" вже "пустила коріння". В першу чергу заражаються службові програми RUNDLL32.EXE (якщо ми запускали Windows-програми) і START.EXE (якщо ми запускали DOS-програми), а також більшість прикладних програм і утиліт, з якими ми працювали.

Як об'єкт для "патолого-анатомічних" експериментів візьмемо файл NOTEPAD.EXE довжиною 57344 байтів.

Кращий дизассемблер Windows-програм на даний момент - IDA PRO від Ilfak Guilfanov. Але дуже багато користі може принести і звичайний Hacker View (HIEW) Євгенія Суслікова aka SEH. Трасувати фрагменти коду найкраще за допомогою NuMega WinIce.

Отже ... Сестра, скальпель!

ЯК ВІРУС впроваджувати в ПРОГРАМИ?

Довжина файлу NOTEPAD.EXE після зараження залишилася колишньою, але антивірус повідомляє, що всередині ховається Win95.CIH. "Напустити" на заражену програму HIEW. Порівнюючи два файли, заражений і здоровий, нескладно виявити, що частина фрагментів, які в здоровому файлі були порожні (містили нульові коди), в зараженому файлі виявилися заповненими чимось незрозумілим. Висновок однозначний: вірус записався в невикористовувані фрагменти EXE-файлу, завдяки чому і не відбулося зміни його (файлу) довжини.

Цікаво розібратися, що це за невикористовувані фрагменти, і чому вони присутні в EXE-файлі.

Довідка. Windows-програма PE-формату є набором секцій (їх ще називають "сегментами" або "об'єктами").

Найперша за рахунком секція - не справжня, це "псевдосекція". Вона не має імені і містить заголовки і налагоджувальні таблиці PE-програми. У цій секції спочатку розміщується звичайний заголовок EXE-програми, що починається з байтів 'MZ'. По зсуву 3Ch в цьому заголовку зберігається адреса специфічного заголовка PE-програми, що починається з байтів 'PE'. Десь між цими двома заголовками лежить код крихітної програми, вміє виводити повідомлення "This program can not run in Ms-Dos mode". Ось найважливіші для нас поля PE-заголовка:

Поле Зсув Довжина Призначення Magic +00 4 Сигнатура 'PE \ 0 \ 0' (0x00004550) NumberOfSections +06 2 Кількість секцій (без "псевдосекціі") SizeOfOptionalHeader + 14h 2 Розмір змінної частини заголовка AddressOfEntryPoint + 28h 4 Зсув точки входу в програму ImageBase + 34h 4 Базова адреса завантаження програми SectionAlignment + 38h 4 Розмір блоку в пам'яті FileAlignment + 3Ch 4 Розмір блоку на диску

Структура цього заголовка описана під ім'ям _IMAGE_OPTIONAL_HEADER в файлі WINNT.H, який можна виявити в складі таких продуктів, як Borland C / C ++ v5.0, Microsoft Visual C / C ++, Microsoft Windows 9X / NT / 2000 / XP DDK і ін.

Всі секції (в тому числі і "псевдосекція" заголовків) присутні і в програмному файлі, і в пам'яті, причому розташовуються в одному і тому ж порядку. Відмінність тільки в тому, що кожна секція (в тому числі і "псевдосекція" заголовків) займає ціле число блоків певної довжини, а розмір цих блоків в загальному випадку різний для випадку файлу (див. Поле FileAlignment, часто його значення дорівнює 512) і для випадку пам'яті (див. поле SecionAlignment, часто його значення дорівнює 4096). Найперша за рахунком секція (це "псевдосекція" заголовків) при завантаженні в пам'ять отримає лінійний адресу ImageBase (часто його значення дорівнює 400000h). Зсув першої виконуваної команди програми щодо ImageBase зберігається в поле AddressOfEntryPoint.

Всі секції (крім "псевдосекціі" заголовків) мають імена. Програмний код, як правило, зберігається в секції з ім'ям .text або CODE. Області змінних розміщуються в секціях .data або DATA. Під текстові та строкові константи зазвичай відводиться секція .idata, під ресурси Windows-додатки - секція .rsrc і т.п. Відразу після PE-заголовка (який складається з постійної частини довжиною 0x18 байтів і змінної частини довжиною SizeOfOptionalHeader байтів) розміщується таблиця опису всіх секцій (крім "псевдосекціі" заголовків). Вона містить NumberOfSections записів наступної структури:

Поле зміщені. Довжина Призначення Name + 00h 8 Символьне ім'я секції VirtualSize + 0Сh 4 Реальна кількість інформації в секції VirtualAddress + 10h 4 Зсув секції в пам'яті від ImageBase SizeOfRawData + 14h 4 Розмір, зарезервований для секції на диску PointerToRawData + 18h 4 Зсув секції від початку файлу Characteristics + 20h 4 Прапори властивостей секції

Детальніше з цією структурою можна також ознайомитися, зазирнувши в файл WINNT.H, там вона розташовується під ім'ям _IMAGE_SECTION_HEADER.

Зазвичай SizeOfRawData - це "круглий" число, кратне значенню FileAlignment (часто це 512 байтів), а значення поля VirtualSize - число "не круглий", що характеризує реальну довжину секції. Значить, між реальним кінцем області, що містить "корисні" байти вмісту секції, і кінцем фрагмента дискової пам'яті, зарезервованим за цією секцією, зазвичай присутній невикористаний "зазор", величина якого може варіюватися від 1 до 511 байтів.

Продовжуючи дивитися на NOTEPAD.EXE за допомогою HIEW, натиснемо клавішу F8. Це дозволить побачити вміст полів специфічного PE-заголовка зараженої програми. Слідом за цим натиснемо F6 і ознайомимося з таблицею програмних секцій. Порівнюючи два файли, заражений і незаражений, можна легко побачити, що:

1) в PE-заголовку змінилося значення поля AddressOfEntryPoint:

Було Стало AddressOfEntryPoint 0x10CC 0x270

2) в таблиці секцій збільшилися до межі значення полів VirtualSize для перших двох секцій:

VirtualSize

SizeOfRawData

Було Стало Було Стало .text 0x3E9C 0x4000 0x4000 0x4000 .data 0x84C 0x1000 0x1000 0x1000

Графічно зміни, що відбулися можна зобразити так:

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

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

В ЯКИХ ОПЕРАЦІЙНИХ СИСТЕМАХ ВІРУС ЖИВЕ?

У своїй роботі вірус використовує ряд в общем-то документованих, але маловідомих особливостей функціонування Windows.

Довідка. Кожному запущеному на виконання потоку Windows ставить у відповідність структуру даних під назвою TIB (Thread Information Block - блок інформації про потік). Друге чотирьохбайтове поле в цій структурі є лінійною адресою поточного SEH (Structured Exception Handler - структурованого обробника винятків), а перше - адресою наступного в довгому ланцюжку аналогічних же оброблювачів. Обробники активуються в момент виникнення виняткових ситуацій (наприклад, якщо програма спробує виконати неприпустиму команду або звернутися в "заборонений" район пам'яті).

У момент запуску потоку структура TIB доступна за адресою FS: [0].

Для того, щоб відповісти на питання про "ареалі" поширення вірусу, потрібно аналізувати код і уважно дослідити його початок (перші кілька десятків байтів, на які вказує AddressOfEntryPoint). Ось як виглядає цей фрагмент:

push ebp lea eax, [esp-0008] xor ebx, ebx xchg eax, fs: [ebx] call $ + 5 pop ebx lea ecx, [ebx + 00042]; Адреса нового SEH push ecx push eax

Після його виконання район пам'яті, в якому розташований стек, буде містити наступні дані:

Зсув Значення Примітка ESP Ebp ESP-4 Адреса старого SEH ESP-8 Адреса нового SEH Сюди вказує FS: [0]

Оскільки стек "росте вниз", то досить перегорнути цю табличку "догори дригом" і побачити, що фрагмент стековой пам'яті, що починається з адреси [esp + 8], по їх вмісту дуже нагадує початок якоїсь TIB. Все правильно, саме в цій ролі він надалі і буде використовуватися!

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

Отже, перш за все CIH бере на себе обробку виняткових ситуацій. Навіщо? Справа в тому, що безпосередньо слідом за цим він намагається модифікувати системну IDT (Interrupt Descriptor Table - таблицю дескрипторів переривань) для того, щоб взяти на себе також ще і обробку переривання номер 3.

push eax sidt [esp-0002]; Адреса IDT - в стек pop ebx add ebx, 01C cli; Дескриптор 6-байтовий, і модифікується він по частинах mov ebp, [ebx] mov bp, [ebx-0004]; Виконується адресація на новий обробник lea esi, [ecx + 00012] push esi; Чи вписується 1-я половина адреси mov [ebx-0004], si shr esi, 010; Потім друга mov [ebx + 00002], si pop esi

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

Але спрацює цей прийом тільки в Windows 95/98 / ME. А в операційних системах сімейства Windows NT / 2000 виникне виняткова ситуація. Ось для чого вірус перехоплював обробник виключень - щоб заражена програма при запуску з-під NT перестав вилітала, а коректно продовжувала свою роботу!

Отже, заражена вірусом програма буде коректно працювати в будь-якій операційній системі, але розмножуватися (тобто заражати інші програми) вірус здатний тільки в Windows 9X.

ЯК ВІРУС ПОВЕРТАЄ УПРАВЛІННЯ заражені програми?

Фрагмент повернення управління зараженої програмі слід шукати в вірусному обработчике винятків. Ось він:

; Старий SEH повертається на колишнє місце xor ebx, ebx mov eax, fs: [ebx] mov esp, [eax] pop fs: [ebx] pop eax pop ebp; Повернення управління зараженої програмі! push 00040278C retn

Неважко здогадатися, що 040278Сh - це і є збережене всередині вірусу значення старої точки входу в програму! Досить вилучити з нього значення поля ImageBase і помістити на своє "законне" місце в поле AdressOfEntryPoint. І вірус, формально залишившись всередині програми, ніколи більше не отримає управління!

Звернемо увагу, що "заповітне" подвійне слово лежить по зміщенню + 5Eh щодо точки входу в вірус. Власне кажучи, тепер ми вже можемо написати свій власний антивірус. Але відновивши точку входу, ми тільки знешкоджуватимемо вірус. Ряд антивірусів (наприклад, "Антивірус Касперського" з підключеною базою CIH-TRACE.AVC) здатні виявляти такий "вбитий", але "не похований" Win.CIH і влаштовувати з цього приводу невеликий "скандал".

Крім того, підступні звички "зарази" вивчені ще не до кінця. Тому продовжимо аналіз.

ЯК ВІРУС ШУКАЄ ЦІЛІ ДЛЯ ЗАРАЖЕННЯ?

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

"Стеження" за запускаються програмами він здійснює за допомогою "секретного", дуже скупо документованого фірмою Microsoft механізму звернень до глибинних компонентів ядра операційної системи - до VMM (Virtual Memory Manager - менеджеру віртуальних машин) і до драйверів віртуальних пристроїв.

Довідка. Звернення до компонентів ядра Windows 9X (яке зазвичай виконується не з прикладних програм, але з системних DLL) виглядають наступним чином:

int 20h dw? ; Номер функції dw? ; Код компонента, наприклад: 1 VMM, 40h - IFSMgr, тощо.

Необхідні параметри виклику при цьому передаються через стек.

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

Цей код не є реєнтерабельним, оскільки ядро ​​Windows в процесі виконання подібного запиту спотворює кілька байтів в точці, в яку передбачається повернення управління. Для системних DLL це несуттєво, а перед вірусами (вірніше, перед їх авторами) постає ряд складних проблем з відновлення початкового коду.

Звернення прикладних і системних програм до файлової системи обслуговуються компонентом ядра під назвою IFSMgr (Installed File System Manager - менеджер инсталлированной файлової системи), всі ці звернення кодуються числом 40h. Серед кількох десятків сервісних функцій цього компонента цікаво виділити:

  • функцію з номером 67h - InstallFileSystemApiHook ( "засекречений" фірмою Microsoft виклик "Замінити обробник звернень до IFSMgr");
  • функцію з номером 32h - Ring0_FileIO (виклик "Файлові операції введення-виведення" - відкрити, закрити, записати та ін).

Доступ до вищеописаним механізмам можливий тільки з нульового кільця захисту.

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

; Оброблювач вже зайнятий зараженням будь-якого файлу? Test [esi], 001 Jne SkipInf; Перевірка стекових параметрів виклику lea ebx, [esp + 00028] cmp [ebx], 024; Відкриття файлу? jne SkipInf; Зараження ... SkipInf:

Все це дуже схоже на перехоплення якимось старовинним саморозміщувані вірусом переривання 21h, тільки відбувається тепер уже в 32-бітової багатозадачному середовищі Windows.

ЯК ВІРУС ВІДРІЗНЯЄ ВЖЕ заражені програми?

Ось маленький фрагмент вірусної процедури, яка виконує зараження PE-файла:

Xor eax, eax Mov ah, 0D6; Код операції читання Mov ebp, eax Xor ecx, ecx Mov cl, 004; Кількість байтів Xor edx, edx Mov dl, 03C; Зсув у файлі Call edi; Читати Mov edx, [esi] Dec edx; Зсув-1

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

Тому програму, заражену вірусом CIH, доцільно не відновлювати повністю в початковому вигляді, але залишити на своєму місці хоча б ознака зараженості. Наступного разу вірус цю програму не зачепить.

ЯК НАПИСАТИ СВІЙ АНТИВІРУС?

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

Table: Dd 0; Ознака кінця таблички Dd 000000F7h; Довжина в секції .data Dd 0040584Ch; Позиція в секції .data Dd 00000164h; Довжина в секції .text Dd 00404E9Ch; Позиція в секції .text Dd 00000190h; Довжина в псевдосекціі заголовків; Точка входу в вірус Start: Push ebp ...

Переконаємося, що вірус дійсно читає і використовує цю табличку в зворотному порядку:

Lea eax, [esi-Start]; Адреса початку таблички ... mov esi, eax More: Mov ecx, [eax-0004]; Чергова довжина Repe movsb Sub eax, 008; Адреса чергового "шматочка" Mov esi, [eax] Or esi, esi; Кінець таблички? Je Enough Jmps More

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

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

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

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

/ * Компілювати, наприклад, в BC / C ++ 5.0 * / #include <stdio.h> #include <winnt.h> #define SLEN 8 #define OK 0 #define BAD 1 IMAGE_NT_HEADERS32 pe; IMAGE_DOS_HEADER mz; IMAGE_SECTION_HEADER sh; / * "Проверялка" для Win95.CIH. © Климентьєв К., Самара 2001 * / int CheckCIH (char * filename) {int f, i; char buf [SLEN]; char Sign [SLEN] = {0x55, 0x8D, 0x44, 0x24, 0xF8, 0x33, 0xDB, 0x64}; f = open (filename, O_RDONLY | O_BINARY); read (f, & mz, sizeof (IMAGE_DOS_HEADER)); if ((mz.e_magic == 0x5A4D) && (mz.e_lfarlc> = 0x40)) {lseek (f, mz.e_lfanew, SEEK_SET); read (f, & pe, sizeof (IMAGE_NT_HEADERS32)); if (pe.Signature == 0x4550) {lseek (f, pe.OptionalHeader.AddressOfEntryPoint, SEEK_SET); read (f, buf, SLEN); close (f); for (i = 0; i <SLEN; i ++) if (buf [i]! = Sign [i]) return OK; return BAD; }} Close (f); return OK; }

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

/ * "Лечілку" для Win95.CIH. © Климентьєв К., Самара 2001 * / CureCIH (char * filename) {Int f, i, k; Unsigned char c = '*'; DWORD l, p, e, tmp; F = open (filename, O_RDWR | O_BINARY); / * Відновлення старої точки входу * / lseek (f, pe.OptionalHeader.AddressOfEntryPoint + 0x5E, SEEK_SET); read (f, & e, 4); e - = pe.OptionalHeader.ImageBase; lseek (f, mz.e_lfanew + 0x28, SEEK_SET); write (f, & e, 4); / * Видалення вірусу з області заголовків * / lseek (f, pe.OptionalHeader.AddressOfEntryPoint-4, SEEK_SET); read (f, & l, 4); lseek (f, pe.OptionalHeader.AddressOfEntryPoint, SEEK_SET); for (k = 0; k <(int) l; k ++) write (f, & c, 1); / * Видалення фрагментів вірусу з секцій * / tmp = pe.OptionalHeader.AddressOfEntryPoint-12; while (1) {/ * Читання таблички опису вірусних фрагментів * / lseek (f, tmp, SEEK_SET); tmp- = 8; read (f, & l, 4); / * Довжина фрагмента * / read (f, & p, 4); / * Позиція фрагмента в пам'яті * / if (! P) goto finish; p - = pe.OptionalHeader.ImageBase; / * Сканування таблиці секцій * / lseek (f, mz.e_lfanew + 0x18 + pe.FileHeader.SizeOfOptionalHeader, SEEK_SET); for (i = 0; i <pe.FileHeader.NumberOfSections; i ++) {read (f, & sh, sizeof (IMAGE_SECTION_HEADER)); if ((p> sh.VirtualAddress) && (p <sh.VirtualAddress + sh.Misc.VirtualSize)) {lseek (f, sh.PointerToRawData + (p-sh.VirtualAddress), SEEK_SET); for (k = 0; k <(int) l; k ++) write (f, & c, 1); goto done; }} Done :; } Finish: close (f); }

Ці дві процедури, CureCIH () і CheckCIH () повинні викликатися з якоїсь програми приблизно ось в такому стилі:

If (CheckCIH (filename) == BAD) CureCIH (filename);

Напишіть програму, що обходить дерево дискових каталогів і перевіряє всі зустрінуті EXE-файли, самостійно. Це дуже просто. Ось і все, антивірус для знаменитого "Чорнобильського" вірусу готовий!

ВИСНОВОК

Отже, представники "електронної мікрофауни" зовсім не такі складні і незрозумілі, як могло б здатися на перший погляд. Більш того, не всі автори вірусів настільки допитливі і працелюбні, як Чен Інг Хау: багато вірусів, в тому числі і найсучасніші, влаштовані набагато простіше.

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

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

Слід згадати, що дана стаття ніколи не була б не написана без цінних зауважень від учасників групи NF.

Дякую за увагу. З глибокою повагою і щирою відданістю єсмь, панове, Ваш покірний слуга

© Климентьєв К.Є. aka DrMad: [email protected] * http://drmad.chat.ru
Самара 2001

Всі документи і програми на цьому сайті зібрані ТІЛЬКИ для освітніх цілей, ми не відповідаємо ні за які наслідки, які мали місце як наслідок використання цих матеріалів \ програм. Ви використовуєте все вищеперелічене на свій страх і ризик.
Будь-які матеріали з цього сайту не можуть бути скопійовані без дозволу автора або адміністрації.

Але чи багато хто витягли з цієї події дійсно корисні уроки?
Засмутився Чен Інг Хау: хто ж на вірус увагу зверне, хто ж його автора згадаєте незлим тихим словом?
Як досліджувати алгоритм РОБОТИ ВІРУСУ?
ЯК ВІРУС впроваджувати в ПРОГРАМИ?
В ЯКИХ ОПЕРАЦІЙНИХ СИСТЕМАХ ВІРУС ЖИВЕ?
Навіщо?
ЯК ВІРУС ПОВЕРТАЄ УПРАВЛІННЯ заражені програми?
ЯК ВІРУС ШУКАЄ ЦІЛІ ДЛЯ ЗАРАЖЕННЯ?
Номер функції dw?
Test [esi], 001 Jne SkipInf; Перевірка стекових параметрів виклику lea ebx, [esp + 00028] cmp [ebx], 024; Відкриття файлу?