Русский / Russian English / Английский

Сейчас на форуме: (+4 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS ·

 eXeL@B —› Программирование —› Запуск/останов службы Windows - Assembler
Посл.ответ Сообщение

Ранг: 1.0 (гость)
Статус: Участник

Создано: 4 апреля 2017 16:54 New!
Цитата · Личное сообщение · #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


Ранг: 150.7 (ветеран)
Статус: Участник

Создано: 4 апреля 2017 17:07 · Поправил: -=AkaBOSS=- New!
Цитата · Личное сообщение · #2

interst71 пишет:
Она не стартует

убери нафиг вызов ExitProcess из ServiceMain, будет стартовать)

interst71 пишет:
Вычитал, что в структуре SERVICE_TABLE_ENTRY нужно последние два элемента добить нулями

не совсем правильно.
Просто StartServiceCtrlDispatcher принимает адрес не одной структуры, а массива структур SERVICE_TABLE_ENTRY, и конец этого массива определяется по структуре, у которой оба поля забиты нулями.

invoke SetEvent,addr stopServiceEvent
пытаешься триггерить событие, которое не создал (хэндла нет)
 eXeL@B —› Программирование —› Запуск/останов службы Windows - Assembler

Видеокурс ВЗЛОМ