DuplicateHandle: нужно OpenProcess, но доступ запрещен - PullRequest
2 голосов
/ 04 августа 2010

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

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

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

В документации AdjustTokenPrivileges говорится:

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

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

Ответы [ 2 ]

3 голосов
/ 04 августа 2010

Я не понимаю, почему вы не используете с именем разделяемой памяти.Если ваши объекты общей памяти имеют имя, то эти объекты можно открыть без использования 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) с правами администратора, откройте вкладку Безопасность выбранного процесса (процесс с pId) и измените его дескриптор безопасности. После этого все процессы смогут использовать OpenProcess(PROCESS_DUP_HANDLE, FALSE, pId) без включения SeDebugPrivilege.

1 голос
/ 04 августа 2010

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

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

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

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