- •Введение
- •1. Лабораторная работа № 1
- •1.1. Цель работы
- •1.2. Теоретическое введение
- •1.2.1. Получение информации об операционной системе
- •1.2.2. Получение информации из реестра
- •1.2.3. Получение информации о системных каталогах Windows
- •1.2.4. Получение информации о диске
- •1.3. Создание приложения для получения характеристик компьютера и операционной системы
- •Контрольные вопросы
- •2. Лабораторная работа №2
- •2.1.Цель работы
- •2.2. Теоретическое введение
- •2.2.1. Процедуры и функции для работы с виртуальной памятью
- •2.3. Создание приложения, работающего с виртуальной памятью
- •2.4. Задание для самостоятельной работы
- •Контрольные вопросы
- •3. Лабораторная работа № 3
- •3.1. Цель работы
- •3.2. Пример использования механизма выделения виртуальной памяти для решения конкретных задач
- •3.3. Задания для самостоятельной работы
- •Контрольные вопросы
- •4. Лабораторная работа № 4
- •4.1. Цель работы
- •4. 2. Теоретическое введение
- •4.2.1 Создание или открытие объекта ядра «файла»
- •4.2.2 Создание объекта ядра «файл, проецируемый в память»
- •4.2.3 Проецирование файловых данных на адресное пространство процесса
- •4.2.4 Отмена проецирования на адресное пространство процесса объекта ядра «файл, проецируемый в память»
- •4.2.5 Закрытие объектов ядра «файл, проецируемый в память» и «файл»
- •4.3 Примеры программ, выполняющих проецирование в память
- •4.3.1 Пример 1
- •4.3.2 Пример 2
- •4.4. Задания для самостоятельной работы
- •Контрольные вопросы
- •5. Лабораторная работа № 5
- •5.1.Цель работы
- •5.2. Теоретическое введение
- •5.2.1. Создание процесса
- •5.2.2. Запуск внешней программы функцией WinExec
- •5.2.3. Запуск внешней программы и открытие документа функцией ShellExecute
- •При успешном выполнении функция ShellExecute возвращает целое значение, большее 32. Значение меньшее или равное 32 указывает на ошибку. Значения эти те же, что и для функции WinExec.
- •5.2.4. Создание потока
- •5.2.5. Завершение процесса
- •5.2.6. Завершение потока
- •5.2.7. Изменение класса приоритета процесса
- •5.2.8. Получение информации о классе приоритета процесса
- •5.2.9. Изменение уровня приоритета потока
- •5.2.10. Получение информации о приоритете потока
- •5.3. Примеры программ для работы с процессами и потоками
- •5.3.1. Создание процесса с помощью функции CreateProcess.
- •5.3.2. Создание процесса с помощью функции WinExec.
- •5.3.3. Создание процесса с помощью функции ShellExecute.
- •5.3.4. Создание многопоточного приложения.
- •5.4. Задания для самостоятельной работы
- •Контрольные вопросы
- •6. Лабораторная работа № 6
- •6.1. Цель работы
- •6.2. Теоретическое введение
- •6.2.1. Получение «мгновенного снимка» системы
- •6.2.2. Получение информации о процессах
- •6.2.3. Получение информации о потоках
- •6.2.4. Получение информации о модулях
- •6.2.5. Информация о кучах (heap)
- •6.2.6. Информация о виртуальной памяти.
- •6.2.7. Алгоритм работы функций ToolHelp
- •6.2.8. Как получить карту памяти любого процесса
- •6.3. Пример использования функций ToolHelp
- •6.4. Задания для самостоятельной работы
- •Контрольные вопросы
- •7. Лабораторная работа № 7
- •7.1. Цель работы
- •7.2. Теоретическое введение
- •7.2.1. Критические секции
- •7.2.2. Синхронизация с использованием объектов ядра
- •7.2.3. Wait-функции
- •7.2.4. Синхронизация с использованием процессов и потоков
- •7.2.5. Объекты Mutex
- •7.2.6. Семафоры
- •7.2.7. События
- •7.3 Примеры работы с объектами синхронизации
- •7.3.1 Пример 1
- •7.3.1 Пример 2
- •7.4. Задания для самостоятельной работы
- •Контрольные вопросы
- •8. Лабораторная работа № 8
- •8.1. Цель работы
- •8.2 Теоретическое введение
- •8.2.1 Создание dll
- •8.2.2 Неявная загрузка dll
- •8.2.3 Явная загрузка dll
- •8.2.4 Внедрение dll в адресное пространство другого процесса
- •8.3 Пример работы с dll
- •8.3.1 Создание dll, которая выполняет перехват нажатых клавиш
- •8.3.2 Разработка приложения, которое выполняет анализ и обработку нажатых клавиш.
- •8.4 Индивидуальные задания
- •Контрольные вопросы
- •9.2.2. Функции для работы с объектом «уведомление об изменении файловой системы»
- •9.3. Пример работы системы уведомления об изменениях в файловой системе
- •9.4. Задания для самостоятельной работы
- •Контрольные вопросы
- •Литература
- •214013 Г. Смоленск, Энергетический проезд, 1
6.2.6. Информация о виртуальной памяти.
Для просмотра виртуальной памяти определена функция Toolhelp32ReadProcessMemory, позволяет получить информацию о регионах адресного пространства выбранного процесса. Процесс определяется по идентификатору.
Функция Toolhelp32ReadProcessMemory имеет следующий вид:
function Toolhelp32ReadProcessMemory(th32ProcessID: DWORD; lpBaseAddress: Pointer; var lpBuffer; cbRead: DWORD; var lpNumberOfBytesRead: DWORD): Boolean;
где
th32ProcessID – Идентификатор процесса, блок памяти которого копируется. Если этот параметр равен 0, то копируется блок памяти текущего процесса;
lpBaseAddress – базовый адрес копируемого блока памяти;
lpBuffer – адрес буфера, куда помещается копируемый из выбранного процесса блок памяти;
cbRead – размер в байтах , читаемого блока памяти;
lpNumberOfBytesRead –– указатель на буфер в памяти, где будет записано количество реально прочитанных байт. Если это параметр – nil, он будет игнорироваться функцией.
Функция Toolhelp32ReadProcessMemory при успешном выполнении возвращает значение TRUE.
6.2.7. Алгоритм работы функций ToolHelp
Рассмотрим алгоритм работы функций Toolhelp на примере получения информации о всех загруженных процессах:
В области переменных определяется переменная, имеющая тип tProcessEntry32, представляющий структуру, куда будет заноситься информации об очередном процессе;
Вызывается функция CreateToolhelp32SnapShot для создания «моментального снимка операционной системы»;
Вызывается функция Process32First, которая возвращает в структуре tProcessEntry32 информацию о первом выполняемом процессе и описатель (дескриптор) следующего процесса в цепочке процессов;
В цикле вызывается функция Process32Next, которая возвращает в структуре tProcessEntry32 информацию об очередном выполняемом процессе и описатель (дескриптор) следующего процесса в цепочке процессов. Цикл опроса продолжается до тех пор, пока результат выполнения функции Process32Next не станет равным False.
Для работы с остальными функциями ToolHelp применяется аналогичный алгоритм.
6.2.8. Как получить карту памяти любого процесса
Для получения карты памяти любого процесса можно использовать следующий алгоритм:
С помощью функций Process32First и Process32Next получить список всех процессов в системе, запоминая их идентификаторы;
Выбрать из списка интересующий вас процесс;
Зная идентификатор процесса получить дескриптор процесса с помощью функции Open Process;
Зная дескриптор процесса можно получить карту памяти, используя функцию VirtualQueryEx, которая описана в лабораторной работе № 2.
Функция Open Process имеет следующий вид:
function OpenProcess( dwDesiredAccess : DWORD; bInheritHandle: BOOL; dwProcessId: DWORD):THANDLE;
где
dwDesiredAccess – определяет вид доступа к данному объекту. Возможные значения параметра dwDesiredAccess приведены в таблице 6.7;
bInheritHandle – флаг определяет, может ли полученный дескриптор использоваться дочерними процессами. Если bInheritHandle установить в TRUE, то дескриптор является наследуемым;
dwProcessId – идентификатор процесса.
При успешном выполнении функция OpenProcess возвращает дескриптор процесса.
Таблица 6.7 Возможные значения параметра dwDesiredAccess
Параметр dwDesiredAccess |
Описание |
1 |
2 |
PROCESS_ALL_ACCESS |
Устанавливает все возможные значения флагов для данного объекта |
PROCESS_CREATE_PROCESS |
Дескриптор процесса будет использоваться для создания другого процесса |
PROCESS_CREATE_THREAD |
Дескриптор процесса будет использоваться для создания потока, как удаленного (внедренного в другой процесс), так и локального с помощью функций CreateRemoteThread и CreateThread |
PROCESS_DUP_HANDLE |
Дескриптор процесса будет использоваться для дублирования дескриптора процесса с помощью функции DuplicateHandle |
Продолжение таблицы 6.7
1 |
2 |
PROCESS_QUERY_INFORMATION |
Дескриптор процесса будет использоваться для получения информации о процессе с помощью функций GetExitCodeProcess и GetPriorityClass. Этот флаг также следует использовать для получения карты памяти в приведенном выше алгоритме |
PROCESS_SET_INFORMATION |
Дескриптор процесса будет использоваться для изменения класса приоритета процесса с помощью функции SetPriorityClass |
PROCESS_TERMINATE |
Дескриптор процесса будет использоваться для завершения процесса с помощью функции TerminateProcess f |
PROCESS_VM_OPERATION |
Дескриптор процесса будет использоваться для изменения виртуальной памяти процесса с помощью функций VirtualProtectEx и WriteProcessMemory |
PROCESS_VM_READ |
Дескриптор процесса будет использоваться для чтения содержимого виртуальной памяти процесса с помощью функции ReadProcessMemory |
PROCESS_VM_WRITE |
Дескриптор процесса будет использоваться для записи в виртуальную память процесса с помощью функции WriteProcessMemory |
SYNCHRONIZE |
Дескриптор процесса будет использоваться для ожидания завершения процесса с помощью Wait-функций |