Проблема со структурой в FASME (как правильно описать)?

Тема в разделе "WASM.ASSEMBLER", создана пользователем KiNDeR, 14 окт 2004.

  1. KiNDeR

    KiNDeR New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2003
    Сообщения:
    258
    Адрес:
    Russia
    Ниже накнопан участок кода, который при определенном услвии выполняет либо

    перезагрузку, либо выключение компа.


    Код (Text):
    1.  
    2. ;
    3. ; FASM
    4. ;
    5. struct LUID
    6.   .LowPart  dd ?
    7.   .HighPart dd ?
    8. ends
    9.  
    10. struct LUID_AND_ATTRIBUTES
    11.   .Luid       LUID
    12.   .Attributes dd ?
    13. ends
    14.  
    15. struct TOKEN_PRIVILEGES
    16.   .PrivilegeCount dd ?
    17.   .Privileges     LUID_AND_ATTRIBUTES
    18. ends
    19. ;
    20. ;
    21. ...
    22. ...
    23. szShut  db 'SeShutdownPrivilege',0
    24. tkp TOKEN_PRIVILEGES
    25. h_token dd ?
    26. ...
    27. ...
    28. ;
    29. ;
    30. xor ebx,ebx
    31. xor eax,eax
    32. mov al,[task_numb]    ; либо 0, либо 1.
    33. inc eax       ; т.е. либо EWX_SHUTDOWN, либо EWX_REBOOT.
    34. or  eax,EWX_FORCE     ; т.е. либо EWX_SHUTDOWN or EWX_FORCE, либо EWX_REBOOT or EWX_FORCE.
    35. mov esi,eax
    36. invoke  GetVersion
    37. test    eax,80000000h
    38. jnz .Win9x
    39. invoke  GetCurrentProcess
    40. invoke  OpenProcessToken,eax,28h,h_token
    41. invoke  LookupPrivilegeValue,ebx,szShut,tkp.Privileges.Luid
    42. mov [tkp.PrivilegeCount],1
    43. mov [tkp.Privileges.Attributes],2
    44. invoke  AdjustTokenPrivileges,[h_token],ebx,tkp,ebx,ebx,ebx
    45. .Win9x:
    46. invoke  ExitWindowsEx,esi,0FFFFh
    47.  
    48. ;
    49. ; MASM32
    50. ;
    51. ...
    52. ...
    53. szShut  db 'SeShutdownPrivilege',0
    54. tkp TOKEN_PRIVILEGES <>
    55. h_token dd ?
    56. ...
    57. ...
    58. ;
    59. ;
    60. xor ebx,ebx
    61. xor eax,eax
    62. mov al,task_numb      ; либо 0, либо 1.
    63. inc eax       ; т.е. либо EWX_SHUTDOWN, либо EWX_REBOOT.
    64. or  eax,EWX_FORCE     ; т.е. либо EWX_SHUTDOWN or EWX_FORCE, либо EWX_REBOOT or EWX_FORCE.
    65. mov esi,eax
    66. invoke  GetVersion
    67. test    eax,80000000h
    68. jnz Win9x
    69. invoke  GetCurrentProcess
    70. invoke  OpenProcessToken,eax,28h,offset h_token
    71. invoke  LookupPrivilegeValue,ebx,offset szShut,offset tkp.Privileges[0].Luid
    72. mov tkp.PrivilegeCount,1
    73. mov tkp.Privileges[0].Attributes,2
    74. invoke  AdjustTokenPrivileges,h_token,ebx,offset tkp,ebx,ebx,ebx
    75. Win9x:
    76. invoke  ExitWindowsEx,esi,0FFFFh
    77.  




    Вроде бы одинаковое исполнение кода на разных диалектах ассемблера,

    но вот почему-то вариант на FASMе ни как не хочет работать.

    Полагаю я допустил ошибку при объявлении структуры TOKEN_PRIVILEGES,

    но иного способа я не нашел. Может быть кто подскажет как заставить работать

    FASMовский код?
     
  2. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Что мешает заглянуть в дизассемблер и выяснить одинаковый ли код сгенерил компилятор в обоих случаях?
     
  3. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Почему бы начало не переписать так:
    Код (Text):
    1.   xor ebx,ebx
    2.   mov esi,[task_numb]
    3.   inc esi
    4.   or esi,EWX_FORCE
     
  4. KiNDeR

    KiNDeR New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2003
    Сообщения:
    258
    Адрес:
    Russia
    Спасибо, что хоть идиотом не обозвали...

    ...

    ...

    ...

    task_numb db ?
     
  5. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    > task_numb db ?



    Ну сделай DWORD'ом или movzx
     
  6. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    На первый взгляд, со структурой проблем нет.

    Можно конечно попробовать сделать так:
    Код (Text):
    1. tkp:
    2.   .PrivilegeCount       dd ?
    3.   .Privileges.Luid:
    4.   .Privileges.Luid.LowPart  dd ?
    5.   .Privileges.Luid.HighPart dd ?
    6.   .Privileges.Attributes    dd ?




    ЗЫ

    test eax,80000000h

    jnz



    можно заменить на:

    test eax,eax

    js



    a в данном случае и на:

    dec eax

    js
     
  7. Worm32

    Worm32 New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2005
    Сообщения:
    33
    Адрес:
    Azerbaijan
    KiNDeR Если ты решил проблему, писал эту структуру, то прицепи её пожалйста в аттач.

    У меня тоже не чтото с этой структурой не выходит.



    Пробовал конвертировать с МАСМ`а ,не получаеться.((

    Заранее благодарен
     
  8. Worm32

    Worm32 New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2005
    Сообщения:
    33
    Адрес:
    Azerbaijan
    Вот написал программку на Фасме,которая получает привилегии,и выключает комп.

    Прошу сильно не бить,за не совсем правильный,но вроде рабочий код. Так как структуру восстанавливал Олькой,по смещениям)

    (Дизассемблировал пример на МАСМ)






    Код (Text):
    1. format PE GUI 4.0
    2. include 'fasminc\win32a.inc'
    3. section '.code' code readable executable writeable
    4. invoke   GetCurrentProcess
    5. invoke   OpenProcessToken,eax,28h,phToken
    6. invoke   LookupPrivilegeValueA,0,szShut,pLocalId
    7. mov  dword[PrivilegeCount],1
    8. mov  dword[Attributes],SE_PRIVILEGE_ENABLED
    9. invoke   AdjustTokenPrivileges,dword[phToken],0,PrivilegeCount ,0,0,0
    10. invoke   ExitWindowsEx,1,0
    11. retn
    12.  
    13. section '.data' code readable executable writeable
    14. PrivilegeCount  dd   ?
    15. pLocalId    dd   ?
    16. chtoto      dd   ? ;незнаю что тут должно быть
    17. Attributes  dd   ?
    18. phToken     dd   ?
    19. szShut      db 'SeShutdownPrivilege',0
    20.  
     
  9. n0p

    n0p 10010000b

    Публикаций:
    0
    Регистрация:
    7 май 2003
    Сообщения:
    256
    Адрес:
    Новосиbeerск
    Вот мой кодезь. Рабочий. В файле winnt.inc все структуры, вроде правильно описаные.

    [​IMG] _1510529357__power.zip
     
  10. Worm32

    Worm32 New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2005
    Сообщения:
    33
    Адрес:
    Azerbaijan
    Cпасибо n0p ,качаю,посмотрю ,ато в отладчике отчень друдно понять где ,что зарезервированно,и в какой последовательности.

    Поэтому мой код получился кривой,но рабочий))))

    Спасибо еще раз))))
     
  11. Worm32

    Worm32 New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2005
    Сообщения:
    33
    Адрес:
    Azerbaijan
    Cтранно,не получаеться у меня твой пример скомпилить (((

    Делаю так.

    Компилю stub.asm ,нормально

    Подключаю твой файл winnt.inc, прописывая >
    Код (Text):
    1.  
    2. -------------------------------
    3. format PE CONSOLE on 'stub.exe'
    4. entry start
    5.  
    6. include 'fasminc\win32a.inc'
    7. include 'winnt.inc'  
    8. ---------------------------------


    Получаю ошибку >(winnt.inc)
    Код (Text):
    1.  
    2. struc GUID
    3. {
    4.     .Data1                      dd      ?
    5.     .Data2                      dw      ?
    6.     .Data3                      dw      ?
    7.     .Data4                      rb      8
    8. }
    9. struct GUID   >--- >  Error: incomplete macro.
    10.  


    Кстати и предидущий пример у меня не компилился тоже с такой ошибкой....

    Вроде все правильно сделал.
     
  12. n0p

    n0p 10010000b

    Публикаций:
    0
    Регистрация:
    7 май 2003
    Сообщения:
    256
    Адрес:
    Новосиbeerск
    Хмм.. что-то у тебя с фасмом и его макросами.. У меня фасм не самый свежий, но предпоследней версии. Макросы использую только library, import, export, imports(самодельный, тупо подключает все библиотеки, а import и library разруливают какие надо), struct, union (нужен для инклудов, поэтому не удалил) и все. Так что чисто гипотетически, должно компилиться абсолютно у всех (если таблицу импорта написать нормально)
     
  13. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Макрос struct изменён (iirc, с версии 1.56)

    С новыми include делается так:
    Код (Text):
    1.  
    2. struct GUID
    3.     .Data1                      dd      ?
    4.     .Data2                      dw      ?
    5.     .Data3                      dw      ?
    6.     .Data4                      rb      8
    7. ends
     
  14. Worm32

    Worm32 New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2005
    Сообщения:
    33
    Адрес:
    Azerbaijan
    Ага, а вот так как описал S_T_A_S_ компилиться )))

    Спасиб)

    ----------

    Прикольную прогу ты написал n0p , я сначала подумал вирус, так как поиск АПИ юзает.

    Запустил,вполне мирная прога.

    Под XP SP2 Нормально работают все её функции.
     
  15. n0p

    n0p 10010000b

    Публикаций:
    0
    Регистрация:
    7 май 2003
    Сообщения:
    256
    Адрес:
    Новосиbeerск
    Надо ее в исходники засунуть. Пусть народ порадуется :)

    К тому же небесполезная - пользуюсь ей ежедневно и не по разу.
     
  16. Worm32

    Worm32 New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2005
    Сообщения:
    33
    Адрес:
    Azerbaijan
    Вот это правильно n0p, выкладывать структуры надо.Любые.

    Народу, (начинающим в особенности) они очень пригодяться.