Всем привет. Есть один вопрос. Можно запустить .EXE чтоб он работал как сервис а Можно ли запустить Dll как сервис?
Смотря что вы понимаете под длл - расширение файла или флажок в модуле IMAGE_FILE_DLL. Во втором случае запуск процесса из длл возможен, ядро создаст секцию и успешно создаст из неё процесс, но есть в kernel32 одна проверка, при которой в секции проверяется влаг IMAGE_FILE_DLL - он должен быть сброшен: Код (Text): // // Query the section to determine the stack parameters and // image entrypoint. // Status = NtQuerySection( SectionHandle, SectionImageInformation, &ImageInformation, sizeof( ImageInformation ), NULL ); if (!NT_SUCCESS( Status )) { BaseSetLastNTError(Status); RtlFreeHeap(RtlProcessHeap(), 0,FreeBuffer); FreeBuffer = NULL; return FALSE; } if (ImageInformation.ImageCharacteristics & IMAGE_FILE_DLL) { SetLastError(ERROR_BAD_EXE_FORMAT); Если эту проверку обойти, то процесс будет запущен из длл, у меня есть старый семпл: Код (Text): _imp__ZwQuerySection proto SectionHandle:HANDLE, SectionInformationClass:ULONG, SectionInformation:PVOID, SectionInformationLength:ULONG, ResultLength:PULONG .code ServiceEntry2 proc C lea edx,[esp + 4] Int 2EH test eax,eax jnz @f cmp dword ptr [esp + 2*4],SectionImageInformation jne @f mov eax,dword ptr [esp + 3*4] ; SectionInformation test eax,eax jz @f assume eax:PSECTION_IMAGE_INFORMATION test [eax].ImageCharacteristics,IMAGE_FILE_DLL jz @f and [eax].ImageCharacteristics,NOT(IMAGE_FILE_DLL) ;or [eax].ImageCharacteristics,IMAGE_FILE_EXECUTABLE_IMAGE xor eax,eax @@: retn 4*5 ServiceEntry2 endp BreakpointDispatcher proc ExceptionPointers:PEXCEPTION_POINTERS mov eax,ExceptionPointers mov edx,EXCEPTION_POINTERS.ExceptionRecord[eax] assume edx:PEXCEPTION_RECORD mov ecx,EXCEPTION_POINTERS.ContextRecord[eax] assume ecx:PCONTEXT cmp [edx].ExceptionFlags,NULL jnz Chain cmp [edx].ExceptionCode,STATUS_SINGLE_STEP jne Chain test [ecx].regDr6,HB_EVENT_BREAK_0 jz Chain xor eax,eax mov [ecx].regEip,offset ServiceEntry2 dec eax ret Chain: xor eax,eax ret BreakpointDispatcher endp $ProcessName CHAR "lib.dll",0 Entry proc Local Context:CONTEXT Local ProcessInfo32:PROCESS_INFORMATION Local StartupInfo32:STARTUPINFO assume fs:nothing mov eax,dword ptr [_imp__ZwQuerySection] mov Context.regDr7,HB_0_ON_LOCAL or HB_LOCALS_ENABLE .if byte ptr [eax] == 0B8H lea eax,[eax + 5] mov Context.ContextFlags,CONTEXT_DEBUG_REGISTERS mov Context.regDr0,eax invoke ZwSetContextThread, NtCurrentThread, addr Context .if !Eax invoke RtlAddVectoredExceptionHandler, 1, addr BreakpointDispatcher invoke GetStartupInfo, addr StartupInfo32 invoke CreateProcess, addr $ProcessName, NULL, 0, 0, 0, 0, 0, 0, addr StartupInfo32, addr ProcessInfo32 .endif .endif ret Entry endp