Сейчас на форуме: jinoweb, bartolomeo (+5 невидимых) |
eXeL@B —› Программирование —› Запуск/останов службы Windows - Assembler |
Посл.ответ | Сообщение |
|
Создано: 04 апреля 2017 16:54 · Личное сообщение · #1 Приветствую всезнающий all. Изучаю один екзешник), взял из него код создания службы, но не могу запустить ее. Она ничего не делает. Просто хочется ее запустить и остановить. Она не стартует. Вычитал, что в структуре SERVICE_TABLE_ENTRY нужно последние два элемента добить нулями, поэтому в windows.inc добавил так: SERVICE_TABLE_ENTRYW STRUCT lpServiceName DWORD ? lpServiceProc DWORD ? v1 DWORD 0 v2 DWORD 0 SERVICE_TABLE_ENTRYW ENDS Помогите, знающие люди. .model flat, stdcall option casemap :none include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\advapi32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\advapi32.lib ServiceControlHandler PROTO :DWORD ServiceMain PROTO :DWORD, :DWORD .data sTable SERVICE_TABLE_ENTRY < 0, 0,0,0> ServStat SERVICE_STATUS <> sName BYTE "TestService",0 hServStat Dd 0 schSCManager dd 0 szFileName db 'C:\my pro\servises\222.exe',0 hService dd 0 stopServiceEvent DWORD 0 t1 db "start",0 t2 db "service main",0 displayName db "TestService",0 .code start: ; invoke MessageBox, 0, offset t1,offset t1,MB_OK mov sTable.lpServiceProc, offset ServiceMain mov sTable.lpServiceName, offset sName mov sTable.v1, 0 mov sTable.v2, 0 INVOKE StartServiceCtrlDispatcher, offset sTable invoke OpenSCManagerA,NULL,NULL,SC_MANAGER_ALL_ACCESS test eax,eax jz exit1 mov [schSCManager],eax invoke CreateServiceA,[schSCManager],offset sName,offset displayName, SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS,SERVICE_AUTO_START,SERVICE_ERROR_NORMAL, offset szFileName,NULL,NULL,NULL,NULL,NULL mov hService, eax test eax,eax jnz next1 ;Invoke GetLastError mov edi, 0f01ffh Invoke OpenService, [schSCManager],offset sName, edi invoke StartService, eax, NULL, NULL jmp exit1 next1: invoke StartService, hService, NULL, NULL invoke CloseServiceHandle, hService exit1: invoke ExitProcess, NULL ServiceMain proc argc:DWORD, argv:DWORD invoke RegisterServiceCtrlHandler, addr sName,addr ServiceControlHandler mov hServStat,eax mov ServStat.dwServiceType,SERVICE_WIN32_SHARE_PROCESS mov ServStat.dwControlsAccepted,0 mov ServStat.dwWin32ExitCode,NO_ERROR mov ServStat.dwServiceSpecificExitCode,NO_ERROR mov ServStat.dwCheckPoint,0 mov ServStat.dwWaitHint,0 mov ServStat.dwCurrentState,SERVICE_START_PENDING invoke SetServiceStatus, hServStat,addr ServStat mov ServStat.dwCurrentState,SERVICE_RUNNING invoke SetServiceStatus,hServStat,addr ServStat ;invoke MessageBox, 0, offset t2,offset t2,MB_OK invoke ExitProcess, NULL ServiceMain endp ServiceControlHandler proc controlcode:DWORD .IF controlcode==SERVICE_CONTROL_INTERROGATE jmp next .ELSEIF controlcode==SERVICE_CONTROL_SHUTDOWN || controlcode==SERVICE_CONTROL_STOP mov ServStat.dwCurrentState,SERVICE_STOP_PENDING invoke SetServiceStatus,addr hServStat,addr ServStat invoke SetEvent,addr stopServiceEvent ret .ELSEIF controlcode==SERVICE_CONTROL_PAUSE jmp next .ELSEIF controlcode==SERVICE_CONTROL_CONTINUE jmp next .ENDIF next: invoke SetServiceStatus,hServStat,addr ServStat ret ServiceControlHandler endp end start |
|
Создано: 04 апреля 2017 17:07 · Поправил: -=AkaBOSS=- · Личное сообщение · #2 interst71 пишет: Она не стартует убери нафиг вызов ExitProcess из ServiceMain, будет стартовать) interst71 пишет: Вычитал, что в структуре SERVICE_TABLE_ENTRY нужно последние два элемента добить нулями не совсем правильно. Просто StartServiceCtrlDispatcher принимает адрес не одной структуры, а массива структур SERVICE_TABLE_ENTRY, и конец этого массива определяется по структуре, у которой оба поля забиты нулями. invoke SetEvent,addr stopServiceEvent пытаешься триггерить событие, которое не создал (хэндла нет) |
eXeL@B —› Программирование —› Запуск/останов службы Windows - Assembler |