- •Лабораторная работа №5. Перехват системных сервисов Цель работы
- •Драйвер-фильтр вызовов системных сервисов.
- •Модификация диалоговой прикладной программы управления драйверами для тестирования драйвера перехвата системных сервисов
- •Пояснения
- •1. Работа с таблицей системных сервисов
- •2. Получение имени текущего процесса
- •Лабораторная работа №6. Получение копии адресного пространства указанного процесса
- •Драйвер-фильтр получения копии адресного пространства на уровне vaDи на уровне каталога-таблиц страниц.
- •Модификация диалоговой прикладной программы управления драйверами для тестирования драйвера получения копии адресного пространства
- •Пояснения
- •1. Получение списка процессов:
- •2, 3. Получение адреса структуры peBпоPid, переключение адресного пространства на нужный процесс по егоPiDс помощью недокументированных функцийKeAttachProcess()/KeDetachProcess()
- •4. Работа с деревом виртуальных адресных дескрипторов процесса (vad): получение снимка адресного пространства на уровнеVad
- •5. Работа с каталогом страниц (см. Также п.11.3 в документации “PentiumProcessor.Pdf”):
- •6. Работа с файлами на уровне драйвера
6. Работа с файлами на уровне драйвера
Описатель файла (HANDLE) имеет смысл только в контексте того адресного пространства, в котором он был создан. В нашем случае – нельзя вначале открыть файл, затем переключить адресное пространство с помощьюKeAttachProcess, а затем что-то в этот файл записать -
создание либо открытие файла (см. флаги в ZwCreateFile):
HANDLE MyCreateFile(WCHAR *fullfname)
{
UNICODE_STRING FullFileName;
OBJECT_ATTRIBUTES ObjectAttributes;
NTSTATUS ntStatus;
IO_STATUS_BLOCK IoStatus;
HANDLE NtFileHandle;
RtlInitUnicodeString(&FullFileName, fullfname);
InitializeObjectAttributes ( &ObjectAttributes,
&FullFileName,
OBJ_CASE_INSENSITIVE,
NULL,
NULL );
DbgPrint("DRV: opening file...\n");
ntStatus = ZwCreateFile( &NtFileHandle,
SYNCHRONIZE|GENERIC_WRITE, // либо SYNCHRONIZE|FILE_APPEND_DATA
&ObjectAttributes,
&IoStatus,
NULL, // alloc size = none
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ,
FILE_OVERWRITE_IF,
FILE_WRITE_THROUGH|FILE_SYNCHRONOUS_IO_NONALERT,
NULL, // eabuffer
0 ); // ealength
DbgPrint("DRV: create file trace.bin with status %lx\n", ntStatus);
returnNtFileHandle;
}
Запись в файл (чтение – по аналогии ZwReadFile):
void save(HANDLE NtFileHandle, void *buf, ULONG bsize)
{
NTSTATUS ntStatus;
IO_STATUS_BLOCK IoStatus;
DbgPrint("DRV: writing...\n");
ntStatus = ZwWriteFile( NtFileHandle,
NULL,
NULL,
NULL,
&IoStatus,
buf,
bsize,
NULL,
NULL );
DbgPrint("DRV: write file with status %lx\n", ntStatus);
}
Закрытие файла:
ZwClose(NtFileHandle);