Доброго времени суток. Разрабатываю драйвер для x64. Есть драйвер под x86-32, который устанавливает SSTD хук на ZwOpenProcess, необходим аналог на x64. - В смежной теме подсказали смотреть в сторону ObRegisterCallbacks(). - Пытался в интернете найти какие-то исходники или статьи по конкретной работе с данным мини-фильтром, но так и не нашел. P.S. -> Может кто-то подсказать ссылки, статьи, исходники где используется ObRegisterCallbacks(), чтобы посмотреть в деле, а то одно описание этого.
Никаких статей и исходников тут не нужно, всё предельно просто. Единственное, что нужно учесть, это, во-первых, что драйвер, использующий эти колбеки, должен в обязательном порядке иметь цифровую подпись (тестовая тоже подойдёт), во-вторых, тебе придётся заказать уникальное значение для Altitude ID во избежание коллизий, и наконец, в-третьих, драйвер должен быть собран с флагом Integrity Check в заголовке PE-файла: Sources Код (Text): LINKER_FLAGS=/INTEGRITYCHECK P.S. Интересно, я один вообще, кто пишет об этом на форумах?
x64 Зачем заказывать, если ты уверен что у юзверей "Софт_Х" (из списка занятых) в 99,9% случаев установлен не будет. MuForum Много вопросов на форуме задаёшь. Я год назад ровно с такими вопросами столкнулся, но все ответы нашёл как на wasm'е , так и в инете (кодес юзающий ObRegisterCallbacks() там есть).
# Вопрос: Каким образом в функции PreProcCreateRoutine() определить, к какому процессу(PID) идёт обращение? - Необходимо узнать PID процесса, который пытаются открыть. MSDN смотрел, ответ не нашел... 1. OB_CALLBACK_REGISTRATION Structure; 2. OB_OPERATION_REGISTRATION Structure; 3. ObjectPreCallback Routine; 4. OB_PRE_OPERATION_INFORMATION Structure; Код (Text): OB_PREOP_CALLBACK_STATUS PreProcCreateRoutine(IN PVOID RegistrationContext, IN POB_PRE_OPERATION_INFORMATION OperationInformation) { DbgPrint("PreProcCreateRoutine();\n"); return OB_PREOP_SUCCESS; } В 32-разрядной системе: Код (Text): NTSTATUS NtOpenProcessNew(OUT PHANDLE ProcessHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN PCLIENT_ID ClientId OPTIONAL) { ... PID = ClientId->UniqueProcess; ... } P.S. -> Можно как-то сделать аналог на x64? # Дополнение: В структуре OB_PRE_OPERATION_INFORMATION есть поле Object. - Но, как узнать PID процесса?
Примерно так: Код (Text): ULONG uProcessId = 0; uProcessId = (ULONG) PsGetProcessId (OpInfo -> Object); Не забудь только проверить, что колбек вызван именно для процесса.
# Вопрос: Как заблокировать доступ к процессу зная его PID? # x86: Код (Text): NTSTATUS NtOpenProcessNew(OUT PHANDLE ProcessHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN PCLIENT_ID ClientId OPTIONAL) { ... ULONG uPID = (ULONG)ClientId->UniqueProcess; // ---- if ( uPID == 2148 ) { return STATUS_ACCESS_DENIED } ... } # x64: Код (Text): OB_PREOP_CALLBACK_STATUS PreProcCreateRoutine(IN PVOID RegistrationContext, IN POB_PRE_OPERATION_INFORMATION OpInfo) { ULONG uProcessID = 0; // ---- if ( OpInfo->ObjectType != *PsProcessType ) return OB_PREOP_SUCCESS; // ---- uProcessID = (ULONG)PsGetProcessId(OpInfo->Object); // ---- if ( uProcessID == 2148 ) { DbgPrint("PreProcCreateRoutine();\n"); // ---- return STATUS_ACCESS_DENIED; // Вот тут мне надо как-то заблокировать доступ к процессу. } return OB_PREOP_SUCCESS; } P.S. -> Я смотрел MSDN, там сказано что функция PreProcCreateRoutine() может возвращать только результат OB_PREOP_SUCCESS. (ObjectPreCallback returns an OB_PREOP_CALLBACK_STATUS value. Drivers must return OB_PREOP_SUCCESS.) - Может тогда как-то через доступ? Код (Text): OpInfo->Parameters->CreateHandleInformation.DesiredAccess = что-то; либо OpInfo->Object = NULL; // Но это думаю не совсем корректно. P.S. -> В общем прошу помочь/подсказать, как правильно сделать данную задачу. - Заранее спасибо.
Идеология этих колбеков такова, что не позволяет фильтрам полностью запрещать доступ к объектам. Вместо этого фильтру разрешается лишь урезать клиента в правах к целевому объекту (добавлять права нельзя). Например, чтобы запретить убийство целевого процесса, можно написать так: Код (Text): pOpInfo -> Parameters.CreateHandleInformation.DesiredAccess = pOpInfo -> Parameters.CreateHandleInformation.OriginalDesiredAccess & ~PROCESS_TERMINATE;
Благодарю за ответ. Обратился к MSDN и нашел описание OB_PRE_CREATE_HANDLE_INFORMATION Structure, НО, при добавление тогоже PROCESS_TERMINATE, компилятор ругается, что незнаком с такой константой/макросом. P.S. -> Что необходимо подключить, чтобы данный константы/макросы компилятор видел? # Добавлено: Прописать самим макросы.