- •Лабораторная работа №5. Перехват системных сервисов Цель работы
- •Драйвер-фильтр вызовов системных сервисов.
- •Модификация диалоговой прикладной программы управления драйверами для тестирования драйвера перехвата системных сервисов
- •Пояснения
- •1. Работа с таблицей системных сервисов
- •2. Получение имени текущего процесса
- •Лабораторная работа №6. Получение копии адресного пространства указанного процесса
- •Драйвер-фильтр получения копии адресного пространства на уровне vaDи на уровне каталога-таблиц страниц.
- •Модификация диалоговой прикладной программы управления драйверами для тестирования драйвера получения копии адресного пространства
- •Пояснения
- •1. Получение списка процессов:
- •2, 3. Получение адреса структуры peBпоPid, переключение адресного пространства на нужный процесс по егоPiDс помощью недокументированных функцийKeAttachProcess()/KeDetachProcess()
- •4. Работа с деревом виртуальных адресных дескрипторов процесса (vad): получение снимка адресного пространства на уровнеVad
- •5. Работа с каталогом страниц (см. Также п.11.3 в документации “PentiumProcessor.Pdf”):
- •6. Работа с файлами на уровне драйвера
2. Получение имени текущего процесса
Расположение имени процесса не документировано. Известно только , что оно расположено недалеко от начала структуры EPROCESS, описывающей процесс. Кроме того, известно, что для всех процессов для данного сеанса работы компьютера это смещение одинаково. Отсюда вытекает принцип поиска имени: для процесса с известным именем ищем это имя в памяти, полученное смещение используем для получения имен других процессов.
Проще всего поиск смещения осуществлять в функции DriverEntry: известно, что эта функция работает в системном контексте, т.е. в контексте процесса “System”. Соответственно, запрашиваем адрес структурыEPROCESSдля процесса “System” путем вызова =PsGetCurrentProcess(), производим поиск строки “System” от начала этой структуры, запоминаем полученное смещение.
В любом неизвестном контексте процесса опять запрашиваем адрес его структуры EPROCESS, по запомненному смещению в ней будет лежать имя процесса.
//----------------------------------------------------------------------
ULONG GetProcessNameOffset( VOID )
{
PEPROCESS curproc;
int i;
curproc = PsGetCurrentProcess();
//
// Scan for 12KB, hopping the KPEB never grows that big!
//
for( i = 0; i < 3*PAGE_SIZE; i++ ) {
if( !strncmp( SYSNAME, (PCHAR) curproc + i, strlen(SYSNAME) )) {
return i;
}
}
//
// Name not found - oh, well
//
return 0;
}
Лабораторная работа №6. Получение копии адресного пространства указанного процесса
Навыки, получаемые при реализации данной работы:
Получение на прикладном уровне списка процессов, запущенных на компьютере, и их PID.
На уровне драйвера – получение адреса структуры PEBпоPID.
На уровне драйвера – переключение адресного пространства на нужный процесс по его PIDс помощью недокументированных функцийKeAttachProcess()/KeDetachProcess().
работа с деревом виртуальных адресных дескрипторов процесса (VAD): получение снимка адресного пространства на уровнеVAD(VirtualAddressDescriptors).
Работа с каталогом страниц.
Работа с файлами на уровне драйвера.
Дополнительная информация: “WindowsNTNativeAPI.pdf”
Драйвер-фильтр получения копии адресного пространства на уровне vaDи на уровне каталога-таблиц страниц.
Принцип реализации:
При загрузке драйвер должен создать эксклюзивное устройство GuiDevice, которое будет обрабатывать 1 код управления – получить копию адресного пространства указанного процесса.
Получив из управляющей программы идентификатор процесса (PID), переключиться на адресное пространство этого процесса
Найти первый элемент дерева VAD, провести полный обход дерева с сохранением каждого блока памяти, описываемого элементом VAD, в файл. В другой файл писать структуру блоков (адрес и размер блока в адресном пространстве, смещение до начала этого блока в файле).
Либо
Проход по всем элементам таблиц страниц и сохранение в файл присутствующих страниц.
Восстановить прежнее адресное пространство.
Модификация диалоговой прикладной программы управления драйверами для тестирования драйвера получения копии адресного пространства
Через вызов NtQuerySystemInformationреализовать получение списка всех процессов и ихPID.
Обновлять содержимое элемент управления со списком процессов по нажатию кнопки.
Реализовать кнопку, при нажатии на которую драйверу отправляется команда сохранения адресного пространства указанного процесса в файл. Процесс выбирать из элемента управления со списком процессов. Процесс однозначно идентифицируется значением PID, именно его отправлять в драйвер.
