Права доступа к ивенту

Тема в разделе "WASM.WIN32", создана пользователем Jin X, 18 мар 2019.

  1. Jin X

    Jin X Active Member

    Публикаций:
    0
    Регистрация:
    15 янв 2009
    Сообщения:
    369
    Адрес:
    Кольца Сатурна
    Всем привет!

    Хочу создать event в сервисе (т.е. из-под пользователя SYSTEM) и открыть его для установки (SetEvent) в юзере/администраторе.
    Как это можно сделать? Разумеется, если создать event в сервисе обычным образом, то в юзере/админе его открыть не получится.

    Желательно поподробнее, в этих всяких security descriptor'ах и пр. не шарю совсем...
     
  2. Коцит

    Коцит Active Member

    Публикаций:
    0
    Регистрация:
    31 янв 2017
    Сообщения:
    130
    значит нужно повысить свою привилегию, через "Access_Token" (маркер доступа). Из юзера сразу в System наврядли получится (тем более на системах 7/10), но можно попробовать вырасти до "SeDebugPrivilege" - должно сработать. Функция AdjustTokenPrivileges() включает или отключает привилегии в указанном маркере доступа.
    --- Сообщение объединено, 19 мар 2019 ---
    посмотри в отладчике, что вернут эти функции (нуль = ошибка)
    если больше нуля, значит привилегию можно повысить:
    Код (ASM):
    1. include  'win32ax.inc'
    2. .data
    3. hToken            dd   0
    4. SeDebugNameValue  dd   0,0
    5. tName             db   'SeDebugPrivilege',0
    6. ;---------------------------------
    7. .code
    8. start:  invoke  OpenProcessToken,-1,00101000b,hToken
    9.         xor     eax,eax
    10.         invoke  LookupPrivilegeValue,0,tName,SeDebugNameValue
    11.         invoke  ExitProcess,0
    12. .end start
     
    Mikl___ нравится это.
  3. Jin X

    Jin X Active Member

    Публикаций:
    0
    Регистрация:
    15 янв 2009
    Сообщения:
    369
    Адрес:
    Кольца Сатурна
    Коцит, к сожалению, это не работает. Права получить удаётся (там ещё AdjustTokenPrivileges должен быть в конце), а вот открыть – нет. OpenEvent(EVENT_MODIFY_STATE) выдаёт 0 и GetLastError = ERROR_ACCESS_DENIED :dntknw:
    Даже из-под админа.
     
  4. Коцит

    Коцит Active Member

    Публикаций:
    0
    Регистрация:
    31 янв 2017
    Сообщения:
    130
    system не пробовал подставлять?
    админ по-умолчанию может дебажить - это для юзверя нужно.
    почитай линки на rsdn:
    https://rsdn.org/article/baseserv/privileges.xml
    https://rsdn.org/article/qna/baseserv/privedit.xml
    возможные варианты описываются в хидере "winnt.h":
    Код (Text):
    1. ////////////////////////////////////////////////////////////////////////
    2. //               NT Defined Privileges                                //
    3. ////////////////////////////////////////////////////////////////////////
    4.  
    5. #define SE_CREATE_TOKEN_NAME              TEXT("SeCreateTokenPrivilege")
    6. #define SE_ASSIGNPRIMARYTOKEN_NAME        TEXT("SeAssignPrimaryTokenPrivilege")
    7. #define SE_LOCK_MEMORY_NAME               TEXT("SeLockMemoryPrivilege")
    8. #define SE_INCREASE_QUOTA_NAME            TEXT("SeIncreaseQuotaPrivilege")
    9. #define SE_UNSOLICITED_INPUT_NAME         TEXT("SeUnsolicitedInputPrivilege")
    10. #define SE_MACHINE_ACCOUNT_NAME           TEXT("SeMachineAccountPrivilege")
    11. #define SE_TCB_NAME                       TEXT("SeTcbPrivilege")
    12. #define SE_SECURITY_NAME                  TEXT("SeSecurityPrivilege")
    13. #define SE_TAKE_OWNERSHIP_NAME            TEXT("SeTakeOwnershipPrivilege")
    14. #define SE_LOAD_DRIVER_NAME               TEXT("SeLoadDriverPrivilege")
    15. #define SE_SYSTEM_PROFILE_NAME            TEXT("SeSystemProfilePrivilege")
    16. #define SE_SYSTEMTIME_NAME                TEXT("SeSystemtimePrivilege")
    17. #define SE_PROF_SINGLE_PROCESS_NAME       TEXT("SeProfileSingleProcessPrivilege")
    18. #define SE_INC_BASE_PRIORITY_NAME         TEXT("SeIncreaseBasePriorityPrivilege")
    19. #define SE_CREATE_PAGEFILE_NAME           TEXT("SeCreatePagefilePrivilege")
    20. #define SE_CREATE_PERMANENT_NAME          TEXT("SeCreatePermanentPrivilege")
    21. #define SE_BACKUP_NAME                    TEXT("SeBackupPrivilege")
    22. #define SE_RESTORE_NAME                   TEXT("SeRestorePrivilege")
    23. #define SE_SHUTDOWN_NAME                  TEXT("SeShutdownPrivilege")
    24. #define SE_DEBUG_NAME                     TEXT("SeDebugPrivilege")
    25. #define SE_AUDIT_NAME                     TEXT("SeAuditPrivilege")
    26. #define SE_SYSTEM_ENVIRONMENT_NAME        TEXT("SeSystemEnvironmentPrivilege")
    27. #define SE_CHANGE_NOTIFY_NAME             TEXT("SeChangeNotifyPrivilege")
    28. #define SE_REMOTE_SHUTDOWN_NAME           TEXT("SeRemoteShutdownPrivilege")
    29. #define SE_UNDOCK_NAME                    TEXT("SeUndockPrivilege")
    30. #define SE_SYNC_AGENT_NAME                TEXT("SeSyncAgentPrivilege")
    31. #define SE_ENABLE_DELEGATION_NAME         TEXT("SeEnableDelegationPrivilege")
    32. #define SE_MANAGE_VOLUME_NAME             TEXT("SeManageVolumePrivilege")
    33. #define SE_IMPERSONATE_NAME               TEXT("SeImpersonatePrivilege")
    34. #define SE_CREATE_GLOBAL_NAME             TEXT("SeCreateGlobalPrivilege")
    35. #define SE_TRUSTED_CREDMAN_ACCESS_NAME    TEXT("SeTrustedCredManAccessPrivilege")
    36. #define SE_RELABEL_NAME                   TEXT("SeRelabelPrivilege")
    37. #define SE_INC_WORKING_SET_NAME           TEXT("SeIncreaseWorkingSetPrivilege")
    38. #define SE_TIME_ZONE_NAME                 TEXT("SeTimeZonePrivilege")
    39. #define SE_CREATE_SYMBOLIC_LINK_NAME      TEXT("SeCreateSymbolicLinkPrivilege")
    40.  
    --- Сообщение объединено, 21 мар 2019 ---
    вообще-то, если знаешь имя своего Event'a в сервисе,
    есть ещё варианты (правда я их не пробовал) - но чем чёрт не шутит..

    1. Создать в своём/юзерском процессе событие с таким-же именем.
    В доках CreateEvent() можно найти такое замечание:
    2. Взять копию эвента через DuplicateHandle().
    Опять из доков..
     
    Последнее редактирование: 21 мар 2019
  5. Jin X

    Jin X Active Member

    Публикаций:
    0
    Регистрация:
    15 янв 2009
    Сообщения:
    369
    Адрес:
    Кольца Сатурна
    Нашёл пример на Delphi.
    Проверил – работает!

    Код (Text):
    1. var
    2.   SA: TSecurityAttributes;
    3.   SD: TSecurityDescriptor;
    4.   H: THandle;
    5.  
    6. begin
    7.   // Создаем дескриптор безопасности
    8.   if InitializeSecurityDescriptor(@SD, SECURITY_DESCRIPTOR_REVISION) and
    9.   // DACL не установлен, объект не защищён
    10.      SetSecurityDescriptorDacl(@SD, True, nil, False) then
    11.   begin
    12.     // Настраиваем атрибуты безопасности, передавая указатель на дескриптор безопасности
    13.     SA.nLength := SizeOf(SA);
    14.     SA.lpSecurityDescriptor := @SD;
    15.     SA.bInheritHandle := False;
    16.     // Создаём событие
    17.     H := CreateEvent(@SA, True, False, 'Global\MyTestEvent');
    18.   end;
    19. ...
    После создания такого объекта его можно спокойно открыть кем угодно с EVENT_ALL_ACCESS :)