Контроль виклику API функцій у середовищі систем Windows ’95, Windows ’98 і Windows NT, Windows, Операційні системи, статті

ДмитроКрупорніцкій

Дана стаття є дуже вільнимперекладом статті “API Spying Techniques For Windows 95, 98, NT”написаної Yariv Kaplan. Я постарався максимальноповно описати способи аналізу викликів функцій усередовищі Windows, застосувавши при цьому, як основу,вищезгадану статтю і, частково, особистий досвід.

Отже, утиліти аналізу викликів APIфункцій є найпотужнішими при написанніцілого ряду програм, таких як Firewalls, отладчики,і т.д. Проте ні DDK ні SDK не забезпечує тоймінімум інформації, який необхідний длянаписання такого роду програм.

Існує декілька підходів длянаписання програм з “перехопленням” API функцій – локальний(Він використовується для контролю за виконаннямтільки однієї програми) та глобальний (Дляконтролю над всією системою і викликами функцій звсіх запущених / запускаються програм). Вибірспособу стоїть за вами. Перший підхід більшхарактерний для отладчиков, аналізаторівдіяльності програм, і всіх інших”Налагоджувальних” коштів. Другий спосіб має більшешироке застосування. В цьому випадку ви отримуєтеконтроль над всією системою і повний контроль надтими функціями, які вам необхідні.

Припустимо, що ви хочете написатипрограму, що блокує запуск деякоїпрограми. Очевидно, що блокувати запуск вамнеобхідно до того моменту, як система завершитьсвою роботу або поки програма не будезавершена через передбачений вами (або моженемає) спосіб завершення програми. В цьому випадку,вам необхідно перехопити функції CreateProcess(Причому обидві – і ANSI і Unicode). Коли б не намагаласясистема запустити новий процес (== програму), товиклик буде зроблений і ваша процедураобробки отримає управління.

Давайте ж розглянемо способиперехоплення викликів.

Заміна оригінальної DLL бібліотеки.

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

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

Заміна викликів функцій в тілі програми

Дуже непрактичний спосіб, однак яйого опишу. При виконанні функції, зазвичай існує 2етапи: виклик в програмі і виконання. А що якщовиклик в програмі буде замінений на виклик іншогопроцедури (наприклад вашої)? Все вірно, вашапроцедура отримає управління, обробить його, іповерне управління (якщо треба) оригінальноїфункції. Складність полягає в тому, що доведетьсядуже сильно постаратися і писати ще йдізассемблер для отримання точки виклику функції.І при тому треба знати заздалегідь, які програминеобхідно змінювати, що робить честі способу.

Зміна таблиці IAT (Import Address Table)

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

Всі DLL / EXE файли, використовувані в Windows,мають формат PE (Portable Executable). Файли ціпримітні тим, що їх тіло складається з блоків(Наприклад блок ресурсів -. Rsrc). Так от, в DLL файлахє особлива секція –

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

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

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

Зміна функції безпосередньо

Теж непоганий спосіб, однак тутіснує багато своїх “але”.

Вся ідея полягає в замінити першогобайта необхідної функції інструкцієюпереривання INT 3. Всі дзвінки до цієї процедури будутьвикликати виключення, яке потімперехоплюється вашою програмою (тут вона повиннавиступати в ролі відладчика). АЛЕ! Механізмобробки виключень в Windows дуже жорстокий і цевсе працює поки всього цього мало. Але привеликій кількості перехоплених функцій, все вЗрештою зависає у зв’язку із завантаженістюсистеми.

Визначення запущеного процесу

Найчастіше для програму потрібновизначення “занедбаності” якогосьпевного процесу. Один з методів тутвже розглядалося (перехоплення функції CreateProcess). Алев системах Windows є спосіб, який може допомогтипозбавитися від додаткового написання кодуперехоплення функції.

Для драйвера віртуального пристроює можливість обробки повідомлення CREATE_PROCESS,
яке розсилається VWIN32 коли б незапустився новий процес. В системі Windows NT/2000існує додаткова можливістьустановки такої функції через виклик процедури PsSetCreateProcessNotifyRoutine
з NTOSKRNL. Така функція (опис дивіться вMSDN) дозволяє драйверу пристрою отримуватисповіщення системи про запуск нової програми.

Ну ось в принципі і все. Всі іншіспособи аналізу (COM Hooking, Winsock Hooking, DDE and Browser HelperObject, ….) вже описані і досить добре, тому язнову винаходити велосипед не буду.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*