Сейчас на форуме: jinoweb, bartolomeo (+5 невидимых)

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

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

Создано: 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




Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 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
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати