OpenProcess на x64 изображениях из приложения Win32 - PullRequest
5 голосов
/ 19 февраля 2010

Это странно. Ранее, работая под управлением Windows 7 x64, у меня возникали проблемы с вызовом Win32 OpenProcess для 64-битных процессов. Погуглил немного и пришел к тонущему выводу, что этого просто не произойдет.

Потом произошла забавная вещь. Я попробовал это против идентификатора процесса для explorer.exe и holy carp , это сработало! Начали бросать другие идентификаторы процессов, и это просто проклятая стрельба.

Как оказалось, я могу вызывать OpenProcess для большого числа x64-процессов - explorer, itype, ipoint, taskhost, cmd, mstsc, ... и т. Д.

И другие выдают 5 (Доступ запрещен) - winlogon, csrss, services, svchost, mdm, ...

Я подтверждаю «разрядность» и идентификатор процесса с помощью Process Explorer. Кроме того, вызов GetModuleFileNameEx в 64-разрядных процессах всегда завершается неудачей, поэтому предлагается двойная проверка для 32/64.

Это код:

' Get a handle to the process.
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, ProcessID)
If hProcess Then
   ' Grab the filename for base module.
   nChars = GetModuleFileNameEx(hProcess, 0, Buffer, Len(Buffer))
   ' If running in x64, http://winprogger.com/?p=26
   If Err.LastDllError = ERROR_PARTIAL_COPY Then
      nChars = GetProcessImageFileName(hProcess, Buffer, Len(Buffer))
   End If
   ' Truncate and return buffer.
   If nChars Then
      GetProcessFileName = Left$(Buffer, nChars)
   End If
   Call CloseHandle(hProcess)
Else
   Debug.Print "LastDllError:"; Err.LastDllError
End If

Ничего особенного. Просто хочу запросить процессы для таких вещей, как имя файла или время процесса. Кто-нибудь знает, что отличает тех, кого я могу открыть от тех, которые я не могу?

Дополнительная информация: Запуск процесса от имени администратора. UAC выключен. Да, это 32-битное приложение. У меня не было лучших результатов при использовании PROCESS_QUERY_LIMITED_INFORMATION.

Спасибо ... Карл

1 Ответ

4 голосов
/ 19 февраля 2010

Указанные вами процессы (winlogon, csrss и т. Д.) Являются критическими системными процессами и службами. Они работают под другим, привилегированным аккаунтом. Даже если вы работаете как администратор, вы не являетесь владельцем этих процессов и, следовательно, вам не предоставляются никакие права в их ACL. Попытка открыть приведет к отказу в доступе.

Однако члены группы администраторов имеют SeDebugPrivilege. По сути, это переопределение для OpenProcess и OpenThread, которое позволит вам открывать для всех доступ, даже если вы не получили никакого разрешения в ACL.

SeDebugPrivilege, очевидно, является очень опасной привилегией - вы можете обходить проверки доступа и изменять / проверять процессы других пользователей. Хотя он присутствует в токене администратора по умолчанию, он не включен по умолчанию. Вам необходимо активировать эту привилегию перед вызовом OpenProcess.

В этой статье MSDN приведен пример кода о том, как включать и отключать привилегии в вашем токене.

...