Быстрый поиск
Введите фрагмент названия статьи для поиска
Повышение привилегий процесса
09.09.2008 | Категория: Образ мышления: Assembler | Автор: ManHunter
Любой процесс в системе выполняется с правами какого-то пользователя или самой системы. Привилегии – это права процесса на совершение каких-либо действий по отношению ко всей системе, и при выполнении каких-либо привилегированных операций система проверяет, обладает ли пользователь соответствующей привилегией. Например, выключение и перезагрузка компьютера компьютера относятся как раз к таким операциям, и без повышения привилегий функция 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
Просмотров: 8679 | Комментариев: 7
Генератор случайных чисел на Ассемблере
03.09.2008 | Категория: Образ мышления: Assembler | Автор: ManHunter
При написании программ часто возникает необходимость получить последовательность случайных чисел. В языках высокого уровня существуют штатные функции, а для Ассемблера я использую так называемый "Минимальный генератор Парка-Миллера" (Minimal portable random generator by Park and Miller). От аналогичных алгоритмов его отличает очень малый размер и равномерное распределение получаемых случайных чисел. Математическую модель и описание работы алгоритма можно без труда найти в интернете, поэтому эту информацию я здесь не привожу.Code (Assembler) : Убрать нумерацию
- ;---------------------------------------------
- ; Park Miller random number algorithm
- ; Получить случайное число 0 ... 99999
- ; stdcall WRandom
- ; на выходе EAX - случайное число
- ;---------------------------------------------
- proc WRandom
- push edx ecx
- mov eax,[random_seed]
- xor edx,edx
- mov ecx,127773
- div ecx
- mov ecx,eax
- mov eax,16807
- mul edx
- mov edx,ecx
- mov ecx,eax
- mov eax,2836
- mul edx
- sub ecx,eax
- xor edx,edx
- mov eax,ecx
- mov [random_seed],ecx
- mov ecx,100000
- div ecx
- mov eax,edx
- pop ecx edx
- ret
- endp
- ;---------------------------------------------
- ; Получить случайное число в нужном интервале
- ; Требуется процедура WRandom
- ; stdcall WIRandom,min,max
- ; на выходе EAX - случайное число
- ;---------------------------------------------
- proc WIRandom rmin:dword,rmax:dword
- push edx ecx
- mov ecx,[rmax]
- sub ecx,[rmin]
- inc ecx
- stdcall WRandom
- xor edx,edx
- div ecx
- mov eax,edx
- add eax,[rmin]
- pop ecx edx
- ret
- endp
- ;---------------------------------------------
- ; Инициализация генератора случайных чисел
- ; stdcall WRandomInit
- ;---------------------------------------------
- proc WRandomInit
- push eax edx
- rdtsc
- xor eax,edx
- mov [random_seed],eax
- pop edx eax
- ret
- endp
Читать статью целиком »
Просмотров: 30934 | Комментариев: 7