OpenProcess

Получить идентификатор системного процесса

По умолчанию запущенный процесс не имеет привилегий SeDebugPrivilege. Однако, когда процесс запущен под такими отладчиками как OllyDbg и WinDbg, он получает эту привилегию. Когда процесс получает привилегию SeDebugPrivilege, он получает полный контроль над CSRSS.EXE, даже несмотря на то, что CSRSS.EXE - системный процесс.

CSRSS.EXE – часть пользовательской Win32 подсистемы.

CSRSS - сокращение от "client/server run-time subsystem" (клиент/серверная подсистема). csrss отвечает за консольные приложения, создание/удаление потоков и за 16-битную виртуальную среду MS-DOS. CSRSS выполняется как системный сервис пользовательского режима. Когда процесс пользовательского режима вызывает функцию с участием консольных окон, создания процесса/потока, или поддержки Side-by-Side, библиотеки Win32 (kernel32.dll, user32.dll, gdi32.dll) вместо запроса системного вызова обращаются к процессу CSRSS путем меж-процессного вызова (IPC вида Local Procedure Call), и CSRSS делает большую часть реальной работы, без того, чтобы подвергать опасности (компроментировать) ядро.
Подсистема имеет решающее значение для функционирования ОС; поэтому завершение этого процесса приведет к отказу системы.

Привилегия SeDebugPrivilege позволяет процессу получить полный доступ к любому другому процессу, независимо от его уровня безопасности. Результат состоит в том, что если отлаживаемое приложение может получить идентификатор процесса (сокращенно PID от process identifier) для CSRSS.EXE, оно может открыть процесс через функцию kernel32!OpenProcess(). Сам PID получают с помощью kernel32!CreateToolhelp32Snapshot(), или kernel32!Process32Next(), или ntdll!NtQuerySystemInformation.

Таким образом, если результат работы OpenProcess() при открытии системного процесса CSRSS не NULL, то программа имеет привилегию SeDebugPrivilege - привилегию отладчика.

Есть предопределенные идентификаторы процессов:
PID = 0 - Idle (бездействие системы)
PID = 4 - System
При вызове OpenProcess с PID = 4 функция завершится с NULL (неудача) и кодом ошибки ERROR_INVALID_PARAMETER.
При вызове OpenProcess с PID = 0 или PID одного из CSRSS процессов функция завершится с NULL (неудача) и кодом ошибки ERROR_ACCESS_DENIED (если нет привилегии SeDebugPrivilege).

Лучший способ победить этот финт состоит в том, чтобы не требовать привилегий отладки без достаточных оснований, и сохранять ее только пока это действительно необходимо.

Обратно к содержанию

Пока не указано иное, содержимое этой страницы распространяется по лицензии Creative Commons Attribution-ShareAlike 3.0 License