Повышение привилегий процесса
Любой процесс в системе выполняется с правами какого-то пользователя или самой системы. Привилегии – это права процесса на совершение каких-либо действий по отношению ко всей системе, и при выполнении каких-либо привилегированных операций система проверяет, обладает ли пользователь соответствующей привилегией. Например, выключение и перезагрузка компьютера компьютера относятся как раз к таким операциям, и без повышения привилегий функция ExitWindowsEx завершится с ошибкой. Готовых решений на FASM найти не удалось, пришлось портировать из языков высокого уровня.Code (Assembler) : Убрать нумерацию
- ; Сегмент данных
- section '.data' data readable writeable
- ; Определяем константы
- TOKEN_ADJUST_PRIVILEGES = 20h
- TOKEN_QUERY = 8h
- SE_PRIVILEGE_ENABLED = 2h
- ; Определяем необходимые структуры, потому что в FASM'е их нет
- 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
- TTokenHd dd ?
- udtLUID LUID
- ; Важно! Структура _TOKEN_PRIVILEGES должна быть выровнена на границу 4 байт!
- align 4
- tkp _TOKEN_PRIVILEGES
- SE_SHUTDOWN_NAME db 'SeShutdownPrivilege',0
- ; Сегмент кода
- section '.code' code readable executable
- invoke GetCurrentProcess
- ; Открыть маркер доступа (access token), ассоциирующийся с процессом
- invoke OpenProcessToken,eax,TOKEN_ADJUST_PRIVILEGES+TOKEN_QUERY,TTokenHd
- or eax,eax
- jz loc_exit ; Ошибка
- ; Получить текущее значение привилегии на выключение и
- ; перезагрузку системы
- invoke LookupPrivilegeValue, NULL, SE_SHUTDOWN_NAME, udtLUID
- or eax,eax
- jz loc_exit ; Ошибка
- ; Заполнить структуры
- mov [tkp.PrivilegeCount],1
- mov [tkp.Privileges.Attributes],SE_PRIVILEGE_ENABLED
- mov eax,[udtLUID.lowPart]
- mov [tkp.Privileges.pLuid.lowPart],eax
- mov eax,[udtLUID.HighPart]
- mov [tkp.Privileges.pLuid.HighPart],eax
- invoke AdjustTokenPrivileges,[TTokenHd],0,tkp,0,0,0
- ; Здесь будет код, требующий повышенных привилегий,
- ; например выключение компьютера
- invoke ExitWindowsEx,EWX_POWEROFF,NULL
- ...
- ; Выход
- loc_exit:
- invoke ExitProcess,0
Просмотров: 8720 | Комментариев: 7
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
stalker
(26.10.2022 в 07:23):
ManHunter, доброго времени суток, а как можно определить, что структура требует выравнивания на 4 байта? Каким образом проявляется все это при работе?
morgot
(26.04.2014 в 20:20):
В Масм это align 4.
TOXIC это уже не нужно, но может кому-то из читателей пригодится.
TOXIC это уже не нужно, но может кому-то из читателей пригодится.
TOXIC
(13.05.2012 в 20:56):
disciple27, а как выровнять на четыре байта?
ManHunter
(10.03.2012 в 16:20):
Спасибо, буду знать. Любое знание - это польза.
disciple27
(10.03.2012 в 16:17):
Здравствуйте ManHunter, заметил одну неприятную вещь - если структура TOKEN_PRIVILEGES не выровнена на четыре байта, функция AdjustTokenPrivileges будет возвращать ошибку ERROR_NOACCESS.
Ну это так, вдруг вы тоже столкнётесь. (система WinXP SP3)
Ну это так, вдруг вы тоже столкнётесь. (система WinXP SP3)
Eugeny
(03.01.2011 в 17:14):
Тема очень актуальна!
Добавить комментарий
Заполните форму для добавления комментария
Иногда об этом пишут на MSDN, но лучше просто завести хорошую привычку ЛЮБУЮ структуру выравнивать. Я вот все борюсь с собой :)
В камментах же уже ответили
Вроде код написан правильно, а не работает. Так вот и проявляется.