Перехоплення функцій ядра Windows для захисту процесу

 












КУРСОВА РОБОТА

на тему:

«Перехоплення функцій ядра Windows для захисту процесу»



Зміст


Вступ

.Архітектура NT. Структура ядра

.1Режим ядра

1.2Режим користувача

2.Перехоплення. Методи перехоплення функцій

.1Режим користувача

2.2Режим ядра

3.Драйвер режиму ядра. IRP

.1Поняття драйверу

3.2Пакети вводу-виводу

.3Структура IRP-пакету

Висновки

Використана література

Додатки

Вступ


Всі сучасні системи Windows базуються на ядрі NT і є операційними ситемами з витісняючою багатозадачністю, тобто система може тимчасово перервати процес без його втручання. Для обробки запитів вводу-виводу використовується схема, що використовує пакети вводу-виводу та підтримує асинхронні запити.

За архітектурою процесори сімейства x86 підтримують чотири рівня привілеїв виконання - від 0 до 3 , проте ОС Windows використовує лише 2 з них: режим користувача виконується на третьому, а режим ядра на нульовому рівні. Основу операційної системи складають такі компоненти, як рівень абстракції від апаратного забезпечення та драйвери і служби, що працюють в режимі ядра або в користувацькому режимі.

Організація памяті в Windows NT

















В загальному випадку вона виглядає так: адреси від 0x00000000 до 0x0000FFFF не використовуються, будь-яке звертання до них викликає помилку. Адреси від 0x00010000 до 0x7FFFFFFF є користувацьким адресовим простором (User Space), ця область памяті різна у кожного процесу системи. В ній знаходиться код третього кільця та повязані з ним дані. Адреси від 0x800000000 до 0xFFFFFFFF є областю памяті ядра системи (Kernel Space), ця область єдина для всієї системи. В ній розміщені ядро системи, драйвера, файловий кеш, системні пули, а також всі структури ядра. Доступ до цієї памяті можна отримати лише з нульового кільця, будь-яке звертання до неё процесу користувацього режиму викличе помилку. При руйнуванні памяті процесу режиму користувача буде завершений лише той процес, память якого порушена, проте порушення цілісності структур памяті ядра веде до падіння систему в цілому.


1.Архітектура NT. Структура ядра


1.1Режим ядра


Ядро-центральна частина ОС, що забезпечує скоординований доступ до ресурсів ПК, таких як процесорний <#"justify">Як найнижчий компонент ОС, ядро пропонує найбільш низький рівень абстракції від апаратного забезпечення для доступу до ресурсів системи. Режим ядра Windows NT забезпечує повний доступ до аппаратного апаратного забезпечення та працює в захищеній області памяті. Ядро контролює потоки виконання, керує памяттю та взаємодією з апаратною частиною, а також обмежує доступ до критичних регіонів памяті зі сторони служб та програм режиму користувача. Для виконання подібних операцій процес режиму користувача повинен попросити ядро виконати її від свого імені.


Структура ядра


В режимі ядра виконуються наступні складові ОС:

)Рівень абстракції від апаратного забезпечення (HAL - Hardware Abstraction Layer) ізолює ядро, драйвери пристроїв та виконувальну частину від апаратної платформи, на якій працює ОС.

)Драйвери пристроїв, що включают як файлову систему, так і апаратні драйвери, що транслують користувацькі виклики функцій вводу-виводу в запити фізичних пристроїв.

)Виконувальна частина, що здійснює керування памяттю, процесами, потоками, безпекою, операціями вводу-виводу та міжпроцесорним обміном. Ядро Windows NT виконує низькорівневі операції: диспетчеризація потоків, переривань та виключень, синхронізації процесорів. Також ядро включає в себе набір базових процедур, які використовує виконувальна частина для створення високорівневих конструкцій.

Рівень абстракції від апаратного забезпечення (HAL)-рівень абстрагування, реалізований в програмному забезпеченні, що знаходиться між фізичним рівнем апаратного забезпечення та програмним забезпеченням, що працює на даній обчислювальній машині. HAL призначений для приховання відмінностей в апаратному забезпеченні від основної частини ядра операційної системи.

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

В ОС сімейства Windows NT HAL є необхідною частиною кода, який виконується в режимі ядра та знаходиться в іншому завантажувальному модулі. Це забезпечує можливість використання одного й того самого завантажувального модуля ядра ОС Windows NT на системах з різними архітектурами.

Драйвери пристроїв

Драйвери пристроїв- це завантажувальні модулі, що працюють в режимі ядра, створюючи інтерфейс між системою вводу/виводу та відповідним апаратним забезпеченням. Зазвичай такі модулі мають розширення .SYS. Всі вони створені з використанням викликів процедур HAL та є переносними на рівні двійкового коду між платформами NT. Існують декілька типів драйверів:

1)Драйвери, що керують апаратними засобами (з використанням HAL) для запису вихідних даних або отримання вхідних даних від фізичних пристроїв або через мережу.

2)Драйвери файлової системи, що приймають запити на файловий ввід/вивід та транслюють їх в запити вводу/виводу, повязані з конкретними пристроями.

3)Драйвери-фільтри. Прикладом є драйвери підтримки дзеркальних дисків, шифрування даних, перехоплення вводу/вивіду для додаткової обробки даних перед передачою їх на наступний рівень.

4)Мережеві драйвери, що передають та приймають віддалені запити вводу/вивіду.

Виконувальна частина

Виконувальна частина Windows NT - NTOSKRNL.EXE складається з наступних компонентів:

·Менеджер процесів та потоків керує процесами та потоками. Фактично процеси та потоки підтримуються в ОС найнижчим рівнем. Виконувальна частина додає нову семантику та функції до обєктів нижчого рівня.

·Менеджер віртуальної памяті використовує схему управління, при якій кожен процес отримує власний простір адрес, захищений від впливу інших процесів. Менеджер памяті також забезпечує низькорівневу підтримку для менеджера кеш-памяті.

·Монітор безпеки проводить політику забезпечення заходів безпеки на компьютері, захищаючи системні ресурси та виконуючи процедури аудиту та захисту обєктів.

·Система ввода/виводу використовує незалежний від пристроїв ввод-вивід та відповідає за пересилку даних відповідним драйверам для подальшої обробки.

·Менеджер кеш-памяті покращує швидкодію системи вводу-виводу, розміщуючи дані, що читаються з диску в основній памяті для пришвидшеного доступу до них, а також відкладаючи на короткий час запис змінених даних на диск.

·Менеджер обєктів, що створює, видаляє обєкти, а також керує ними. Обєкти використовуються в Windows NT для представлення таких ресурсів ОС, як процеси, потоки та обєкти синхронізації.


1.2Режим користувача


Режим користувача складається з підсистем, що передають запити вводу\виводу відповідному драйверу режиму ядра через менеджер вводу-виводу. Основною тут є підсистема оточення, що розроблена для запуску додатків, розроблених під різні версії ОС. Ні одна з підсистем оточення не має прямого доступу до апаратного забезпечення компютера. Доступ до памяті забезпечується менеджером памяті, що працює в режимі ядра. Також приорітет виконання програм режиму користувача менше, ніж у компонентів режиму ядра.

Підсистема оточення включає в себе наступні - система Win32, система OS/2 та система POSIX. Win32 запускає 32-розрядні Windows-додатки. Кожна програма запускаєтся в одному процесі з використання одного простору адрес, але для кожної програми використовується окремий потік. Також процес підсистеми оточення Win32 csrss.exe включає в себе функціонал менеджера вікон, тобто він опрацьовує такі події, як натискання клавіш клавіатури та миші, і передає їх на обробку конкретними програмами.



2.Перехоплення. Методи перехоплення функцій


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

Існують наступні види перехоплення системних функцій в ОС Windows:

·Режим користувача: модифікация IAT таблиць, сплайсинг.

·Режима ядра:модифікация SSDT/IDT таблиць, перехоплення з модифікацією тіла функції.


2.1Режим користувача


Зміна IAT таблиць процеса- таблиця адрес функцій, що імпортуються процесом для їх використання в роботі. Суть перехоплення зводиться до пошуку назви функції в таблиці та заміни її адреси на адресу нової. Ця технологія не змінює поведінку самої функції ОС, але змушує програму використовувати підставну функцію. Недоліком є необхідність модифікації IAT для кожного процесу в системі, що зводиться до завантаження DLL-бібліотеки у адресовий простір процеса.

Сплайсинг

Метод перехоплення шляхом зміни коду цільової функції в памяті системи. Суть зводиться до заміни перших 5 байт функції на команду довгого безумовного переходу (JMP), що передає управління до підставної функції. Щоб забезпечити коректність роботи, перехоплювач функції повинен зберегти оригінальний початок функції, і після виконання необхідних операцій повністю виконати справжню функцію.


2.2Режим ядра


Перехоплення базується на модифікації структур ядра та його функцій. Це здійснюється за допомогою внесення змін до відповідних таблиць:

·IDT Таблиця диспетчеризації (векторів) переривань.

·SSDT Таблиця диспетчеризації системних сервісів.

·IRP Таблиця драйвера, яка зберігає вказівники на функції, що обробляють пакети IRP.

Таблиця векторів переривань(IDT) повязує безпосередньо підпрограму обробника переривань з вектором(номером) переривання. Починаючи з процесора типу 80286, адреса в фізичній памяті та розмір таблиці переривань визначає 48-бітний регістр IDTR. IDT використовує наступні типи переривань: апаратні, програмні та переривання, резервовані процесором, які є обробниками виняткових ситуацій на випадок деяких подій (ділення на нуль, помилка трасирування, переповнення).повязує імя (номер) системної функції ядра з її адресою в памяті. Перехоплення за допомогою модифікації цієї таблиці є найбільш розповсюдженим. При виклику функції операційна система звертається до таблиці з метою отримання адреси, на яку буде передане керування для виконання завдань самою функцією.



3.Драйвер режиму ядра. IRP


3.1Поняття драйверу


Драйвер-це компьютерна програма, за допомогою якої ОС отримує доступ до апаратного забезпеченння деякого пристрою; завантажувані модулі, що працюють в режимі ядра, забезпечуючи інтерфейс між системою вводу/виводу та відповідними пристроями. Операційна система керує так званим «віртуальним пристроєм», який розуміє системний набір команд. Драйвер, в свою чергу, переводить ці команди у такі, що може виконати безпосередньо пристрій. Це є основним принципом ідеології абстракції від апаратного забезпечення.

Драйвер складається з деяких ключових функцій, що обробляють системні події. Головними з них є:

·Завантаження драйверу (реєстрація в системі, ініціалізація приладу).

·Вивантаження (звільнення зайнятих ресурсів:памяті, файлів, приладів).

·Відкриття драйверу (початок основної роботи. Зазвичай відкривається функцією CreateFile() в Win32).

·Читання/запис (програма обмінюється інформацією з пристроєм).

·Закриття драйверу (вивільнення ресурсів та видалення дескриптору файлу).

·Керування вводом/вивідом (IO Control, IOCTL). За допомогою цього інтерфейсу драйвер може пересилати дані та команди, специфічні для приладу. В Win32-системах керування здійснюється функцією DeviceIoControl().

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

Взаємодія драйверів між собою та програмами режиму користувача базується на використанні технології IRP.


3.2Пакети вводу-виводу (I/O request packet, IRP)

пакет-структура даних Windows, що забезпечує обмін даними між драйверами, а також між драйвером та програмою користувацького режиму. З точки зору архітектури будь-який драйвер є учасником вводу-виводу, незалежно від того, чи керує він пристроєм. Також неможлива пряма взаємодія між драйвером та програмою користувацького режиму. Вона зводиться до посилання коду IOCTL, який призводить до того, що диспетчер вводу/виводу формує на його основі IRP пакет. В самому драйвері визначені функції, що реагують на тип запиту пакета.


3.3Структура IRP пакета

пакет складається з двох частин: постійної та стеку вводу-виводу.

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

·MdlAddress-вказівкник на буфер запиту. Ссилається на память, де описаний запит.

·Flags-зберігає прапори, що описують процес вводу-виводу.

·IoStatus-блок стану вводу-виводу, що описує стан завершення обробки IRP. Коли IRP завершений, драйвер поміщує в поле loStatus.Status стан завершення операції, а в поле loStatus.Information - додаткову інформацію, яку потрібно передати назад ініціатору запиту.

·Cancel, CancelRoutine-поля використовуються, якщо IRP може бути скасований в процесі обробки. Cancel - поле типу BOOLEAN, значення якого встановлюється диспетчером вводу/виводу. Встановлення цього поля в TRUE означає, що операція вводу-виводу була відмінена. CancelRoutine - вказівник на функцію драйвера, що буде викликана диспетчером вводу-виводу для коректної відміни IRP.

·UserBuffer-віртуальна адресу буферу даних ініціатора запиту вводу-виводу.

Стек вводу-виводу в IRP містить інформацію відносно запиту вводу-виводу для конкретного драйверу. Розміщення стеку визначається структурою IO_STACK_LOCATION. Для визначення розміщення стеку всередині заданого IRP, драйвер може використати функцію IoGetCurrentlrpStackLocation, що поверне покажчик на поточний стек. Розглянемо основні поля стеку вводу-виводу:

·MajorFunction-вказівник на головний код функції вводу-виводу, звязаний з запитом вводу-виводу. Тут вказується тип операції, що має бути виконана.

·MinorFunction-покажчик на другорядний код функції. При використанні це поле перевизначає головний код функції.

·Control-сукупність прапорів, які встановлюються та читаються диспетчером вводу-виводу, вказуючи, яким чином потрібно обробити даний пакет IRP. Наприклад, прапори SL_INVOKE_ ON_CANCEL, SL_INVOKE_ON_ERROR и SL_INVOKE_ON_SUCCESS вказують, коли повинна бути викликана підпрограма завершення вводу-виводу драйвера.

·DeviceObject-покажчик на обєкт-пристрій, що є отримувачем запиту вводу-виводу.


Висновки

ядро операційна система функція

В даній роботі досліджена внутрішня структура операційної системи Windows, в результаті чого можна зробити ряд висновків:

·Завдяки поділу функціональності на режим ядра та режим користувача стабільність та безпека системи є великими, оскільки помилки користувацького режиму не можуть впливати на функціонування системи в цілому.

·Гібридне ядро дає змогу динамічно завантажувати та видаляти модулі ядра, що дозволяє застосовувати гнучку систему драйверів. Так, саме таким чином стала можливою технологія «plug and play», основою якої є завантаження додаткових драйверів в адресовий простір вже працюючого ядра.

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

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

·NtOpenProcess (дозволяє отримати дескриптор процеса та службову інформацію про нього)

·NtOpenThread(дозволяє отримати дескриптор та додаткову інформацію про потік виконання)

·NtTerminateProcess(використовується для аварійного завершення процесу)

·NtTerminateThread(дозволяє примусово завершити виконання потоку)

·NtWriteVirtualMemory(даний інструмент дозволяє здійснювати запис інформації в адресовий простір процесу)

·NtDuplicateObject(дозволяє скопіювати обєкт операційної системи зі зміною прав на нього. Так, це дозволяє отримати дескриптор процесу або потоку в обхід раніше згаданих функцій)

·NtDebugActiveProcess(дозволяє здійснювати налагодження процесу, що дає змогу закрити дескриптор обєкту, роблячи неможливим його подальше існування)

На основі цієї інформації був створений драйвер, що перехоплює системні функції ядра Windows на основі модифікації таблиці SSDT (метод зміни адреси функції, що перехоплюються, на підставну). Це дозволяє здійснювати контроль аргументів функцій, які були викликані та здійснювати їх модифікацію.


Використана література


1.Соломон Д., Руссинович М. Внутреннее устройство Microsoft Windows 2010. Мастер-класс. / Пер. с англ. - СПб.: Питер; М.: Издательско-торговый дом "Русская Редакция". 2006. - 746 стр.

2.А. С. Моляков Исследование ядра Windows NT 5.1 на целевой платформе Intel 3000. Систематический поиск недекларированных возможностей. Компания Спутник +. 2006 г.- 130 стр.

3.Свен Шрайбер Недокументированные возможности Windows 2000. Питер. 2002 г. - 544 стр.

.В. П. Солдатов Программирование драйверов Windows. Бином-Пресс. 2009 г.- 576 стр.

.Светлана Сорокина, Андрей Тихонов, Андрей Щербаков Программирование драйверов и систем безопасности. БХВ-Петербург. 2008 г.-256стр.

.Гэри Неббет Справочник по базовым функциям API Windows NT/2000. ISBN 5-8459-0238-X. 2002г.-528стр.

.Валерия Комиссарова Программирование драйверов для Windows. БХВ-Петербург. 2007г.- 256 стр.


Додаток 1.

Початковий код драйверу режиму ядра, компілятор WDK, мова-С


#include <ntddk.h>PVOID* PNTPROC;DWORD (ULONG);DWORD*PDWORD;unsigned char (BYTE);BYTE* PBYTE;struct _SYSTEM_SERVICE_TABLE

{ServiceTable; CounterTable; ServiceLimit; ArgumentTable;

}_SERVICE_TABLE ,

* PSYSTEM_SERVICE_TABLE ,

* * PPSYSTEM_SERVICE_TABLE ;struct _SERVICE_DESCRIPTOR_TABLE {_SERVICE_TABLE ntoskrnl; //SST для ntoskrnl.exe_SERVICE_TABLE win32k; //SST для win32k.sys_SERVICE_TABLE unused1; _SERVICE_TABLE unused2;

}_DESCRIPTOR_TABLE ,

* PSERVICE_DESCRIPTOR_TABLE,

* * PPSERVICE_DESCRIPTOR_TABLE ;

#define NTCALL(_function) KeServiceDescriptorTable->ntoskrnl.ServiceTable[_function]

#define USERCALL(_function) KeServiceDescriptorTableShadow->win32k.ServiceTable[_function]PSERVICE_DESCRIPTOR_TABLE KeServiceDescriptorTable;_STRING DeviceName;_STRING SymbolicLinkName;_OBJECT deviceObject = NULL;IoThreadToProcess(

__in PETHREAD Thread

);ProtectedPid = 0;NtQueryInformationThread(

__in HANDLE ThreadHandle,

__in THREADINFOCLASS ThreadInformationClass,

__inout PVOID ThreadInformation,

__in ULONG ThreadInformationLength,

__out_opt PULONG ReturnLength

);struct _THREAD_BASIC_INFORMATION {ExitStatus;TebBaseAddress;_ID ClientId;AffinityMask;Priority;BasePriority;

} THREAD_BASIC_INFORMATION, *PTHREAD_BASIC_INFORMATION;PsGetThreadProcessId (IN PETHREAD Thread ) ;NTSTATUS (*NtOpenProcessPointer)(PHANDLE ThreadHandle,ACCESS_MASK DesiredAccess,POBJECT_ATTRIBUTES ObjectAttributes,PCLIENT_ID ClientId);NTSTATUS (*NtOpenThreadPointer)(

__out PHANDLE ThreadHandle,

__in ACCESS_MASK DesiredAccess,

__in POBJECT_ATTRIBUTES ObjectAttributes,

__in PCLIENT_ID ClientId

);ObReferenceObjectByHandle(

__in HANDLE Handle,

__in ACCESS_MASK DesiredAccess,

__in_opt POBJECT_TYPE ObjectType,

__in KPROCESSOR_MODE AccessMode,

__out PVOID *Object,

__out_opt POBJECT_HANDLE_INFORMATION HandleInformation

);NTSTATUS (*NtTerminateProcessPointer)(HANDLE ProcessHandle OPTIONAL,NTSTATUS ExitStatus ); NTSTATUS (*NtTerminateThreadPointer)(HANDLE ThreadHandle,NTSTATUS ExitStatus ); NTSTATUS (*NtWriteVirtualMemoryPointer)(HANDLE ProcessHandle,PVOID BaseAddress, PVOID Buffer, ULONG NumberOfBytesToWrite, PULONG NumberOfBytesWritten OPTIONAL ); NTSTATUS (*NtDebugActiveProcessPointer)(HANDLE Process,HANDLE DebugObject);TrueNtOpenProcess;TrueNtTerminateProcess;TrueNtWriteVirtualMemory;TrueNtDebugActiveProcess;TrueNtTerminateThread;TrueNtOpenThread;OpenProcessId;TerminateProcessId;WriteVirtualMemoryId;DebugActiveProcessId;TerminateThreadId;OpenThreadId;GetPid(HANDLE ProcessHandle) {process=0;PID;(,

,,,

&process,);

__try

{=(ULONG)PsGetProcessId(process);

}

__except(EXCEPTION_EXECUTE_HANDLER)

{STATUS_INVALID_PARAMETER;

};(process);PID;

};(HANDLE ThreadHandle,NTSTATUS ExitStatus)

{uPid = 0;thread = NULL;status = STATUS_UNSUCCESSFUL;= ObReferenceObjectByHandle (,

,

*PsThreadType,,

(PVOID*) &thread,);(! NT_SUCCESS (status))

{TrueNtTerminateThread (,);

}= (ULONG) PsGetThreadProcessId ();();(uPid==ProtectedPid) {STATUS_ACCESS_DENIED;

} return TrueNtTerminateThread (,);

};NewNtOpenThread(

__out PHANDLE ThreadHandle,

__in ACCESS_MASK DesiredAccess,

__in POBJECT_ATTRIBUTES ObjectAttributes,

__in PCLIENT_ID ClientId) {uPid = 0;thread = NULL;status = STATUS_UNSUCCESSFUL;= ObReferenceObjectByHandle (,

,

*PsThreadType,,

(PVOID*) &thread,);(! NT_SUCCESS (status))

{TrueNtOpenThread(ThreadHandle, DesiredAccess,ObjectAttributes, ClientId);

}= (ULONG) PsGetThreadProcessId ();();(uPid==ProtectedPid) {STATUS_ACCESS_DENIED;

}

return TrueNtOpenThread(ThreadHandle, DesiredAccess,ObjectAttributes, ClientId);

};NewNtOpenProcess( PHANDLE ProcessHandle,ACCESS_MASK DesiredAccess,POBJECT_ATTRIBUTES ObjectAttributes,PCLIENT_ID ClientId) {

ULONG ProcessId;

__try

{= ClientId->UniqueProcess;

}

__except(EXCEPTION_EXECUTE_HANDLER)

{STATUS_INVALID_PARAMETER;

}(ProcessId==ProtectedPid) {STATUS_ACCESS_DENIED;

} TrueNtOpenProcess(,,,);

};NewNtTerminateProcess(HANDLE ProcessHandle OPTIONAL,NTSTATUS ExitStatus) {(GetPid(ProcessHandle)==ProtectedPid) {STATUS_ACCESS_DENIED;

} else TrueNtTerminateProcess(OPTIONAL,);

};NewNtWriteVirtualMemory(HANDLE ProcessHandle, PVOID BaseAddress, PVOID Buffer, ULONG NumberOfBytesToWrite, PULONG NumberOfBytesWritten OPTIONAL ) {(GetPid(ProcessHandle)==ProtectedPid) {STATUS_ACCESS_DENIED;

} else TrueNtWriteVirtualMemory(,,,,OPTIONAL);

};NewNtDebugActiveProcess(HANDLE ProcessHandle,HANDLE DebugObject) {(GetPid(ProcessHandle)==ProtectedPid) {STATUS_ACCESS_DENIED;

} elseTrueNtDebugActiveProcess(,);

};DriverDispatcher(PDEVICE_OBJECT DeviceObject,PIRP Irp)

{tHandle;_STACK_LOCATION irpStack;ioControlCode;Old;= IoGetCurrentIrpStackLocation (Irp);= irpStack->Parameters.DeviceIoControl.IoControlCode;(irpStack->MajorFunction == IRP_MJ_DEVICE_CONTROL) ProtectedPid = (HANDLE)ioControlCode;>IoStatus.Status = STATUS_SUCCESS;(Irp, IO_NO_INCREMENT);STATUS_SUCCESS;

}DriverUnload(IN PDRIVER_OBJECT DriverObject)

{CR0Reg;(&SymbolicLinkName);(deviceObject);

__asm

{eax, cr0CR0Reg,eaxeax,0xFFFEFFFF cr0, eax

}(OpenProcessId)=TrueNtOpenProcess;(TerminateProcessId)=TrueNtTerminateProcess;(WriteVirtualMemoryId)=TrueNtWriteVirtualMemory;(DebugActiveProcessId)=TrueNtDebugActiveProcess;(TerminateThreadId)=TrueNtTerminateThread;(OpenThreadId)=TrueNtOpenThread;

__asm

{eax, CR0Reg cr0, eax

};

}DriverEntry(IN PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)

{CR0Reg;st;dDeviceName = L"\\Device\\NoTerminate";dSymbolicLinkName = L"\\DosDevices\\NoTerminate";(&DeviceName, dDeviceName);(&SymbolicLinkName, dSymbolicLinkName);= IoCreateDevice(DriverObject, 0, &DeviceName, FILE_DEVICE_NULL, 0, FALSE, &deviceObject);(st == STATUS_SUCCESS)= IoCreateSymbolicLink(&SymbolicLinkName,&DeviceName); =0x07A;=0x101;=0x115;=0x039;=0x102;=0x080;=NTCALL(OpenProcessId);=NTCALL(TerminateProcessId);=NTCALL(WriteVirtualMemoryId);=NTCALL(DebugActiveProcessId);=NTCALL(TerminateThreadId);=NTCALL(OpenThreadId);

__asm

{eax, cr0CR0Reg,eaxeax,0xFFFEFFFF cr0, eax

}(OpenProcessId)=NewNtOpenProcess;(TerminateProcessId)=NewNtTerminateProcess;(WriteVirtualMemoryId)=NewNtWriteVirtualMemory;(DebugActiveProcessId)=NewNtDebugActiveProcess;(TerminateThreadId)=NewNtTerminateThread;(OpenThreadId)=NewNtOpenThread;

__asm

{eax, CR0Reg cr0, eax

}>MajorFunction[IRP_MJ_CREATE] =>MajorFunction[IRP_MJ_CLOSE] = >MajorFunction[IRP_MJ_DEVICE_CONTROL] = DriverDispatcher; >DriverUnload = DriverUnload;STATUS_SUCCESS;

}


Додаток 2.

Початковий код програми, що здійснює обмін інформацієї з драйвером. Мова-Delphi

nt;, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, StdCtrls;= class(TForm): TButton;: TEdit;: TButton;: TLabel;Button1Click(Sender: TObject);FormCreate(Sender: TObject);Button2Click(Sender: TObject);FormCloseQuery(Sender: TObject; var CanClose: Boolean);

{ Private declarations }

{ Public declarations };:dword;: TForm1;: dword;

{$R *.dfm}TForm1.Button1Click(Sender: TObject);:= CreateFile('\\.\NoTerminate', GENERIC_ALL, 0,, OPEN_EXISTING, 0, 0);(hDriver, StrToInt64(Edit1.Text), nil, 0, nil, 0, TrId, nil);.Enabled:=false;.Enabled:=true;;TForm1.FormCreate(Sender: TObject);.Caption:='PID='+inttostr(GetCurrentProcessId);.Text:=inttostr(GetCurrentProcessId);;TForm1.Button2Click(Sender: TObject);.Enabled:=true;.Enabled:=false;(hDriver,0, nil, 0, nil, 0, TrId, nil);;TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);:=false;;.


КУРСОВА РОБОТА на тему: «Перехоплення функцій ядра Windows для захисту процесу» Зміст

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ