DuplicateHandle: нужно открыть процесс, но доступ запрещен


С помощью Windows hooks я отправляю сообщения в свое приложение, которое получает уведомления о событиях Windows от каждого приложения в системе.

Для выполнения Маршала параметров сообщения я использую общие воспоминания. Внешний процесс вызывает DuplicateHandle , но для совместного использования дескриптора с экземпляром моего приложения он должен вызвать OpenProcess с требованиями привилегий PROCESS_DUP_HANDLE.

На самом деле каждое приложение может отправлять сообщения, используя это архитектура, даже если мне нужно включить SeDebugPrivilege для внешнего процесса. Это действительно работает, за исключением процесса 'explorer', который не имеет маркера SeDebugPrivilege...

Документация AdjustTokenPrivileges гласит:

Функция AdjustTokenPrivileges не может добавлять новые привилегии к маркеру доступа. Он может только включать или отключать существующие привилегии токена. Чтобы определить привилегии токена, вызовите команду GetTokenInformation функция.

Итак, вопрос в том... как добавить маркер SeDebugPrivilege к процессу 'explorer', или как разрешить процессу 'explorer' вызывать OpenProcess(PROCESS_DUP_HANDLE, FALSE, pId)?

2 2

2 ответа:

Я не понимаю, почему вы не используетеименованную общую память. Если у ваших объектов общей памяти есть имя, то эти объекты можно открыть без использования DuplicateHandle.

Если вам нужно использовать DuplicateHandle и нужно уметь использовать OpenProcess(PROCESS_DUP_HANDLE, FALSE, pId) внутри любого процесса, я считаю, что вы не должны использовать SeDebugPrivilege. Вместо этого вы должны предоставить разрешение из PROCESS_DUP_HANDLE всем для процесса с pId. При создании процесса можно указать дескриптор безопасности. Если процесс идет уже созданный вы можете использовать OpenProcess, GetSecurityInfo (см. http://msdn.microsoft.com/en-us/library/aa446654.aspx ) и SetSecurityInfo для изменения дескриптора безопасности процесса.

Чтобы проверить этот подход, вы можете просто запустить Process Explorer (см. http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx ) с правами администратора откройте вкладку Безопасность выбранного процесса (process with pId) и измените его дескриптор безопасности. После этого все процессы смогут использовать OpenProcess(PROCESS_DUP_HANDLE, FALSE, pId) без включения SeDebugPrivilege.

Это то, что вы пытаетесь сделать?

  1. Создайте блок общей памяти во" внешнем " процессе.
  2. Используйте DuplicateHandle для создания дескриптора этой памяти в приложении
  3. Используйте сообщение окна для отправки значения дескриптора в приложение
  4. доступ к общей памяти в приложении

Если я правильно понял, то вам вообще не нужно открывать дескриптор для вашего процесса подачи заявки. Вместо этого просто дайте общее блок памяти детерминированное имя, например SharedMem_XXX, где XXX-это PID внешнего процесса. Затем отправьте PID в приложение с помощью сообщения окна. Затем он может воссоздать имя и использовать его для открытия блока общей памяти.