[вопрос]Сервис.

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

  1. HPC

    HPC New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2011
    Сообщения:
    37
    Всем привет.
    Есть один вопрос.
    Можно запустить .EXE чтоб он работал как сервис а Можно ли запустить Dll как сервис?
     
  2. gaeprust

    gaeprust New Member

    Публикаций:
    0
    Регистрация:
    2 май 2011
    Сообщения:
    188
    Смотря что вы понимаете под длл - расширение файла или флажок в модуле IMAGE_FILE_DLL. Во втором случае запуск процесса из длл возможен, ядро создаст секцию и успешно создаст из неё процесс, но есть в kernel32 одна проверка, при которой в секции проверяется влаг IMAGE_FILE_DLL - он должен быть сброшен:
    Код (Text):
    1.        //
    2.         // Query the section to determine the stack parameters and
    3.         // image entrypoint.
    4.         //
    5.  
    6.         Status = NtQuerySection(
    7.                     SectionHandle,
    8.                     SectionImageInformation,
    9.                     &ImageInformation,
    10.                     sizeof( ImageInformation ),
    11.                     NULL
    12.                     );
    13.  
    14.         if (!NT_SUCCESS( Status )) {
    15.             BaseSetLastNTError(Status);
    16.             RtlFreeHeap(RtlProcessHeap(), 0,FreeBuffer);
    17.             FreeBuffer = NULL;
    18.             return FALSE;
    19.             }
    20.  
    21.         if (ImageInformation.ImageCharacteristics & IMAGE_FILE_DLL) {
    22.             SetLastError(ERROR_BAD_EXE_FORMAT);
    Если эту проверку обойти, то процесс будет запущен из длл, у меня есть старый семпл:
    Код (Text):
    1. _imp__ZwQuerySection proto SectionHandle:HANDLE, SectionInformationClass:ULONG, SectionInformation:PVOID, SectionInformationLength:ULONG, ResultLength:PULONG
    2.  
    3. .code
    4. ServiceEntry2 proc C
    5.     lea edx,[esp + 4]
    6.     Int 2EH
    7.     test eax,eax
    8.     jnz @f
    9.     cmp dword ptr [esp + 2*4],SectionImageInformation
    10.     jne @f
    11.     mov eax,dword ptr [esp + 3*4]   ; SectionInformation
    12.     test eax,eax
    13.     jz @f
    14.     assume eax:PSECTION_IMAGE_INFORMATION
    15.     test [eax].ImageCharacteristics,IMAGE_FILE_DLL
    16.     jz @f
    17.     and [eax].ImageCharacteristics,NOT(IMAGE_FILE_DLL)
    18.     ;or [eax].ImageCharacteristics,IMAGE_FILE_EXECUTABLE_IMAGE
    19.     xor eax,eax
    20. @@:
    21.     retn 4*5
    22. ServiceEntry2 endp
    23.  
    24. BreakpointDispatcher proc ExceptionPointers:PEXCEPTION_POINTERS
    25.     mov eax,ExceptionPointers
    26.     mov edx,EXCEPTION_POINTERS.ExceptionRecord[eax]
    27.     assume edx:PEXCEPTION_RECORD
    28.     mov ecx,EXCEPTION_POINTERS.ContextRecord[eax]
    29.     assume ecx:PCONTEXT
    30.     cmp [edx].ExceptionFlags,NULL
    31.     jnz Chain
    32.     cmp [edx].ExceptionCode,STATUS_SINGLE_STEP
    33.     jne Chain
    34.     test [ecx].regDr6,HB_EVENT_BREAK_0
    35.     jz Chain
    36.     xor eax,eax
    37.     mov [ecx].regEip,offset ServiceEntry2
    38.     dec eax
    39.     ret
    40. Chain:
    41.     xor eax,eax
    42.     ret
    43. BreakpointDispatcher endp
    44.  
    45. $ProcessName    CHAR "lib.dll",0
    46.  
    47. Entry proc
    48. Local Context:CONTEXT
    49. Local ProcessInfo32:PROCESS_INFORMATION
    50. Local StartupInfo32:STARTUPINFO
    51.     assume fs:nothing
    52.     mov eax,dword ptr [_imp__ZwQuerySection]
    53.     mov Context.regDr7,HB_0_ON_LOCAL or HB_LOCALS_ENABLE
    54.     .if byte ptr [eax] == 0B8H
    55.         lea eax,[eax + 5]
    56.         mov Context.ContextFlags,CONTEXT_DEBUG_REGISTERS
    57.         mov Context.regDr0,eax
    58.         invoke ZwSetContextThread, NtCurrentThread, addr Context
    59.         .if !Eax
    60.             invoke RtlAddVectoredExceptionHandler, 1, addr BreakpointDispatcher
    61.             invoke GetStartupInfo, addr StartupInfo32
    62.             invoke CreateProcess, addr $ProcessName, NULL, 0, 0, 0, 0, 0, 0, addr StartupInfo32, addr ProcessInfo32
    63.         .endif
    64.     .endif
    65.     ret
    66. Entry endp
     
  3. HPC

    HPC New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2011
    Сообщения:
    37
    Понял.Спасибо.
     
  4. karabas_barabas

    karabas_barabas Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    168
    попробуй что-то типа такого