OpenProcess на x64 отображает из приложения Win32

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

Затем забавная вещь произошла. Я попробовал его против идентификатора процесса для explorer.exe и святого карпа, это работало! Запущенный бросок других идентификаторов процесса в нем, и он - просто проклятый crapshoot.

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

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

Я подтверждаю "разрядность" и идентификационный Проводник Процесса использования процесса. Плюс, называя 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

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

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

Спасибо... Karl

5
задан Karl E. Peterson 19 February 2010 в 00:20
поделиться

1 ответ

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

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

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

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

4
ответ дан 15 December 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: