
- •6.050101 «Комп’ютерні науки»
- •Загальні вимоги до виконання лабораторних робіт
- •Лабораторна робота №1
- •1. Основні теоретичні відомості
- •1.1 Основні поняття
- •1.2 Створення процесу
- •1.3 Створення потоку
- •2. Хід роботи
- •4. Завдання
- •5. Контрольні запитання
- •6.Список використаної літератури
- •Додаток 1
- •Додаток 2
- •Додаток 3
- •Функція CreateProcess створює новий процес.
- •Додаток 4
- •Додаток 5
- •Addr ThreadId – Створює новий потік.
- •Додаток 6
- •Додаток 7
- •Лабораторна робота №2
- •1. Основні теоретичні відомості
- •1.1 Механізми міжпроцесової взаємодії
- •1.2 Механізми синхронізації процесів та потоків
- •1.3 Об’єкти синхронізації
- •1.4 Очікуючі функції
- •1.5 Створення атома
- •1.6 Створення каналу
- •2. Хід роботи
- •4. Завдання
- •5. Контрольні запитання
- •6.Список використаної літератури
- •Додаток 1
- •Додаток 2
- •Додаток 3
- •Додаток 4
- •Додаток 5 Детальний опис функції створення анонімного каналу
- •Додаток 6 Детальний опис функції створення іменованого каналу
- •Додаток 7
- •Додаток 8
- •Додаток 9 Текст програми створення анонімного каналу
- •Додаток 10
- •Лабораторна робота №3
- •1. Основні теоретичні відомості
- •2. Приклад програми створення dll
- •Опис програми My_dll.Asm та файлу лістінга My_dll.Def
- •4. Трансляція та компонування dll Для того, щоб відтранслювати(ml.Exe) та зкомпонувати (link.Exe) даний .Asm код, потрібно використовувати наступні параметри:
- •5. Приклад використання функції з бібліотеки
- •Приклад програми завантаження dll
- •7. Створення файлу лістінгу існуючої бібліотеки
- •8. Приклад передачі даних у функцію бібліотеки Створення динамічно завантажуваної бібліотеки
- •Передача параметру у функцію бібліотеки
- •9. Хід роботи
- •11. Завдання
- •12. Контрольні запитання
- •13. Список використаної літератури
- •Лабораторна робота №4
- •1. Основні теоретичні відомості
- •Параметри функції CreateToolhelp32Snapshot:
- •2. Перегляд процесів
- •3. Перегляд потоків
- •Значення результуючого параметру (регістр еах) таке саме як в Process32First і Process32Next.
- •4. Перегляд хіпів асоційованих з процесом
- •5. Перегляд модулів, які використовує процес
- •6. Керування процесами
- •7. Хід роботи
- •9. Завдання На 75 балів виконати 4 завдання:
- •10. Контрольні запитання
- •11. Список використаної літератури
- •Додаток 1
- •Лабораторна робота №5
- •Основні теоретичні відомості
- •1.1 Основні поняття
- •1.2 Категорії даних
- •1.3 Відкриття і закриття ключів реєстру
- •1.4 Створення підключа у відкритому ключі реєстру
- •1.5 Отримання інформації з ключа реєстру
- •1.6 Перелічення списку значень для заданого ключа реєстру
- •1.7 Виявлення змін в гілці реєстру
- •1.8 Робота з налаштуваннями операційної системи через реєстр
- •2. Хід роботи
- •4. Завдання
- •5. Контрольні запитання
- •6. Список використаної літератури
- •Додаток 1
- •Лабораторна робота №6
- •1. Основні теоретичні відомості
- •Породження процесів
- •1.2 Породження потоків
- •2. Хід роботи
- •4. Індивідуальні завдання
- •5. Контрольні запитання
- •Для нотаток Для нотаток Для нотаток
4. Перегляд хіпів асоційованих з процесом
Щоб переглянути хіпи зі списку деякого процесу використовуються функції Heap32ListFirst і Heap32ListNext. Вони аналогічні вищеописаним Thread32First і Thread32Next з тією різницею, що працюють з структурою HEAPLIST32.
invoke Heap32ListFirst, SnapshotHandle, addr HeapEntry
invoke Heap32ListNext, SnapshotHandle, addr HeapEntry
де addr HeapEntry – адреса об’єкта структури HEAPLIST32. Ця структура описує один запис із списку хіпів, які знаходилися в адресному просторі процеса з ідентифікатором th32ProcessID після виконання функції CreateToolhelp32Snapshot.
STRUC HEAPLIST32
dwSize DWORD ? ; Розмір структури в байтах
th32ProcessID DWORD ? ; Ідентифікатор процесу, який містить даний хіп
th32HeapID DWORD ? ; Ідентифікатор хіпу (для внутрішнього використання)
dwFlags DWORD ? ; Масив бітів для означення типу хіпу (зараз доступний
; лише тип HF32_DEFAULT)
ENDS HEAPLIST32
5. Перегляд модулів, які використовує процес
Щоб переглянути модулі, які використовуються деяким процесом треба викликати функції Module32First і Module32Next. Вони аналогічні вищеописаним Heap32ListFirst і Heap32ListNext з тією різницею, що працюють з структурою MODULEENTRY32.
invoke Module32First, SnapshotHandle, addr ModEntry
invoke Module32Next, SnapshotHandle, addr ModEntry
де addr ModEntry – адреса об’єкта структури MODULEENTRY32. Ця структура описує один запис із списку модулів, які знаходилися в адресному просторі процеса з ідентифікатором th32ProcessID після виконання функції CreateToolhelp32Snapshot.
STRUC MODULEENTRY32
dwSize DWORD ?; Розмір структури в байтах
th32ModuleID DWORD ?; Збережено для сумісності (завжди рівний 1)
th32ProcessID DWORD ?; Ідентифікатор процеса, який використовує даний модуль
GlblcntUsage DWORD ?; Кількість завантажувань модуля
ProccntUsage DWORD ?; - / / -
modBaseAddr DWORD ?; Базова адреса модуля в контексті процеса-володаря
modBaseSize DWORD ?; Розмір модуля в байтах
hModule DWORD ?; Вказівник на модуль в контексті процеса-володаря
szModule db (MAX_MODULE_NAME32 + 1) dup (?); Стрічка-назва модуля
szExePath db MAX_PATH dup (?); Стрічка-шлях до модуля
ENDS MODULEENTRY32
6. Керування процесами
Щоб здійснити керування процесом потрібно обов'язково відкрити його дескриптор з допомогою функції OpenProcess:
invoke OpenProcess, dwDesiredAccess, bInheritHandle, dwProcessId
Параметри функції OpenProcess
dwDesiredAccess (вхідний) – вказує режим з яким відкривається дескриптор процесу.
Цей аргумент за призначенням схожий до режиму відкриття файлів. Перелік доступних режимів наведено в таблиці:
Значення |
Опис |
PROCESS_ALL_ACCESS |
Визначає всі можливі права доступу до процесу (повинй доступ) |
PROCESS_CREATE_PROCESS |
Для внутрішнього використання |
PROCESS_CREATE_THREAD |
Визначає право на створення потоку в заданому процесі з допомогою функції CreateRemoteThread. |
PROCESS_DUP_HANDLE |
Дозволяє використовувати дескриптор процесу як початковий або кінцевий процес в функції DuplicateHandle для дублікації дескриптора. |
PROCESS_QUERY_INFORMATION |
Дозволяє використовувати дескриптор процесу в таких функціях, як GetExitCodeProcess та GetPriorityClass для отримання інформації про стан процесу. |
PROCESS_SET_INFORMATION |
Дозволяє змінювати стан процесу, зокрема встановлювати пріоритет виконання процесу з допомогою функції SetPriorityClass. |
PROCESS_TERMINATE |
Дозволяє припиняти роботу процесу з допомогою функції TerminateProcess. |
PROCESS_VM_OPERATION |
Дозволяє використовувати функції VirtualProtectEx і WriteProcessMemory для модифікації віртуальної пам'яті процеса. |
PROCESS_VM_READ |
Дозволяє з допомогою функції ReadProcessMemory зчитувати інформацію з адресного простору процеса. |
PROCESS_VM_WRITE |
Дозволяє модифікувати адресний простір процесу через функцію WriteProcessMemory. |
SYNCHRONIZE |
Використовується для означення процесу в очікуючих функціях (див. Лаботарорну роботу 5) |
bInheritHandle (вхідний) – визначає, чи буде створений дескриптор процесу передаватися породженим процесам. Цей параметер може приймати два значення TRUE – передається породженим процесам і FALSE – не передається.
DwProcessId – вказує ідентифікатор процеса, яким треба керувати.
Вихідні значення
Якщо функція виконалася успішно, то повернуте значення є відкритим дескриптором вказаного процеса. Якщо сталася помилка, повертається NULL. Для отримання детальнішої інформації про помилку можна викликати функцію GetLastError.
Після завершення роботи з дескриптором процесу, цей дескриптор потрібно закрити з допомогою функції CloseHandle.