Прихващане (програмиране)
Прихващане(англ. hooking) е технология, която ви позволява да промените стандартното поведение на определени компоненти на информационна система.
Съдържание
Много често в системното програмиране има задача за промяна на стандартното поведение на системните функции. Например, едно доста интересно приложение на тази технология е предефинирането на прозоречната процедура в GUI на приложенията на Windows (подкласове). Това е необходимо, ако програмистът иска да организира собствена обработка на произволно прозоречно съобщение и едва след това да го прехвърли към стандартната прозоречна процедура. След подкласиране, цикълът за обработка на съобщения ще изглежда така:
Windows Съобщение->Прозорец (прозоречна процедура)
Съобщение в Windows->Нашата процедура за прозорец->Прозорец (процедура за прозорец)
Например, уроците на Iczelion [1] описват пример за това как може да се използва подкласиране за контрол на входа към контролите. Технологиите за прихващане са необходими не само в този случай, но също така, например, за предварителна обработка на резултатите от функциите за търсене на системни файлове FindFirst и FindNext, EnumProcess, който изброява процесите в Windows и др. Освен това за тези цели такива технологии използват както антивирусни инструменти [2], така и различни видове вируси, руткитове и други видове зловреден софтуер.
Много често прихващането е важно за отстраняване на грешки в програми и е една от основните технологии, използвани в програмите за отстраняване на грешки. В този случай тази технология позволява на една програма да контролира изпълнението на друга. За тези цели е предоставено системното повикване ptrace, което ви позволява да се свързвате с процеси, да проследявате стойностите на регистрите в контекста на процеса, който се отстранява, и, наред с други неща, да контролирате други системни повиквания. Тя е основа завнедряване на такава функция на дебъгери като точки на прекъсване. Това системно извикване е добре документирано и присъства във всички основни *Nix системи: Linux, FreeBSD, Solaris. [3] Най-често се използва във връзка със системното извикване fork, което извиква ptrace, указвайки в параметрите на извикването, че стартираният процес е дъщерен. Microsoft Windows също предоставя за подобни цели т.нар. DebugAPI [4] .
Основните методи за прихващане са:
Методите също могат да бъдат разделени според критериите за режим на изпълнение:
- Потребителски (ring3) методи:модификация на IAT таблици, снаждане. Тяхната особеност е, че е невъзможно да се промени нещо в поведението на ядрото на операционната система и нейните разширения.
- Режим на ядрото:модификация на SSDT/IDT таблици, прихващане в режим на ядрото с модификация на тялото на функцията. Позволява ви да променяте структурите от данни и кода на всяка част от операционната система и приложенията.
Сплайсинг(от английското splice - „снаждане или залепване на краищата на нещо“) е метод за прихващане на API функции чрез промяна на кода на целевата функция. Обикновено се променят първите 5 байта на функцията. Вместо това се вмъква преход към функция, която програмистът дефинира. За да се гарантира, че операцията се изпълнява правилно, приложението, което прихваща функцията, трябва да позволи изпълнението на кода, който е променен в резултат на сплайсинг. За да направи това, приложението запазва заменения участък от паметта при себе си и след като отработи функцията за прихващане, възстановява променения участък от функцията и позволява пълното изпълнение на истинската функция. [5]
гореща точка
Всички стандартни dll функции на Windows поддържат горещи точки за корекция. При използване на тази технология пет неизползвани еднобайтови операции се поставят преди началото на функцията.nop, самата функция започва с двубайтова инструкция mov edi, edi. Пространството, заето от пет nops, е достатъчно, за да поставите командата за прескачане към функцията за прихващане. Двата байта, заети от mov edi, edi, предоставят достатъчно място за команда, за да премине към кода, поставен на мястото на петте nop. В същото време, тъй като инструкцията mov edi, edi не извършва никакви смислени действия, нейното презаписване не влияе по никакъв начин на изпълнението на оригиналната функция. Така програмистът се освобождава от необходимостта да записва първоначалната стойност на кода, който е променил някъде [6] .
Приложения за снаждане и методи за откриване
- В софтуер, който трябва да изпълнява функции за наблюдение на системата
- Механизмът за закачане в Windows
- Различни видове зловреден софтуер. Това е основната стелт технология за руткитове на потребителско ниво.
Сравнение с други технологии
Всичко това показва, че това е много ирационален начин за решаване на проблема с промяната на поведението на програмата, ако са възможни първите два подхода или сплайсинга.
Базира се на модификация на структурите и функциите на данните на ядрото. Масите са основните обекти на влияние
Руткитове от този вид се наричат DKOM руткитове, тоест руткитове, базирани на директна модификация на обекти на ядрото. В руткитове за Windows Server 2003 и XP системи тази технология е надградена, тъй като тези операционни системи вече имат защита срещу запис за определени области на паметта на ядрото [10] . Windows Vista и 7 получиха допълнителна защита на ядрото PatchGuard, но всички тези технологии бяха преодолени от авторите на руткит [11] . В същото време прихващането на системни функции в режим на ядро е в основата на системите за проактивна защита и хипервайзорите.
Могат да се разграничат и други форми на прихващане:
- Прихващане на мрежови връзки и пакети. [12]
- Прихващане на парола. Например чрез шпиониране на въвеждането от клавиатурата с помощта на keylogger.
- Прихващане на заявки на браузър към сайтове, използващи HTTP прокси или разширения на браузъра. Позволява ви да анализирате и/или замените данните, обменяни между браузъра и сървъра.
Тук са описани само част от приложенията на тази технология.