Перехоплення (програмування)
Перехоплення(англ. hooking) - технологія, що дозволяє змінити стандартну поведінку тих чи інших компонентів інформаційної системи.
Зміст
Дуже часто у системному програмуванні виникає завдання зміни стандартної поведінки системних функцій. Наприклад, досить цікавим застосуванням даної технології є перевизначення віконної процедури у GUI додатків Windows (сабклассінг). Це потрібно, якщо програміст хоче організувати власну обробку якогось віконного повідомлення і потім передати стандартної віконної процедурі. Після сабклассінг цикл обробки повідомлень буде виглядати так:
Повідомлення Windows->Вікно (віконна процедура)
Повідомлення Windows->Наша віконна процедура->Вікно (віконна процедура)
Наприклад, в Уроках Iczelion'а [1] описаний приклад того, як сабклассинг може використовуватися для організації контролю за введенням в елементи управління. Технології перехоплення потрібні не тільки в цьому випадку, але і, наприклад, для попередньої обробки результатів системних функцій пошуку файлів FindFirst і FindNext, EnumProcess, яка перераховує процеси у Windows і т.д. ] , так і різноманітні віруси, руткіти та інші види шкідливого програмного забезпечення.
Дуже часто перехоплення буває важливим для організації налагодження програм і є однією з основних технологій, які застосовуються у відладчиках. У разі ця технологія дозволяє одній програмі контролювати виконання інший. Для цих цілей передбачено системний виклик ptrace, який дозволяє підключатися до процесів, відстежувати значення регістрів у контексті процесу, що налагоджується, і в тому числі контролювати інші системні виклики. Він є основою дляреалізації такої можливості відладчиків як точки зупинки. Даний системний виклик добре документований і присутній у всіх головних *Nix системах: Linux, FreeBSD, Solaris. [3] Найчастіше використовується спільно з системним викликом fork, який і викликає ptrace, вказуючи в параметрах виклику, що процес, що запускається - дочірній. Microsoft Windows також надає для схожих цілей т.з. DebugAPI [4] .
Основними методами перехоплення є:
Методи можна розділити за критерієм режиму виконання:
- Користувацькі (ring3) методи:модифікація IAT таблиць, сплайсинг. Їх особливість у тому, що неможливо щось змінити у поведінці ядра операційної системи та її розширень.
- Режим ядра:модифікація SSDT/IDT таблиць, перехоплення в режимі ядра з модифікацією тіла функції. Дозволяє модифікувати структури даних та код будь-якої частини операційної системи та додатків.
Сплайсинг(від англ. splice - "зрощувати або склеювати кінці чогось") - метод перехоплення API функцій шляхом зміни коду цільової функції. Зазвичай змінюються перші 5 байт функції. Натомість вставляється перехід на функцію, яку визначає програміст. Щоб забезпечити коректність виконання операції, додаток, який перехоплює функцію, зобов'язаний дати можливість виконатися коду, зміненому в результаті сплайсингу. Для цього програма зберігає ділянку пам'яті, що замінюється, у себе, а після відпрацювання функції перехоплення відновлює змінений ділянку функції і дає повністю виконатися справжньої функції. [5]
Hot-patch point
Усі функції стандартних dll Windows підтримують hot-patch point. При використанні цієї технології перед початком функції розташовуються п'ять однобайтових операцій, що не використовуються.nop, сама функція починається з двобайтової інструкції mov edi, edi. Місця займаного п'ятьма nop досить щоб розмістити команду переходу на функцію-перехоплювач. Два байти займаних mov edi, edi надають достатньо місця для команди переходу на код розміщений на місці п'яти nop. У цьому, оскільки інструкція mov edi, edi не виконує жодних осмислених дій, її затирання не впливає працездатність вихідної функції. Таким чином, програміст звільняється від необхідності де-небудь зберігати вихідне значення зміненого ним коду [6] .
Сфери застосування сплайсингу та методи виявлення
- У ПЗ, якому необхідно здійснювати функції моніторингу системи
- Механізмом хуків у Windows
- Різного роду шкідливими програмами. Це основна технологія приховування для руткітів користувача рівня
Порівняння з іншими технологіями
Все це показує, що це вельми нераціональний спосіб вирішення проблеми зміни поведінки програми у разі можливості застосування перших двох підходів чи сплайсингу.
Він ґрунтується на модифікації структур даних ядра та функцій. Головними мішенями впливу є таблиці
Такі руткити називаються DKOM-руткитами, тобто руткітами, заснованими на безпосередньої модифікації об'єктів ядра. У руткітах для систем Windows Server 2003 і XP ця технологія була модернізована, оскільки в цих ОС з'явився захист від запису деяких областей пам'яті ядра [10] . Windows Vista і 7 отримали додатковий захист ядра PatchGuard, проте всі ці технології були подолані рутками-письменниками [11] . У той же час перехоплення системних функцій у режимі ядра є основою проактивних систем захисту та гіпервізорів.
Можна виділити й інші форми перехоплення:
- Перехоплення мережевих з'єднань та пакетів. [12]
- Перехоплення паролів. Наприклад, за допомогою шпигунства за клавіатурним введенням за допомогою кейлоггера.
- Перехоплення звернень браузера до сайтів за допомогою HTTP Proxy або розширень браузера. Дозволяє проаналізувати та/або замінити дані, якими обмінюються браузер та сервер.
Тут описано лише частину застосувань даної технології.