2010-02-19 3 views
5

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

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

Как оказалось, я могу назвать OpenProcess против хорошего числа 64 процессов - исследователь, 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.

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

ответ

4

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

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

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

В этом MSDN article приведен пример кода включения и отключения привилегий в токене.

+0

Ouch. Да, это все, хорошо. Это также дало возможность GetProcessTimes. Я вижу, что Process Explorer также работает с этим параметром. Итак, если я буду запускать это под учетной записью пользователя с наименьшими привилегиями, это тоже не может быть сделано? В любом случае, спасибо! :-) –

+1

Несколько групп имеют SeDebugPrivilege по умолчанию, в основном просто SYSTEM и группу администраторов. У наименее привилегированных пользователей определенно нет. Если бы это было так, повышение до полной привилегии было бы тривиальным, поскольку вы можете вводить код, который вы хотите запустить в привилегированный процесс. – Michael

+0

Прежде чем приступить к этому сообщению, я подумал, что мне придется делать отдельные сборки в моем сценарии, но благодаря SeDebugPrivilege я могу теперь вызвать openprocess из 32-битного процесса и загрузить 64-битный процесс в моем случае im, чтобы загрузить lsass. – Syler

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