STRUC THREADENTRY32
dwSize DWORD?; Довжина структури в байтах
cntUsage DWORD?; Кількість посилань на потік (потік виконується, коли
; це значення не рівне нулю)
th32ThreadID DWORD?; Ідентифікатор потоку (сумісний з ідентифікатором,
; який повертає функція CreateProcess)
th32OwnerProcessID DWORD?; Ідентифікатор процесу, який створив цей потік
tpBasePri DWORD?; Початковий рівень пріоритету потоку (від 0 до 255)
tpDeltaPri DWORD?; Зміна рівня пріоритету по відношенню до початкового
; (знакове ціле, яке відображає цю зміну)
dwFlags DWORD?; Зарезервовано системою
th32AccessKey DWORD?; Масив з бітів, кожен з яких визначає права
; доступу до адресного простору процесу
th32CurrentProcessID DWORD?; Ідентифікатор процесу в якому виконується потік
ENDS THREADENTRY32
Перегляд хіпів асоційованих з процесом
Щоб переглянути хіпи зі списку деякого процесу використовуються функції 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
Перегляд модулів, які використовує процес
Щоб переглянути модулі, які використовуються деяким процесом треба викликати функції 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
Керування процесами
Щоб здійснити керування процесом потрібно обов'язково відкрити його дескриптор з допомогою функції 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.
Хід роботи
1. Ознайомитись з основними теоретичними відомостями даної лабораторної роботи.
2. Ознайомитись з приведеними в додатках прикладами програм.
3. Ознайомитись з додатковими джерелами, приведеними в п. 11 (Література).
4. Затвердити номер індивідуального завдання у викладача.
5. Виконати завдання згідно з номером.
Зміст звіту
Звіт повинен містити:
- титульну сторінку;
- мету роботи;
- завдання, робочий варіант тексту програми, результат виконання програми;
- короткі висновки по проведеній роботі.
Завдання
На 75 балів виконати 4 завдання:
Програма розробляється на мові асемблер для ОС Windows, використовуючи пакет MASM32. Результат виводиться на екран консолі.
1. Зробити програму, яка виводить назву ехе-файла, для першого процесу в списку процесів.
2. Вдосконалити програму таким чином, щоб вона виводила назви та ідентифікатори всіх процесів в системі.
3. Добавити вивід кількості потоків для кожного процесу.
4. Зробити так, щоб ця програма кожні 2 сек. записувала в файл назви ехе-файлів, ідентифікатори і кількість потоків для всіх процесів у системі. Коли файл вже існує новий список повинен заміняти старий.