2015-02-03 4 views
4

У меня есть программа, которая настраивает SeDebugPrivilege, а затем начинает итерацию через системные процессы и вызывает OpenProcess для них (и делает другие вещи, но это не важно сейчас). Также программа работает в режиме администратора, конечно. В Windows XP и Windows 7 он отлично работает, но в Windows 8.1 OpenProcess не работает для следующих системных процессов с помощью ERROR_ACCESS_DENIED (5): smss.exe, csrss.exe, services.exe. Как я знаю, с SeDebugPrivilege я должен открыть эти процессы и получить для них дескриптор. У кого-нибудь есть ключ, какая магия вызывает эту ошибку только на Windows 8.1?OpenProcess: доступ запрещен только для Windows 8.1

(Во всяком случае у меня такая же ошибка с теми же процессами для CreateToolhelp32Snapshot)

+0

Я думаю, у вас больше нет прав. –

ответ

4

для Windows 8.1 вводит понятие system protected process. Это задокументировано в контексте сторонних программ защиты от вредоносных программ, но представляется разумным предположить, что он также используется для защиты особо важных системных процессов.

Процессы, защищенные системой, являются расширением Protected Process mechanism (документ Microsoft Word), представленным в Windows Vista как измерение DRM.

Вы не можете получить какой-либо из этих прав доступа к защищенному процессу, даже отлаживать привилегии:

  • DELETE
  • READ_CONTROL
  • WRITE_DAC
  • WRITE_OWNER
  • PROCESS_CREATE_THREAD
  • PROCESS_DUP_HANDLE
  • PROCESS_QUERY_INFORMATION
  • PROCESS_SET_QUOTA
  • PROCESS_SET_INFORMATION
  • PROCESS_VM_OPERATION
  • PROCESS_VM_READ
  • PROCESS_VM_WRITE

Вы все еще должны быть в состоянии открыть процесс путем запроса PROCESS_QUERY_LIMITED_INFORMATION доступа. В соответствии с документацией допускаются также SYNCHRONIZE и PROCESS_TERMINATE.

+0

Спасибо за ответ! Я прочитаю содержимое, которое вы предложили более близко завтра, но теперь я немного разочарован и смущен, почему я не могу даже читать информацию из этих процессов ... –

+0

Вы должны иметь возможность читать некоторую информацию через доступ к PROCESS_QUERY_LIMITED_INFORMATION правильно. Это зависит от того, что именно вы пытаетесь получить. –

+0

Я думаю, что PROCESS_QUERY_LIMITED_INFORMATION для меня будет недостаточно, поэтому я буду искать другой способ (возможно, в ядре или что-то еще). Мне нужна информация о памяти и загруженных модулях ... –

0

Это может быть сделано только в ядре. Лучший способ получить информацию, которую Вы должны были бы быть:

PsLookupProcessByProcessId() 
KeStackAttachProcess() 
ZwQueryInformationProcess() or whatever other functions you need to now call within the context of the attached process. 
KeStackDetachProcess() 

Или, если вы просто экспериментируете и не ставя ничего в производстве коду, вы можете пройти различные полупрозрачные структуры (EPROCESS, PEB, VAD, и т. д.), чтобы получить необходимую информацию.

Смежные вопросы