Ниже накнопан участок кода, который при определенном услвии выполняет либо перезагрузку, либо выключение компа. Код (Text): ; ; FASM ; struct LUID .LowPart dd ? .HighPart dd ? ends struct LUID_AND_ATTRIBUTES .Luid LUID .Attributes dd ? ends struct TOKEN_PRIVILEGES .PrivilegeCount dd ? .Privileges LUID_AND_ATTRIBUTES ends ; ; ... ... szShut db 'SeShutdownPrivilege',0 tkp TOKEN_PRIVILEGES h_token dd ? ... ... ; ; xor ebx,ebx xor eax,eax mov al,[task_numb] ; либо 0, либо 1. inc eax ; т.е. либо EWX_SHUTDOWN, либо EWX_REBOOT. or eax,EWX_FORCE ; т.е. либо EWX_SHUTDOWN or EWX_FORCE, либо EWX_REBOOT or EWX_FORCE. mov esi,eax invoke GetVersion test eax,80000000h jnz .Win9x invoke GetCurrentProcess invoke OpenProcessToken,eax,28h,h_token invoke LookupPrivilegeValue,ebx,szShut,tkp.Privileges.Luid mov [tkp.PrivilegeCount],1 mov [tkp.Privileges.Attributes],2 invoke AdjustTokenPrivileges,[h_token],ebx,tkp,ebx,ebx,ebx .Win9x: invoke ExitWindowsEx,esi,0FFFFh ; ; MASM32 ; ... ... szShut db 'SeShutdownPrivilege',0 tkp TOKEN_PRIVILEGES <> h_token dd ? ... ... ; ; xor ebx,ebx xor eax,eax mov al,task_numb ; либо 0, либо 1. inc eax ; т.е. либо EWX_SHUTDOWN, либо EWX_REBOOT. or eax,EWX_FORCE ; т.е. либо EWX_SHUTDOWN or EWX_FORCE, либо EWX_REBOOT or EWX_FORCE. mov esi,eax invoke GetVersion test eax,80000000h jnz Win9x invoke GetCurrentProcess invoke OpenProcessToken,eax,28h,offset h_token invoke LookupPrivilegeValue,ebx,offset szShut,offset tkp.Privileges[0].Luid mov tkp.PrivilegeCount,1 mov tkp.Privileges[0].Attributes,2 invoke AdjustTokenPrivileges,h_token,ebx,offset tkp,ebx,ebx,ebx Win9x: invoke ExitWindowsEx,esi,0FFFFh Вроде бы одинаковое исполнение кода на разных диалектах ассемблера, но вот почему-то вариант на FASMе ни как не хочет работать. Полагаю я допустил ошибку при объявлении структуры TOKEN_PRIVILEGES, но иного способа я не нашел. Может быть кто подскажет как заставить работать FASMовский код?
Что мешает заглянуть в дизассемблер и выяснить одинаковый ли код сгенерил компилятор в обоих случаях?
Почему бы начало не переписать так: Код (Text): xor ebx,ebx mov esi,[task_numb] inc esi or esi,EWX_FORCE
На первый взгляд, со структурой проблем нет. Можно конечно попробовать сделать так: Код (Text): tkp: .PrivilegeCount dd ? .Privileges.Luid: .Privileges.Luid.LowPart dd ? .Privileges.Luid.HighPart dd ? .Privileges.Attributes dd ? ЗЫ test eax,80000000h jnz можно заменить на: test eax,eax js a в данном случае и на: dec eax js
KiNDeR Если ты решил проблему, писал эту структуру, то прицепи её пожалйста в аттач. У меня тоже не чтото с этой структурой не выходит. Пробовал конвертировать с МАСМ`а ,не получаеться.(( Заранее благодарен
Вот написал программку на Фасме,которая получает привилегии,и выключает комп. Прошу сильно не бить,за не совсем правильный,но вроде рабочий код. Так как структуру восстанавливал Олькой,по смещениям) (Дизассемблировал пример на МАСМ) Код (Text): format PE GUI 4.0 include 'fasminc\win32a.inc' section '.code' code readable executable writeable invoke GetCurrentProcess invoke OpenProcessToken,eax,28h,phToken invoke LookupPrivilegeValueA,0,szShut,pLocalId mov dword[PrivilegeCount],1 mov dword[Attributes],SE_PRIVILEGE_ENABLED invoke AdjustTokenPrivileges,dword[phToken],0,PrivilegeCount ,0,0,0 invoke ExitWindowsEx,1,0 retn section '.data' code readable executable writeable PrivilegeCount dd ? pLocalId dd ? chtoto dd ? ;незнаю что тут должно быть Attributes dd ? phToken dd ? szShut db 'SeShutdownPrivilege',0
Вот мой кодезь. Рабочий. В файле winnt.inc все структуры, вроде правильно описаные. _1510529357__power.zip
Cпасибо n0p ,качаю,посмотрю ,ато в отладчике отчень друдно понять где ,что зарезервированно,и в какой последовательности. Поэтому мой код получился кривой,но рабочий)))) Спасибо еще раз))))
Cтранно,не получаеться у меня твой пример скомпилить ((( Делаю так. Компилю stub.asm ,нормально Подключаю твой файл winnt.inc, прописывая > Код (Text): ------------------------------- format PE CONSOLE on 'stub.exe' entry start include 'fasminc\win32a.inc' include 'winnt.inc' --------------------------------- Получаю ошибку >(winnt.inc) Код (Text): struc GUID { .Data1 dd ? .Data2 dw ? .Data3 dw ? .Data4 rb 8 } struct GUID >--- > Error: incomplete macro. Кстати и предидущий пример у меня не компилился тоже с такой ошибкой.... Вроде все правильно сделал.
Хмм.. что-то у тебя с фасмом и его макросами.. У меня фасм не самый свежий, но предпоследней версии. Макросы использую только library, import, export, imports(самодельный, тупо подключает все библиотеки, а import и library разруливают какие надо), struct, union (нужен для инклудов, поэтому не удалил) и все. Так что чисто гипотетически, должно компилиться абсолютно у всех (если таблицу импорта написать нормально)
Макрос struct изменён (iirc, с версии 1.56) С новыми include делается так: Код (Text): struct GUID .Data1 dd ? .Data2 dw ? .Data3 dw ? .Data4 rb 8 ends
Ага, а вот так как описал S_T_A_S_ компилиться ))) Спасиб) ---------- Прикольную прогу ты написал n0p , я сначала подумал вирус, так как поиск АПИ юзает. Запустил,вполне мирная прога. Под XP SP2 Нормально работают все её функции.
Надо ее в исходники засунуть. Пусть народ порадуется К тому же небесполезная - пользуюсь ей ежедневно и не по разу.
Вот это правильно n0p, выкладывать структуры надо.Любые. Народу, (начинающим в особенности) они очень пригодяться.