Добрый день. Извините за возможно дико ламерский вопрос. Как скопировать токен существующего процесса? В MSDN указано, что для этого он должен быть открыть с TOKEN_DUPLICATE правами. Задача состоит в создании процесса с пользователем - SYSTEM. Попытка открыть токен процесса с такими правами дает 0xC0000022. Права админа, пробовал поднимать всевозможные привилегии. Порядок действий следующий создание процесса NtOpenProcess PROCESS_ALL_ACCESS NtOpenProcessToken TOKEN_DUPLICATE NtDuplicateToken NtSetInformationProcess ProcessAccessToken NtResumeThread .... Возможно, что-то не так в этой последовательности. Спасибо.
Кажись вопрос оказался не таким уж и ламерским, раз нет ответа. Да, кстати, можно создать токен SYSTEM'а, по примеру Ньюбета, но там тоже какие-то косяки пошли с реализацией.
Вначале б попробовал открыть через WinAPI А потом уже думал бы ) Порядок такой : Код (Text): if ( !OpenProcessToken(GetCurrentProcess(), TOKEN_DUPLICATE | TOKEN_QUERY, &hToken) ) return -1;
Это если нужно сдуплицировать токен самого себя. А вот попробуйте тоже самое сделать например с svchost.exe даже со всеми привилегиями. 0xC0000022. К тому же никакой принципиальной разницы. Суть моего топика заключается в том, что мне нужно впихать токен SYSTEM создаваемому процессу. CreateProcessAsUser (SystemToken....); Токен SYSTEM удалось создать с помощью вышеописанной NtCreateToken (по примеру из книги Ньюбета), но при создании процесса выдается ошибка, что "Клиент не обладает требуемыми правами". Другой подводный камень, процесс создающий токен должен обладать привилегией создания маркерного объекта, которая по дефолту у администраторов отсутствует. Так что пришлось задействовать ещё и lsass. Голова уже кругом идет.
soveren Хм а не проще сделать так: Код (Text): //здесь опен токен TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY LookupPrivilegeValueW(NULL, L"SeDebugPrivilege", &tkp.Privileges[0].Luid) tkp.PrivilegeCount = 1; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; //Активируем привелегию DEBUG NtAdjustPrivilegesToken(....) И у процесса права системные. И не надо гемороиться с новым токеном.
Ну куда проще вообще тогда сделать одной строкой и без advapi32 RtlAdjustPrivilege(SE_DEBUG_PRIVILEGE, TRUE, FALSE, &prev); Процесс должен обладать правами SYSTEM (это касается например файловых объектов, записей в реестре на которые закрыт доступ по умолчанию всем кроме системы), вариант сервиса к сожалению в моем случае не уместен
Не пойдёт. Что такое SE_DEBUG_PRIVILEGE ? Есть константа SE_DEBUG_NAME='SeDebugPrivilege', а advapi32!LookupPrivilegeValue возвращает для имени идентификатор, который и передаётся в NtAdjustPrivilege.
Clerk Ещё как пойдет. Вы вообще знакомы с NT? SE_DEBUG_PRIVILEGE это и есть та самая константа. Код (Text): // begin_wdm #define SE_MACHINE_ACCOUNT_PRIVILEGE (6L) #define SE_TCB_PRIVILEGE (7L) #define SE_SECURITY_PRIVILEGE (8L) #define SE_TAKE_OWNERSHIP_PRIVILEGE (9L) #define SE_LOAD_DRIVER_PRIVILEGE (10L) #define SE_SYSTEM_PROFILE_PRIVILEGE (11L) #define SE_SYSTEMTIME_PRIVILEGE (12L) #define SE_PROF_SINGLE_PROCESS_PRIVILEGE (13L) #define SE_INC_BASE_PRIORITY_PRIVILEGE (14L) #define SE_CREATE_PAGEFILE_PRIVILEGE (15L) #define SE_CREATE_PERMANENT_PRIVILEGE (16L) #define SE_BACKUP_PRIVILEGE (17L) #define SE_RESTORE_PRIVILEGE (18L) #define SE_SHUTDOWN_PRIVILEGE (19L) #define SE_DEBUG_PRIVILEGE (20L) #define SE_AUDIT_PRIVILEGE (21L) #define SE_SYSTEM_ENVIRONMENT_PRIVILEGE (22L) #define SE_CHANGE_NOTIFY_PRIVILEGE (23L) #define SE_REMOTE_SHUTDOWN_PRIVILEGE (24L) #define SE_UNDOCK_PRIVILEGE (25L) #define SE_SYNC_AGENT_PRIVILEGE (26L) #define SE_ENABLE_DELEGATION_PRIVILEGE (27L) #define SE_MANAGE_VOLUME_PRIVILEGE (28L) #define SE_IMPERSONATE_PRIVILEGE (29L) #define SE_CREATE_GLOBAL_PRIVILEGE (30L) #define SE_MAX_WELL_KNOWN_PRIVILEGE (SE_CREATE_GLOBAL_PRIVILEGE)
Работает, я и не знал, cпасибо за константы; Я давно смотрел какую работу геморную выполняет advapi32!LookupPrivilegeValue, она возвращает значение, меняющееся при перезагрузке системы. В таком случае непонятно зачем.. Я мельком глянул NtOpenProcessToken: NtOpenProcessToken()->PsOpenTokenOfProcess()->ObReferenceObjectByHandle()->SeComputeDeniedAccesses[] GrantedAccess = Process->GrantedAccess ;EPROCESS.GrantedAccess, текущий процесс Макрос SeComputeDeniedAccesses определён как: GrantedAccess And (not DesiredAccess) SeComputeDeniedAccesses(GrantedAccess, DesiredAccess) == 0 ;Ноль в случае успеха ------------------------------------------------------------------------------------- Толком не разбирался, но по ходу EPROCESS.GrantedAccess=DesiredAccess - для успешного выполнения.
Потому что это LUID который генерируется системой исходя из параметров сессии, потому он каждый раз уникальный. Гляньте в reactos, там довольно похожая на правду реализация.
Да это я знаю, просто я всегда получал SeDebugPrivilege перечислением всех привилегий подряд с попыткой открытия системного процесса, не используя константы. Интересно, во всех версиях они одинаковы ?
К сожалению ответ так и не получен. Есть советы создать сервис и выполнить из-под него cmd.exe, но это не совсем то