Есть драйвер режима ядра. Вычитал, что получить хендл процесса в обход NtOpenProcess можно через функцию NtDuplicateObject. Собственно, её вид: NTSTATUS NtDuplicateObject ( IN HANDLE SourceProcessHandle, IN PHANDLE SourceHandle, IN HANDLE TargetProcessHandle, OUT PHANDLE TargetHandle, IN ACCESS_MASK DesiredAccess OPTIONAL, IN BOOLEAN InheritHandle, IN ULONG Options ) Задача:есть процесс с PID=xxx, который нельзя разрешать дублировать. Я ставлю перехватчик на эту функцию. И тут встает вопрос, что делать дальше? Я так понимаю, что SourceProcessHandle (или SourceHandle??) и есть хендлом процесса, который пытаются дублировать. Мне же нужно узнать ПИД это самого процесса, дабы сравнить с подзащитным. Как это сделать? Читал, что можно через вызов NtOpenProcess, но не понял, как именно, откуда брать параметры для её вызова, а именно IN PCLIENT_ID ClientId OPTIONAL, из которого потом и получаем ПИД. Подскажите, пожалуйста, как поступить. Спасибо!
Короче, рассказываю. Тебе нужно контролировать создание хендлов на свой процесс. Хендлы в приложениях можно создавать либо через NtOpenProcess(), либо через NtDuplicateHandle(), соответственно, тебе следует контролировать оба сервиса. С первым всё понятно, а со вторым тебе нужно проверять значение SourceHandle, при чём сравнивать желательно не с ID защищаемого процесса, а с адресом его объекта (EPROCESS), для этого используй ObReferenceObjectByHandle(). Но в твоей схеме могут быть проблемы с системными процессами, т.к. некоторые из них открывают процессы для собственных нужд, например, CSR любит этим баловаться, насколько я в курсе, т.е. всем подряд запрещать открытие нельзя. Я советую, во-первых, вести список исключений, т.е. например, процессу CSR разрешать открывать твой процесс, ну и так далее, и во-вторых, начиная с Vista SP1 рекомендую использовать соответствующий колбек ObRegisterCallbacks(), который как раз и перехватывает все необходимые тебе операции.