Программирование Win64-сервисов

Тема в разделе "WASM.X64", создана пользователем fragment, 2 ноя 2010.

  1. fragment

    fragment New Member

    Публикаций:
    0
    Регистрация:
    11 июн 2008
    Сообщения:
    266
    Здравствуйте, мою преведущую тему о сервисах Windows закрыли поэтому создаю новую.
    Хочу научица создавать сервисы.Пока это не особо получается. Хочу разобраца со всеми тонкастями.У меня вопрос сейчас просто по синтаксису FASM, как передать функции адрес структуры ? Не пинайте сильно.

    Код (Text):
    1. format PE64 GUI 5.0
    2. entry Main
    3.  
    4. include 'win64a.inc'
    5.  
    6. SC_MANAGER_CREATE_SERVICE   =   0002h
    7.  
    8. SERVICE_WIN32_OWN_PROCESS   =   00000010h
    9. SERVICE_DEMAND_START        =   00000003h
    10. SERVICE_ERROR_IGNORE        =   00000000h
    11.  
    12. SERVICE_CONFIG_DESCRIPTION  =   00000001h
    13.  
    14.     struct SERVICE_DESCRIPTION
    15.       lpDescription  dq  ?
    16.     ends
    17.  
    18. section '.data' data readable writeable
    19.  
    20.     szServiceName   db  'Test service',0
    21.     szDisplayName   db  'Test service 123',0
    22.     lpDescription   db  'Test service description',0
    23.     szFileName  db  'C:\TestService.exe',0
    24.  
    25.     schSCManager    dq  ?
    26.     svcSCManager    dq  ?
    27.  
    28.     scherror    db     'ошибка OpenSCManager().',0
    29.     svcerror    db     'ошибка CreateService.()',0
    30.     svccreate   db     '*** сервис создан.',0
    31.  
    32. section '.code' code readable executable
    33. proc Main
    34.  
    35.     invoke OpenSCManagerA,NULL,NULL,SC_MANAGER_CREATE_SERVICE
    36.     cmp rax,0
    37.     je .scherror
    38.     mov [schSCManager],rax
    39.  
    40.     invoke CreateServiceA,[schSCManager],szServiceName,szDisplayName,\
    41.     STANDARD_RIGHTS_REQUIRED,SERVICE_WIN32_OWN_PROCESS,SERVICE_DEMAND_START,SERVICE_ERROR_IGNORE,\
    42.     szFileName,NULL,NULL,NULL,NULL,NULL
    43.     cmp rax,0
    44.     je .svcerror
    45.     mov [svcSCManager],rax
    46.  
    47.     mov [SERVICE_DESCRIPTION.lpDescription],lpDescription
    48.     invoke ChangeServiceConfig2A,[svcSCManager],SERVICE_CONFIG_DESCRIPTION,SERVICE_DESCRIPTION
    49.  
    50.     invoke CloseServiceHandle,[schSCManager]
    51.     invoke CloseServiceHandle,[svcSCManager]
    52.  
    53.     invoke MessageBoxA,0,svccreate,0,MB_ICONWARNING
    54.     jmp .exit
    55.  
    56. .svcerror:
    57.     invoke MessageBoxA,0,scherror,0,MB_ICONERROR
    58.     jmp .exit
    59.  
    60. .scherror:
    61.     invoke MessageBoxA,0,svcerror,0,MB_ICONERROR
    62.  
    63. .exit:
    64.     invoke ExitProcess,rax
    65. endp
    66.  
    67. section '.idata' import data readable
    68.  
    69.     library kernel,'KERNEL32.DLL',\
    70.         user,'USER32.DLL',\
    71.         advapi,'ADVAPI32.DLL'
    72.  
    73.     import advapi,\
    74.         OpenSCManagerA,'OpenSCManagerA',\
    75.         CreateServiceA,'CreateServiceA',\
    76.         ChangeServiceConfig2A,'ChangeServiceConfig2A',\
    77.         CloseServiceHandle,'CloseServiceHandle'
    78.  
    79.     import kernel,\
    80.            ExitProcess,'ExitProcess'
    81.  
    82.     import user,\
    83.            MessageBoxA,'MessageBoxA'
    Нада заполнить структуру и передать её ChangeServiceConfig2A , помогите пожалуйста.
     
  2. fragment

    fragment New Member

    Публикаций:
    0
    Регистрация:
    11 июн 2008
    Сообщения:
    266
    Еще такой вопрос , почему то немогу удалить сервис.

    Код (Text):
    1. format PE64 GUI 5.0
    2. entry Main
    3.  
    4. include 'win64a.inc'
    5.  
    6. SC_MANAGER_ALL_ACCESS       =   0F003Fh
    7.  
    8. section '.data' data readable writeable
    9.  
    10.     szServiceName   db  'Test service',0
    11.  
    12.     schSCManager    dq  ?
    13.     svcSCManager    dq  ?
    14.  
    15.     scherror    db     'ошибка OpenSCManager().',0
    16.     svcerror    db     'ошибка OpenServiceA()',0
    17.     svcdelete   db     '*** сервис удалён.',0
    18.  
    19. section '.code' code readable executable
    20. proc Main
    21.  
    22.     invoke OpenSCManagerA,NULL,NULL,SC_MANAGER_ALL_ACCESS
    23.     cmp rax,0
    24.     je .scherror
    25.     mov [schSCManager],rax
    26.  
    27.     invoke OpenServiceA,[schSCManager],szServiceName,SC_MANAGER_ALL_ACCESS
    28.     cmp rax,0
    29.     je .svcerror
    30.     mov [svcSCManager],rax
    31.  
    32.     invoke DeleteService,[svcSCManager]
    33.  
    34.     invoke CloseServiceHandle,[schSCManager]
    35.     invoke CloseServiceHandle,[svcSCManager]
    36.  
    37.     invoke MessageBoxA,0,svcdelete,0,MB_ICONWARNING
    38.     jmp .exit
    39.  
    40. .svcerror:
    41.     invoke MessageBoxA,0,scherror,0,MB_ICONERROR
    42.     jmp .exit
    43.  
    44. .scherror:
    45.     invoke MessageBoxA,0,svcerror,0,MB_ICONERROR
    46.  
    47. .exit:
    48.     invoke ExitProcess,rax
    49. endp
    50.  
    51. section '.idata' import data readable
    52.  
    53.     library kernel,'KERNEL32.DLL',\
    54.         user,'USER32.DLL',\
    55.         advapi,'ADVAPI32.DLL'
    56.  
    57.     import advapi,\
    58.         OpenSCManagerA,'OpenSCManagerA',\
    59.         OpenServiceA,'OpenServiceA',\
    60.         DeleteService,'DeleteService',\
    61.         CloseServiceHandle,'CloseServiceHandle'
    62.  
    63.     import kernel,\
    64.            ExitProcess,'ExitProcess'
    65.  
    66.     import user,\
    67.            MessageBoxA,'MessageBoxA'
    Тему наверное надо было создавать в разделе для новечков :dntknw:
    Перенисите её пожалуйста.

    С удалением разобрался , код правельный , WIndows удалила службу после перезагрузки компьютера.
     
  3. qwe8013

    qwe8013 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    198
    Код (Text):
    1.     mov [SERVICE_DESCRIPTION.lpDescription],lpDescription
    2.     invoke ChangeServiceConfig2A,[svcSCManager],SERVICE_CONFIG_DESCRIPTION,SERVICE_DESCRIPTION
    Где у вас объявлена структура с типом SERVICE_DESCRIPTION?
     
  4. fragment

    fragment New Member

    Публикаций:
    0
    Регистрация:
    11 июн 2008
    Сообщения:
    266
    Всё , получилось зарегистрировать

    Код (Text):
    1. format PE64 GUI 5.0
    2. entry Main
    3.  
    4. include 'win64a.inc'
    5.  
    6. SC_MANAGER_CREATE_SERVICE   =    0002h
    7. SERVICE_CHANGE_CONFIG       =    0002h
    8.  
    9. SERVICE_WIN32_OWN_PROCESS   =    00000010h
    10. SERVICE_DEMAND_START        =    00000003h
    11. SERVICE_ERROR_IGNORE        =    00000000h
    12.  
    13. SERVICE_CONFIG_DESCRIPTION  =    00000001h
    14.  
    15. section '.data' data readable writeable
    16.  
    17.     struct SERVICE_DESCRIPTION
    18.       lpDescription  dq     ?
    19.     ends
    20.  
    21.     SERV_DESC SERVICE_DESCRIPTION
    22.  
    23.     szServiceName    db    'Test service',0
    24.     szDisplayName    db    'Test service 123',0
    25.     lpDescription    db    'Test service description',0
    26.     szFileName       db    'C:\TestService.exe',0
    27.  
    28.     schSCManager    dq    ?
    29.     svcSCManager    dq    ?
    30.  
    31.     scherror    db     'ошибка OpenSCManager().',0
    32.     svcerror    db     'ошибка CreateService().',0
    33.     svccreate   db     '*** сервис создан.',0
    34.  
    35. section '.code' code readable executable
    36. proc Main
    37.  
    38.     invoke OpenSCManagerA,NULL,NULL,SC_MANAGER_CREATE_SERVICE or SERVICE_CHANGE_CONFIG
    39.  
    40.     cmp rax,0
    41.     je .scherror
    42.  
    43.     mov [schSCManager],rax
    44.  
    45.     invoke CreateServiceA,[schSCManager],szServiceName,szDisplayName,\
    46.     STANDARD_RIGHTS_REQUIRED or SERVICE_CHANGE_CONFIG,SERVICE_WIN32_OWN_PROCESS,SERVICE_DEMAND_START,SERVICE_ERROR_IGNORE,\
    47.     szFileName,NULL,NULL,NULL,NULL,NULL
    48.  
    49.     cmp rax,0
    50.     je .svcerror
    51.  
    52.     mov [svcSCManager],rax
    53.  
    54.     mov [SERV_DESC.lpDescription],lpDescription
    55.     invoke ChangeServiceConfig2A,[svcSCManager],SERVICE_CONFIG_DESCRIPTION,SERV_DESC
    56.  
    57.     invoke CloseServiceHandle,[schSCManager]
    58.     invoke CloseServiceHandle,[svcSCManager]
    59.  
    60.     invoke MessageBoxA,0,svccreate,0,MB_ICONWARNING
    61.     jmp .exit
    62.  
    63. .svcerror:
    64.     invoke MessageBoxA,0,svcerror,0,MB_ICONERROR
    65.     jmp .exit
    66.  
    67. .scherror:
    68.     invoke MessageBoxA,0,scherror,0,MB_ICONERROR
    69.  
    70. .exit:
    71.     invoke ExitProcess,rax
    72. endp
    73.  
    74. section '.idata' import data readable
    75.  
    76.     library kernel,'KERNEL32.DLL',\
    77.     user,'USER32.DLL',\
    78.     advapi,'ADVAPI32.DLL'
    79.  
    80.     import advapi,\
    81.     OpenSCManagerA,'OpenSCManagerA',\
    82.     CreateServiceA,'CreateServiceA',\
    83.     ChangeServiceConfig2A,'ChangeServiceConfig2A',\
    84.     CloseServiceHandle,'CloseServiceHandle'
    85.  
    86.     import kernel,\
    87.        ExitProcess,'ExitProcess'
    88.  
    89.     import user,\
    90.        MessageBoxA,'MessageBoxA'
    Помогиет дописать сам сервис, я так понимаю по логике он будет начинаца типа:

    Код (Text):
    1. format PE64 GUI 5.0
    2. entry Main
    3.  
    4. include 'win64a.inc'
    5.  
    6. SERVICE_WIN32_OWN_PROCESS   =   00000010h
    7. SERVICE_INTERACTIVE_PROCESS =   00000100h
    8. SERVICE_START_PENDING       =   00000002h
    9. SERVICE_ACCEPT_STOP     =   00000001h
    10. SERVICE_ACCEPT_SHUTDOWN     =   00000004h
    11. SERVICE_RUNNING         =   00000004h
    12. SERVICE_CONTROL_STOP        =   00000001h
    13. NO_ERROR            =   0h
    14.  
    15. section '.data' data readable writeable
    16.  
    17.     struct SERVICE_TABLE_ENTRY
    18.       lpServiceName  dq     ?
    19.       lpServiceProc  dq     ?
    20.     ends
    21.  
    22. ServiceTable SERVICE_TABLE_ENTRY
    23.  
    24.     struct SERVICE_STATUS
    25.       dwServiceType         dd  ?
    26.       dwCurrentState            dd  ?
    27.       dwControlsAccepted        dd  ?
    28.       dwWin32ExitCode           dd  ?
    29.       dwServiceSpecificExitCode     dd  ?
    30.       dwCheckPoint          dd  ?
    31.       dwWaitHint            dd  ?
    32.     ends
    33.  
    34. ServiceStatus SERVICE_STATUS
    35.  
    36.  hStatus    dq ?
    37.  hello      db 'Hello, world!',0
    38.  ServiceName    db 'Test service',0
    39.  
    40. section '.code' code readable executable
    41.  
    42. proc Main
    43.  
    44.      mov [ServiceTable.lpServiceName],ServiceName
    45.      mov [ServiceTable.lpServiceProc],ServiceMain
    46.  
    47.      invoke StartServiceCtrlDispatcher,ServiceTable
    48.  
    49. endp
    50.  
    51. proc ServiceMain dwArgc:DWORD, lpszArgv:QWORD
    52.  
    53.     invoke RegisterServiceCtrlHandler,ServiceName,ServiceCtrlHandler
    54.     mov [hStatus],rax
    55.     mov [ServiceStatus.dwServiceType],SERVICE_WIN32_OWN_PROCESS or SERVICE_INTERACTIVE_PROCESS
    56.     mov [ServiceStatus.dwCurrentState],SERVICE_START_PENDING
    57.     mov [ServiceStatus.dwControlsAccepted],SERVICE_ACCEPT_STOP or SERVICE_ACCEPT_SHUTDOWN
    58.     invoke SetServiceStatus,[hStatus],ServiceStatus
    59.  
    60.     mov [ServiceStatus.dwCurrentState],SERVICE_RUNNING
    61.     mov [ServiceStatus.dwWin32ExitCode],NO_ERROR
    62.     invoke SetServiceStatus,[hStatus],ServiceStatus
    63.  
    64.     call ServiceProc
    65. endp
    66.  
    67. proc ServiceCtrlHandler dwControl:DWORD
    68.  
    69.     cmp [dwControl],SERVICE_CONTROL_STOP
    70.     mov [ServiceStatus.dwCurrentState],SERVICE_RUNNING
    71.     invoke SetServiceStatus,[hStatus],ServiceStatus
    72.     ret
    73. endp
    74.  
    75. proc ServiceProc
    76. .rep:
    77.     invoke Sleep,3000
    78.     invoke MessageBoxA,0,hello,0,MB_ICONWARNING
    79.     jmp .rep
    80. endp
    81.  
    82. section '.idata' import data readable
    83.  
    84.     library kernel,'KERNEL32.DLL',\
    85.     user,'USER32.DLL',\
    86.     advapi,'ADVAPI32.DLL'
    87.  
    88.     import advapi,\
    89.     OpenSCManagerA,'OpenSCManagerA',\
    90.     CreateServiceA,'CreateServiceA',\
    91.     ChangeServiceConfig2A,'ChangeServiceConfig2A',\
    92.     CloseServiceHandle,'CloseServiceHandle',\
    93.     StartServiceCtrlDispatcher,'StartServiceCtrlDispatcherA',\
    94.     RegisterServiceCtrlHandler,'RegisterServiceCtrlHandlerA',\
    95.     SetServiceStatus,'SetServiceStatus'
    96.  
    97.  
    98.     import kernel,\
    99.        ExitProcess,'ExitProcess',\
    100.        Sleep,'Sleep'
    101.  
    102.     import user,\
    103.        MessageBoxA,'MessageBoxA'
    [​IMG]

    помогите пожалуйста