Перехоплення (програмування)

Перехоплення(англ. 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 або розширень браузера. Дозволяє проаналізувати та/або замінити дані, якими обмінюються браузер та сервер.

Тут описано лише частину застосувань даної технології.