WinAPI: OpenProcess () возвращает ошибку 5 с включенным SeDebugPrivilege для хост-процесса

У меня есть рутина, где я обрабатываю, чтобы получить HANDLE каждого процесса, когда я «иду» по списку (который работает нормально), но моя проблема заключается в следующем:

HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID) где PROCESS_ALL_ACCESS является токеном доступа, дескриптор наследования установлен в FALSEи pe32 является PROCESSENTRY32

GetLastError() возвращает код ошибки 5, и все сделанные дескрипторы являются адресами, которые не соответствуют ни одному подходящему процессу в Spy ++ 32/64 (я пытался создать приложение под обеими целями платформы, но, как и следовало ожидать, результат тот же).


Код для настройки SeDebugPrivilege для хост-процесса, который я использую:

BOOL EnableDebugPrivilege(BOOL bEnable)
{
HANDLE hToken = nullptr;
LUID luid;

if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) return FALSE;
if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid)) return FALSE;

TOKEN_PRIVILEGES tokenPriv;
tokenPriv.PrivilegeCount = 1;
tokenPriv.Privileges[0].Luid = luid;
tokenPriv.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;

if (!AdjustTokenPrivileges(hToken, FALSE, &tokenPriv, sizeof(TOKEN_PRIVILEGES), NULL, NULL)) return FALSE;

return TRUE;
}

Некоторые вопросы, которые будут вам полезны:

  1. Я использую Windows 7 x64 Professional.
  2. Да, devenv.exe запускается с правами «Запуск от имени администратора», что означает, что отладчик и само приложение запускаются с одинаковой привязкой.
  3. Я попытался отключить UAC или запустить приложение с отключенным UAC. Все еще код ошибки 5.
  4. Я просто попытался сделать это с PROCESS_QUERY_LIMITED_INFORMATION и я получаю код ошибки 6 или ERROR_INVALID_HANDLE, Также пытался с PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, результат снова ошибка 5.
  5. SeDebugPrivilege включен, проверяется с помощью SysInternals Process Explorer. Кроме того, все процессы, которые происходят из devenv / независимо от того, что называется отладчиком, наследуют SeDebugPrivilege, так что … это странно.

Спасибо всем большое за ваше время, я дошел до конца с этим вопросом: S

1

Решение

Вы уверены, что не передаете 0 в качестве значения идентификатора процесса? Процесс простоя системы с идентификатором 0 включен в снимок под именем [Системный процесс], но вы не можете открыть дескриптор для него, так как в документации для OpenProcess конкретно сказано, что он потерпит неудачу. Ну, это говорит немного больше:

Если указанный процесс является системным процессом (0x00000000),
Сбой функции и последний код ошибки ERROR_INVALID_PARAMETER. Если
указанный процесс является процессом Idle или одним из CSRSS
процессы, эта функция не выполняется и последний код ошибки
ERROR_ACCESS_DENIED, потому что их ограничения доступа препятствуют
код уровня пользователя от их открытия.

Ну, это не совсем верно, так как я смог открыть дескриптор CSRSS (конечно, у него нет запрошенных прав). Но это может не сработать для некоторых защищенных процессов (audiodg), поэтому вы не должны этого делать. Вместо этого проверьте название процесса, если это тот, который вы хотите.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]