Повышение привилегий процесса

Любой процесс в системе выполняется с правами какого-то пользователя или самой системы. Привилегии – это права процесса на совершение каких-либо действий по отношению ко всей системе, и при выполнении каких-либо привилегированных операций система проверяет, обладает ли пользователь соответствующей привилегией. Например, выключение и перезагрузка компьютера компьютера относятся как раз к таким операциям, и без повышения привилегий функция ExitWindowsEx завершится с ошибкой. Готовых решений на FASM найти не удалось, пришлось портировать из языков высокого уровня.
; Сегмент данных
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
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

Выключение рассмотрено как наиболее часто встречающаяся задача, более подробное описание использованных структур и функций вы можете найти на сайте Microsoft Developer Network.
Теги:
повышение привилегий
Добавлено: 10 Апреля 2018 20:42:59 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...