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


person David S.    schedule 22.12.2013    source источник
comment
Возможный дубликат stackoverflow.com/questions/169355/   -  person Xearinox    schedule 22.12.2013
comment
@Xearinox: Я видел этот вопрос и применил то, что сказано в ответе: SeDebugPrivilege.   -  person David S.    schedule 22.12.2013
comment
Вам действительно нужны права PROCESS_ALL_ACCESS?   -  person Xearinox    schedule 22.12.2013
comment
@Xearinox: я пишу инжектор DLL, поэтому я хотел бы иметь возможность внедрять в любой процесс.   -  person David S.    schedule 22.12.2013
comment
Опять же, а вам действительно нужны все права?   -  person Xearinox    schedule 22.12.2013
comment
@Xearinox: Я только что попытался сделать OpenProcess() с PROCESS_QUERY_LIMITED_INFORMATION, и GetLastError() вернул ошибку 6 или ERROR_INVALID_HANDLE :(   -  person David S.    schedule 22.12.2013
comment
У меня сейчас нет машины WIN 7, так что могу только догадываться. Может попробовать PROCESS_QUERY_INFORMATION | PROCESS_VM_READ. Возможно, EnableDebugPrivilege не работает. Может у вас ошибка в другом месте. Я не вижу никаких ошибок при проверке. :-)   -  person Xearinox    schedule 22.12.2013
comment
@Xearinox: это также дает ошибку 5, но EnableDebugPrivilege действительно работает - я проверил с помощью проводника процессов SysInternals. Спасибо за вашу помощь! :)   -  person David S.    schedule 22.12.2013
comment
Ошибка 6 из OpenProcess невозможна, потому что OpenProcess не имеет параметра дескриптора. Проверьте свой набор текста.   -  person Raymond Chen    schedule 22.12.2013
comment
@RaymondChen: Я почти уверен, что это ошибка 6 декабря, а не шестнадцатеричного числа 6. Через несколько минут я еще раз вернусь.   -  person David S.    schedule 22.12.2013
comment
@RaymondChen: я тоже читал страницу MSDN, и хотя я понимаю, что не могу понять что-то вроде csrss или winlogon, я должен иметь возможность внедрять в другие приложения. Я работаю над трейнером для видеоигр, и я хочу сделать свой собственный инжектор DLL, я хорошо осведомлен о пагубных последствиях того, что я пытаюсь сделать.   -  person David S.    schedule 22.12.2013
comment
О, значит, вас интересует один конкретный процесс. Судя по тому, как вы сформулировали свой вопрос, вы пытались внедрить его в каждый процесс. (получите HANDLE для каждого процесса.) Используйте Process Explorer, чтобы узнать, какой ACL находится в процессе. Это скажет вам, почему вы не можете получить к нему доступ.   -  person Raymond Chen    schedule 22.12.2013
comment
@RaymondChen: Ну, я пишу инжектор DLL общего назначения, поэтому я составил список HANDLE, чтобы всякий раз, когда пользователь выбирает процесс из графического интерфейса, он мог просто использовать тот, который уже открыт, и отбрасывать его полезную нагрузку вместо того, чтобы повторять через список процессов несколько раз (например, я могу просто найти HANDLE «локально»). Не знаю, плохой ли это способ сделать это, но если я не пойму через пару часов, я напишу по-другому.   -  person David S.    schedule 22.12.2013
comment
Вы попадаете в ловушку, прося гораздо большего разрешения, чем вам нужно. На самом деле вам нужно разрешение только для одного из процессов, поэтому не спрашивайте разрешения для всех из них. Это все равно что сказать: «Все, пожалуйста, дайте мне номер вашего банковского счета, даже если вас действительно интересует только номер банковского счета вашего брата».   -  person Raymond Chen    schedule 22.12.2013
comment
Я тоже столкнулся с твоей проблемой. Тебе это удалось?   -  person Han Tran    schedule 15.12.2014
comment
@HanTran: Я решил эту проблему, изменив что-то в настройках компоновщика, но я не помню, что именно, поэтому прошу прощения за это. Я помню, что проблема исчезла после того, как я отключил Win Defender и запустил приложение (в моем случае инжектор) от имени администратора.   -  person David S.    schedule 04.01.2015
comment
@DavidS. Да, я тоже решил свою проблему запуском от имени администратора! Похоже, проблема возникает только в Windows 7 и выше :)   -  person Han Tran    schedule 05.01.2015


Ответы (1)


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

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

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

person user2345215    schedule 22.12.2013
comment
В итоге я последовал совету @RaymondChen и открывал дескрипторы только тех приложений, для которых мне нужно открывать дескрипторы. Похоже, это лучший подход, спасибо! :) - person David S.; 22.12.2013