Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС СФМЭИ.doc
Скачиваний:
22
Добавлен:
17.09.2019
Размер:
1.37 Mб
Скачать

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 на примере получения информации о всех загруженных процессах:

  1. В области переменных определяется переменная, имеющая тип tProcessEntry32, представляющий структуру, куда будет заноситься информации об очередном процессе;

  2. Вызывается функция CreateToolhelp32SnapShot для создания «моментального снимка операционной системы»;

  3. Вызывается функция Process32First, которая возвращает в структуре tProcessEntry32 информацию о первом выполняемом процессе и описатель (дескриптор) следующего процесса в цепочке процессов;

  4. В цикле вызывается функция Process32Next, которая возвращает в структуре tProcessEntry32 информацию об очередном выполняемом процессе и описатель (дескриптор) следующего процесса в цепочке процессов. Цикл опроса продолжается до тех пор, пока результат выполнения функции Process32Next не станет равным False.

Для работы с остальными функциями ToolHelp применяется аналогичный алгоритм.

6.2.8. Как получить карту памяти любого процесса

Для получения карты памяти любого процесса можно использовать следующий алгоритм:

  1. С помощью функций Process32First и Process32Next получить список всех процессов в системе, запоминая их идентификаторы;

  2. Выбрать из списка интересующий вас процесс;

  3. Зная идентификатор процесса получить дескриптор процесса с помощью функции Open Process;

  4. Зная дескриптор процесса можно получить карту памяти, используя функцию 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-функций