Як виявити malware-програми Універсальний метод
Архів номерів / 2006 / Випуск №9 (46) / Як виявити malware-програми? Універсальний метод
КРИС КАСПЕРСЬКІ
Як виявити malware-програми?
Антивіруси, брандмауери та інші системи захисту добре справляються з вірусами та хробаками, але у боротьбі з malware вони безсилі. Щоб не потонути в термінологічній плутанині, тут і далі за текстом, під malware-програмами маються на увазі програми, що потай проникають на віддалений комп'ютер і встановлюють там back-door або крадуть секретну інформацію.
Насамперед нас будуть цікавити malware-програми, не здатні до розмноження і найчастіше написані індивідуально для кожної конкретної атаки, а тому існуючі в єдиному екземплярі. За умови, що вони не розпізнаються евристичним аналізатором (а обдурити евристичний аналізатор дуже легко), антивірус нізащо не зловить їх, оскільки таких сигнатур ще немає в його базі, та й звідки вони там узялися б?!
Персональний брандмауер також не надто надійний захист. Безліч дір дають зловмиснику привілеї SYSTEM (що вище адміністратора буде), з якими можна творити все що завгодно, у тому числі й приймати/відправляти пакети в обхід брандмауера.
Проте виявити наявність malware на комп'ютері все-таки можливо. Я проаналізував безліч шкідливих програм і виявив слабкі місця, що видають факт впровадження з головою.
Як malware впроваджується у комп'ютер
Найбільш примітивні екземпляри malware-програм створюють новий процес, який уважний користувач легко виявить у диспетчері завдань. Звичайно, для цього необхідно знати, які процеси присутні в «стерильній» системі та де розташовуються їхфайли. Зокрема, explorer.exe, розташований не в WINNT, а в WINNTSystem32, це вже ніякої не explorer, а справжнісінька malware-програма!
Втім, «диспетчер завдань» дуже вразлива штука, і malware-програми легко приховують свою присутність від його погляду. Те саме стосується FAR, Process Explorer, tlist та інших системних утиліт, заснованих на недокументованій API-функції NtQuerySystemInformation(), що експортується динамічною бібліотекою NTDLL.DLL і тому дуже легко перехоплюється з прикладного рівня, без звернення до ядра і навіть без адміністраторських привілеїв .
До речі, malware-програми, що ховаються від "диспетчера завдань", негайно видають свою присутність шляхом звірення "показань" soft-ice з "диспетчером завдань". Один із таких випадків продемонстрований на рис. 1. Дивіться, soft-ice відображає процес sysrtl, але у «диспетчері завдань» він… відсутній! Отже, це або malware-програма, або якийсь хитромудрий захисний механізм, побудований за технологією root-kit. Загалом - погана програма, якої можна чекати все що завгодно і бажано позбутися якнайшвидше!

Малюнок 1. Шкідливий процес sysrtl замаскував свою присутність від «диспетчера завдань», але не зміг впоратися з soft-ice
Для досягнення найбільшої скритності malware-програма повинна не створювати новий процес, а впроваджуватися в один із існуючих, що вона з успіхом і робить. Класичний алгоритм впровадження реалізується так:
Примітка: до появи процесорів, що підтримують біти NX/XD, що запобігають виконанню коду в стеку та купі, malware-програми зазвичай виділяли в цільовому процесі регіон пам'яті з атрибутами PAGE_READWRITE, а тепер – PAGE_EXECUTE_READWRITE, що, втім, надто помітно, томуграмотні malware-письменники виділяють блок з атрибутами PAGE_EXECUTE, що не перешкоджає функції WriteProcessMemory() записувати туди шкідливий код.
Описаний алгоритм працює на всьому зоопарку операційних систем, але досить громіздкий і складний у реалізації, тому malware-програми, орієнтовані тільки на поразку NT, воліють створювати віддалений потік API-функції CreateRemoteThread(), при цьому послідовність виконуваних нею дій виглядає так:
Вся біда в тому, що ім'я бібліотеки має бути в контексті віддаленого процесу, а як воно там виявиться? Існує два шляхи: найпростіше, але не найрозумніше, це виділити блок пам'яті викликом VirtualAllocEx() і скопіювати туди ім'я через WriteProcessMemory(), але для цього процес повинен бути відкритий з прапором «віртуальні операції» (PROCESS_VM_OPERATION), прав на які у malware-програми може не бути.
Узагальнивши сказане, ми отримуємо наступний план:
Ось три основні алгоритми впровадження в процес, що атакується, якими користується близько 90% всіх malware-програм.
Слідами malware, або Як виявити впровадження
Якщо кількість процесів у системі цілком передбачувано, то потоки багаторазово створюються/знищуються під час виконання легальних програм, і питання «скільки потоків повинна мати «стерильна» програма» не має сенсу. Достатньо відкрити «диспетчер завдань» і, якийсь час поспостерігав за колонкою «потоки», прийти у повний розпач. Але… якщо придивитися уважніше, можна виявити, що потоки, створені malware-програмами, значно відрізняються від решти.
Давайте напишемо «макетну» програму, що створює потік тим самим способом, що і malware-програми, і спробуємо виявити факт «вторгнення» за допомогою підручних утиліт.Гранично спрощений вихідний текст «макетника» має такий вигляд:
Лістинг 1. «Макетна» програма va_thread.c, що створює потік тим самим методом, що і malware
// код потоку, який нічого не робить, а лише мотає цикл
void * p; // змінна багатоцільового використання
// створюємо «чесний» потік
// створюємо "нечесний" потік так, як це робить malware
// Виділяємо блок пам'яті з купи, копіюємо туди
// код потоку і викликаємо CreateThread
p = VirtualAlloc (0, 0x1000, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
// Чекаємо натискання на будь-яку клавішу
Компілюємо з налаштуваннями за замовчуванням. У разі MS VC++ командний рядок має такий вигляд:
та запускаємо. Завантаження процесора (навіть на двопроцесорній машині!) відразу підстрибує до 100%, але так і має бути, оскільки ми створюємо два потоки, що мотають нескінченний цикл, один з яких чесний, а інший шкідливий (імітує malware-програму). Плюс головний потік програми, що очікує натискання клавіші, по якій відбувається завершення програми. Разом три потоки.
Завантажуємо soft-ice і натискаємо , чекаючи на його виклик, після чого даємо команду:
THREAD x va_thread
для відображення детальної інформації про потоки та дивимося на отриманий результат (див. рис. 2). Так! Тут є на що подивитись!


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

Повний вихідний текст міститься у файлі ProcList.c, що знаходиться на сайті журналу www.samag.ru у розділі «Вихідний код», а тут для економії місцянаводяться лише ключові фрагменти.
Але перш ніж заглиблюватись у теоретичну дискусію, перевіримо сканер у роботі. Наберемо в командному рядку: