Как узнать, какие привилегии есть у процесса
Ранее я уже писал, как устанавливать нужные привилегии для процесса. Сегодня будет пример, как можно получать список доступных привилегий. Но сперва немного констант и структур, которые необходимы для работы с привилегиями.Code (Assembler) : Убрать нумерацию
- TOKEN_QUERY = 8h
- TokenPrivileges = 3
- struct LUID
- LowPart dd ?
- HighPart dd ?
- ends
- struct LUID_AND_ATTRIBUTES
- pLuid LUID
- Attributes dd ?
- ends
- struct TOKEN_PRIVILEGES
- PrivilegeCount dd ?
- Privileges LUID_AND_ATTRIBUTES
- ends
С помощью функции LookupPrivilegeName можно получить имя вида "Se...Privilege", а по нему, вызвав функцию LookupPrivilegeDisplayName, получить ее описание. На практике удалось выяснить, что в списке привилегий могут встречаться записи с пустыми значениями локальных уникальных идентификаторов (LUID) или со значениями, для которых в заголовочных файлах не определено соответствующих записей. Затрудняюсь сказать, как поступать в таких случаях, так что предпочту их просто пропускать. На всякий случай можно дополнительно проверять LUID, соответствующие следующему списку.
Code (Assembler) : Убрать нумерацию
- pr_list db 'SeCreateTokenPrivilege',0
- db 'SeAssignPrimaryTokenPrivilege',0
- db 'SeLockMemoryPrivilege',0
- db 'SeIncreaseQuotaPrivilege',0
- db 'SeUnsolicitedInputPrivilege',0
- db 'SeMachineAccountPrivilege',0
- db 'SeTcbPrivilege',0
- db 'SeSecurityPrivilege',0
- db 'SeTakeOwnershipPrivilege',0
- db 'SeLoadDriverPrivilege',0
- db 'SeSystemProfilePrivilege',0
- db 'SeSystemtimePrivilege',0
- db 'SeProfileSingleProcessPrivilege',0
- db 'SeIncreaseBasePriorityPrivilege',0
- db 'SeCreatePagefilePrivilege',0
- db 'SeCreatePermanentPrivilege',0
- db 'SeBackupPrivilege',0
- db 'SeRestorePrivilege',0
- db 'SeShutdownPrivilege',0
- db 'SeDebugPrivilege',0
- db 'SeAuditPrivilege',0
- db 'SeSystemEnvironmentPrivilege',0
- db 'SeChangeNotifyPrivilege',0
- db 'SeRemoteShutdownPrivilege',0
- db 'SeUndockPrivilege',0
- db 'SeSyncAgentPrivilege',0
- db 'SeEnableDelegationPrivilege',0
- db 'SeManageVolumePrivilege',0
- db 'SeImpersonatePrivilege',0
- db 'SeCreateGlobalPrivilege',0
- db 'SeTrustedCredManAccessPrivilege',0
- db 'SeRelabelPrivilege',0
- db 'SeIncreaseWorkingSetPrivilege',0
- db 'SeTimeZonePrivilege',0
- db 'SeCreateSymbolicLinkPrivilege',0
- db 0
Code (Assembler) : Убрать нумерацию
- invoke GetCurrentProcess
- invoke OpenProcessToken,eax,TOKEN_QUERY,hToken
- or eax,eax
- ; Ошибка
- jz loc_exit
- ; Получить список привилегий
- invoke GetTokenInformation,[hToken],TokenPrivileges,\
- info_buff,INFO_BUFF_SIZE,buff_size
- ; Указатель на список привилегий
- mov esi,info_buff
- ; Количество привилегий
- mov ebx,[esi+TOKEN_PRIVILEGES.PrivilegeCount]
- loc_loop:
- ; Все привилегии обработаны?
- or ebx,ebx
- jz loc_done
- mov [pr_n_size],STRING_BUFF_SIZE
- ; Получить название привилегии
- lea eax,[esi+TOKEN_PRIVILEGES.Privileges.pLuid]
- invoke LookupPrivilegeName,NULL,eax,pr_name,pr_n_size
- ; Такое название есть?
- or eax,eax
- jnz loc_get_desc
- ; LUID привилегии пустой?
- cmp [esi+TOKEN_PRIVILEGES.Privileges.pLuid.LowPart],0
- jne @f
- cmp [esi+TOKEN_PRIVILEGES.Privileges.pLuid.HighPart],0
- je loc_next
- @@:
- ; Просканировать список привилегий
- mov edi,pr_list
- loc_scan:
- mov [tluid.LowPart],0
- mov [tluid.HighPart],0
- ; Получить значение LUID привилегии из списка
- invoke LookupPrivilegeValue,NULL,edi,tluid
- ; Значения LUID совпадают?
- mov eax,[esi+TOKEN_PRIVILEGES.Privileges.pLuid.LowPart]
- cmp eax,[tluid.LowPart]
- jne loc_scan_next
- mov eax,[esi+TOKEN_PRIVILEGES.Privileges.pLuid.HighPart]
- cmp eax,[tluid.HighPart]
- jne loc_scan_next
- invoke lstrcpy,pr_name,edi
- jmp loc_get_desc
- loc_scan_next:
- invoke lstrlen,edi
- add edi,eax
- inc edi
- cmp byte [edi],0
- jne loc_scan
- jmp loc_next
- loc_get_desc:
- ; Очистить строку описания
- invoke RtlZeroMemory,pr_desc,STRING_BUFF_SIZE
- mov [pr_d_size],STRING_BUFF_SIZE
- ; Получить описание привилегии
- invoke LookupPrivilegeDisplayName,NULL,\
- pr_name,pr_desc,pr_d_size,tmp
- ...
- ...
- ; pr_name -> название привилегии
- ; pr_desc -> описание привилегии
- ...
- ...
- loc_next:
- ; Следующая привилегия в списке
- add esi,sizeof.TOKEN_PRIVILEGES
- dec ebx
- jmp loc_loop
- loc_done:
- invoke CloseHandle,[hToken]
Просмотров: 403 | Комментариев: 2
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(30.01.2024 в 16:46):
А у меня нет бесятки, не могу проверить.
Vad
(30.01.2024 в 16:44):
SeUnsolicitedInputPrivilege - Требуется для чтения нежелательных входных данных с устройства терминала. Право пользователя: неприменимо (из справки Microsoft). Под Win10 при вызове LookupPrivilegeValue у меня дает ошибку ERROR_NO_SUCH_PRIVILEGE 1313 (0x521). А у вас ??
Добавить комментарий
Заполните форму для добавления комментария