Как заблокировать dll-инъекцию через Minifilter - PullRequest
0 голосов
/ 03 февраля 2020

Я пытаюсь block .dll инъекция (или общая инъекция) в конкретный c процесс через Минифильтр

Это мой PreOperationCallback:

    if (Data->Iopb->MajorFunction == IRP_MJ_ACQUIRE_FOR_SECTION_SYNCHRONIZATION) {
        /* Open file for writing/appending? */
        if ((Data->Iopb->Parameters.Create.SecurityContext->DesiredAccess & PAGE_EXECUTE) == PAGE_EXECUTE) {
            if (security) {
                DbgPrint("[ miniFilter ] [IRP_MJ_ACQUIRE_FOR_SECTION_SYNCHRONIZATION] [ Blocked ]\n");
                Data->IoStatus.Status = STATUS_ACCESS_DENIED;
                return FLT_PREOP_COMPLETE;
            }
        }
        if ((Data->Iopb->Parameters.Create.SecurityContext->DesiredAccess & FILE_EXECUTE) == FILE_EXECUTE) {
            if (security) {
                DbgPrint("[ miniFilter ] [IRP_MJ_ACQUIRE_FOR_SECTION_SYNCHRONIZATION] [ Blocked ]\n");
                Data->IoStatus.Status = STATUS_ACCESS_DENIED;
                return FLT_PREOP_COMPLETE;
            }
        }
    }
}

По другим форумам IRP_MJ_ACQUIRE_FOR_SECTION_SYNCHRONIZATION будет вызываться на DLL Injection! Я также попытался "IRP_MJ_CREATE", но затем я также блокирую любое выполнение файлов .exe. Фильтрацию расширения файла можно легко обойти ...

Надеюсь, кто-то знает об этом больше;)

1 Ответ

1 голос
/ 04 февраля 2020

Минифильтр для этого не подходит. AcquireForSectionSyn c вызывается, когда процесс вызывает CreateFileMapping / ZwCreateSection. Предположим, ProcessA хочет внедрить DLL в ProcessB. Он может создать удаленный поток, который заставит ProcessB вызвать LoadLibrary. В этот момент ваш фильтр увидит, что ProcessB вызывает AcquireForSection syn c, что делает каждый процесс при запуске, так как загрузчик загружает все базовые библиотеки c, такие как: ntdll, kernel32, et c ...

То, что вы хотите, это обратные вызовы Оби. Эти обратные вызовы позволят вам не допустить открытия процесса другим процессом. Пожалуйста, проверьте, что здесь

Представьте, что у вас есть сценарий, в котором ProcessA хочет внедрить что-то в ProcessB с помощью некоторой манипуляции CreateRemoteThread / ReadWriteProcessMemory.

ProcessA : OpenProcess (ProcessB, PROCESS_VM _...);

YouDriverObCallbackRoutine () {Проверьте, должен ли ProcessA иметь доступ, он запрашивает ProcessB. Если нет, вы можете просто убрать доступ и вернуться. } Это приведет к тому, что ProcessA будет иметь дескриптор без этих прав на ProcessB. Теперь, когда ProcessA пытается вызвать CreateRemoteThread / ReadProcessMemory / WriteProcessMemory в ProcessB, система откажет в доступе, поскольку дескриптор больше не имеет этих прав (вы удалили их в обратном вызове Ob).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...