Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
vazhnoe.docx
Скачиваний:
6
Добавлен:
01.07.2025
Размер:
843 Кб
Скачать
☆

56. Перехват api-вызовов создания и уничтожения процессов и потоков ос Windows в режиме ядра.

Процедура перехвата создания и уничтожения процесса:

NTSTATUS PsSetCreateProcessNotifyRoutineEx( CREATE_PROCESS_NOTIFY_ROUTINE_EX* NotifyRoutine, bool Remove); параметр Remove выбирает между регистрацией и удалением.

void ProcessNotifyEx(EPROCESS* Process, HANDLE ProcessId, PS_CREATE_NOTIFY_INFO* CreateInfo) – формат NotifyRoutine.

Процедура вызываются на уровне приоритета прерываний PASSIVE_LEVEL в контексте потока, вызывающего создание описателя.

struct PS_CREATE_NOTIFY_INFO { SIZE_T Size; union { ULONG Flags; struct { ULONG FileOpenNameAvailable :1; ULONG Reserved :31; }; }; HANDLE ParentProcessId; CLIENT_ID CreatingThreadId; FILE_OBJECT* FileObject; const UNICODE_STRING* ImageFileName; const UNICODE_STRING* CommandLine; NTSTATUS CreationStatus; };

Процедура программиста может запретить создание процесса, если установит в поле CreateInfo->CreationStatus ненулевой код ошибки.

ОС позволяет зарегистрировать не более 12 таких процедур перехвата.

Устаревшая процедура перехвата в версиях до Windows Vista:

PsSetCreateProcessNotifyRoutine() – по формату аналогична.

void ProcessNotify(HANDLE ParentId, HANDLE ProcessId, bool Create); Уведомление без возможности запретить создание/удаление процесса.

Процедура перехвата создания и уничтожения потока:

NTSTATUS PsSetCreateThreadNotifyRoutine( CREATE_THREAD_NOTIFY_ROUTINE* NotifyRoutine);

NTSTATUS PsRemoveCreateThreadNotifyRoutine( CREATE_THREAD_NOTIFY_ROUTINE* NotifyRoutine);

void ThreadNotify(HANDLE ProcessId, HANDLE ThreadId, bool Create);

Создание и удаление потока отменить нельзя.

Обычно используется драйверами для очистки создаваемых для потоков ресурсов.

ОС позволяет зарегистрировать не более 8 таких процедур перехвата.

57. Перехват операций с реестром в ос Windows в режиме ядра.

Процедура перехвата операций с реестром Windows:

NTSTATUS CmRegisterCallbackEx(EX_CALLBACK_FUNCTION* Function, const UNICODE_STRING* Altitude, void* Driver, void* Context, LARGE_INTEGER* Cookie, void* Reserved); CmRegisterCallback() устарела.

NTSTATUS CmUnRegisterCallback(LARGE_INTEGER Cookie);

NTSTATUS RegistryCallback(void* Context, REG_NOTIFY_CLASS Argument1, void* Argument2); // Argument2 – указатель на REG_XXX_INFORMATION.

Процедура перехвата операций с реестром может выполнять: мониторинг, блокировку (XP и выше) и модификацию (Vista и выше).

Если операция предотвращается с помощью STATUS_CALLBACK_BYPASS, вызывающий поток получает STATUS_SUCCESS. Если операция предотвращается с помощью кода ошибки, поток получает ее код.

В процедуре перехвата при создании ключа реестра можно назначить ключу отдельный контекст, который будет передаваться в процедуру с уведомлениями REG_XXX_KEY_INFORMATION:

NTSTATUS CmSetCallbackObjectContext(void* Object, LARGE_INTEGER* Cookie, void* NewContext, void** OldContext);

При ассоциации контекста с ключом реестра, процедуре перехвата будет послано уведомление об уничтожении ключа.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]