Сервис

Тема в разделе "WASM.BEGINNERS", создана пользователем fragment, 3 мар 2011.

  1. 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. 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'
    Тело самого сервиса , вот тут не могу разобраться:
    Код (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'
     
  2. izl3sa

    izl3sa New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2010
    Сообщения:
    164
    Адрес:
    Spb
    а вопрос где?
     
  3. AndjellaArtavazdovna

    AndjellaArtavazdovna New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2010
    Сообщения:
    615
    msdn вам в помощь!
     
  4. fragment

    fragment New Member

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

    Если бы я смог там разобраца то не просил бы наверное помощи.
     
  5. irrona

    irrona Member

    Публикаций:
    0
    Регистрация:
    26 май 2004
    Сообщения:
    178
    Адрес:
    Тирасполь
    fragment
    А как он у тебя останавливается, если ты ему не даешь этого сделать?
    Код (Text):
    1. proc ServiceCtrlHandler dwControl:DWORD
    2.  
    3.     cmp [dwControl],SERVICE_CONTROL_STOP
    4.     mov [ServiceStatus.dwCurrentState],SERVICE_RUNNING
    5.     invoke SetServiceStatus,[hStatus],ServiceStatus
    6.     ret
    7. endp
    К тому же, странно... вроде как пишешь сервис под 64 бита, а линкуешь с библиотеками x32
     
  6. AndjellaArtavazdovna

    AndjellaArtavazdovna New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2010
    Сообщения:
    615
    fragment
    Когда-то кодил сервер на сишке,он так у меня недописанный пока и лежит. Есть код самого модуля
    сервиса и код программки управления этим сервисом. В модуле сервиса код нормальный,а в проге управления - говнокод (писал чтоб сервис протестить) ,поэтому выкладывать стыдно))).Пишите мыло ,вечером могу прислать если надо.
    Написано на С чисто на Win API так что перевести на асм думаю труда не составит. А вообще книги есть
    неплохие "Системное программирование в Windows 2000" и "Программирование серверных приложений под Windows",авторов не помню,гугляться хорошо по-моему.
     
  7. izl3sa

    izl3sa New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2010
    Сообщения:
    164
    Адрес:
    Spb
    >> Помогите дописать функции управления сервисом
    ты конкретно спроси, что не понятно. Писать за кого то код тут мало найдется желающих.
     
  8. newbie

    newbie New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2008
    Сообщения:
    1.246
    фрагмент, пости в ветку COMMERCE, там помогут дописать и даже написать с нуля. Любой каприз за ваши деньги :)
     
  9. AndjellaArtavazdovna

    AndjellaArtavazdovna New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2010
    Сообщения:
    615
    Вот вот. Создается впечатление что чувак просто хочет на кого-нибудь свалить работу,которую сам делать не хочет.
    Да... Разбираться там есть с чем... Посмотри хотя бы прототипы ф-й,если с английским туго,и так все понятно будет.
     
  10. fragment

    fragment New Member

    Публикаций:
    0
    Регистрация:
    11 июн 2008
    Сообщения:
    266
    kuleshov666@gmail.com
     
  11. Ra_

    Ra_ New Member

    Публикаций:
    0
    Регистрация:
    4 мар 2007
    Сообщения:
    289
    Купи или скачай в сети, находится на раз
    Побегайло А.П. Системное программирование в Windows
    Издательство: БХВ-Петербург
    Прочти 33 и 34 главы
     
  12. fragment

    fragment New Member

    Публикаций:
    0
    Регистрация:
    11 июн 2008
    Сообщения:
    266
    Для отключения и настройки автозапуска сервиска какими API стоит воспользываца, перерыл весь MSDN но апи типа ServiceStop там не нашол. И как настроить тип автозапуска сервиса SERVICE_DISABLED ?
     
  13. AndjellaArtavazdovna

    AndjellaArtavazdovna New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2010
    Сообщения:
    615
    fragment
    Точно не помню,но кажется тип запуска сервиса задается при регистрации сервиса в системе при помощи
    CreateService(по-моему так). Как раз смотрите описалово CreateService,параметр dwStartType. Еще можно ключ
    в реестре прописать соответствующий. Смотрите исходники и книги(А именно "программирование серверных приложений"),которые я вам присылал.
    Add:
    И вот полезная инфа к размышлению http://msdn.microsoft.com/en-us/library/ms685141(v=VS.85).aspx.
    Если стоит задача "разобраться в программировании сервисов под windows" ,то лучше прочитать все по этим ссылкам.
     
  14. fragment

    fragment New Member

    Публикаций:
    0
    Регистрация:
    11 июн 2008
    Сообщения:
    266
    Дело в том что сервис уже существует, я хочу его остановить и изменить тип запуска.
    Делаю так по эксемплу из msdn http://msdn.microsoft.com/en-us/library/ms682006(v=vs.85).aspx

    Код (Text):
    1. ....
    2.         MpsSvc db 'MpsSvc',0
    3.  
    4.  
    5.         schSCManager    dd      ?
    6.         svcSCManager    dd      ?
    7.                                                            
    8. ....
    9. proc StopFirewall
    10.  
    11.         invoke OpenSCManagerA,NULL,NULL,SC_MANAGER_ALL_ACCESS
    12.         mov [schSCManager],eax
    13.  
    14.         invoke OpenServiceA,eax,MpsSvc,SC_MANAGER_ALL_ACCESS
    15.         mov [svcSCManager],eax
    16.  
    17.         invoke ChangeServiceConfigA,eax,0,4,0,0,0,0,0,0,0,0
    18.  
    19.         invoke CloseServiceHandle,[schSCManager]
    20.         invoke CloseServiceHandle,[svcSCManager]
    21.  
    22.         ret
    23. endp      
    24.  
    25. ....
    но тип запуска не изменяется.

    В реестре копаца не хочется , антивирус палит все возможные ключи в .data , мне это надоело .
     
  15. AndjellaArtavazdovna

    AndjellaArtavazdovna New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2010
    Сообщения:
    615
    fragment
    Посмотрите с какими ошибками и какие ф-и завершаются .Так сказать трудно - от невалидных параметров
    до запуска без прав админа. А вот и ключик этот кажется HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services.
     
  16. AndjellaArtavazdovna

    AndjellaArtavazdovna New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2010
    Сообщения:
    615
    fragment
    А вы думаете если изменить тип запуска через ChangeServiceConfigA значение этого ключика не измениться? И в ChangeServiceConfigA dwServiceType вроде SERVICE_WIN32_OWN_PROCESS
    использовать надо ,а не 0 надо использовать.
    Add:
    И на счет AV еще:
    Чисто по моему опыту есть 2 варианта - либо AV чихать на этот ключ,либо как не пряч его из usermode
    все равно спалит(оно и так понятно). Ну а строку вообще и зашифровать не сложно,если по ней палит,это не страшно.
     
  17. fragment

    fragment New Member

    Публикаций:
    0
    Регистрация:
    11 июн 2008
    Сообщения:
    266
    HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\MpsSvc ключик Start надо изменить на 00000004h , это SERVICE_DISABLED. А как вот остановить службу без перезагрузки , хотя мне это не особо надо т.к. перезагружаца придется...
     
  18. AndjellaArtavazdovna

    AndjellaArtavazdovna New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2010
    Сообщения:
    615
    fragment
    Вообще там при создании сервиса регистрируется обработчик событий от SCM. Вот если в нем обработать событие завершения процесса (я так понимаю это ехе-сервис),то он завершается после завершения
    всех потоков. А вот код события не помню,зато нашел это http://msdn.microsoft.com/en-us/library/bb540476(v=VS.85).aspx. И в тех исходниках сервиса оно тоже есть.
     
  19. fragment

    fragment New Member

    Публикаций:
    0
    Регистрация:
    11 июн 2008
    Сообщения:
    266
    Посмотрел под олькой, функция AdjustTokenPrivileges возвращает в LastError 000003E6 ERROR_NOACCESS Почему , раньше такова небыло ?
    Разобрался забыл про align4
     
  20. AndjellaArtavazdovna

    AndjellaArtavazdovna New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2010
    Сообщения:
    615
    Ну либо надо запустить с админскими правами,либо проверить правильно ли
    завершаются OpenProcessToken и LookupPrivilegeValueA.
    Код (Text):
    1. AdjustTokenPrivileges,[hToken],FALSE,TokenPriv,0,NULL,NULL
    Токен этот проверяли? C ним все нормально. Здесь сразу не помогу - то что касается токенов ,безопасности и прав доступа помню не очень .
    Add:
    Опоздал малость.