Как Process Explorer перечисляет все имена процессов из гостевой учетной записи XP? - PullRequest
2 голосов
/ 15 января 2011

Я пытаюсь перечислить все имена исполняемых EXE-файлов процесса, и наткнулся при попытке сделать это в гостевой учетной записи XP. Я могу перечислить все идентификаторы процессов, используя EnumProcesses, но когда я пытаюсь OpenProcess с PROCESS_QUERY_INFORMATION или PROCESS_VM_READ, функция завершается ошибкой.

Я запустил Process Explorer под учетной записью гостя XP, и он смог перечислить все имена процессов (хотя, как и ожидалось, большая часть другой информации от процессов вне гостевого пространства пользователя отсутствовала).

Итак, мой вопрос: как я могу продублировать магию Process Explorer, чтобы получить имена процессов служб и других процессов, выполняющихся вне пользовательского пространства гостевой учетной записи?

Ответы [ 4 ]

3 голосов
/ 15 января 2011

Я полагаю, что Process Explorer использует NtQuerySystemInformation с параметром SystemProcessInformation для получения списка процессов. Пример кода см. мой старый ответ . Кроме того, функция NtQueryInformationProcess будет использоваться для получения дополнительной информации.

Кстати, если вы запустите Process Explorer под Dependency Walker (меню "Профиль" / "Начать профилирование" или F7 ), то вы увидите все функции, которые действительно Process Explorer использовать из NTDLL.DLL. Вы можете видеть, что NtQuerySystemInformation и NtQueryInformationProcess действительно будут использоваться.

1 голос
/ 16 января 2011

NtQuerySystemInformation только документирована и «может быть изменена или недоступна в будущих версиях Windows» CreateToolhelp32Snapshot полностью задокументирована и должна дать вам имя изображения.

0 голосов
/ 16 января 2011

GetProcessImageFileName требуется только PROCESS_QUERY_LIMITED_INFORMATION, начиная с Vista, но в XP он нуждается в PROCESS_QUERY_INFORMATION.

Вам не нужно, и определенно не должно быть в состоянии получитьгостевой аккаунт, PROCESS_VM_READ.

0 голосов
/ 15 января 2011

Когда процесс запускается, ему назначается базовый набор прав доступа. Некоторые вызовы API требуют дополнительных привилегий для успешного завершения. В частности, OpenProcess может требовать привилегию SeDebugPrivilege в некоторых случаях. Пример того, как изменить токен процесса для включения дополнительных привилегий, можно найти здесь: Включение и отключение привилегий в C ++ .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...