Как выполнить свой код раньше всех при создании нового процесса?

Тема в разделе "WASM.WIN32", создана пользователем GoldFinch, 28 мар 2010.

  1. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Если создавать процесс с флагом CREATE_SUSPENDED, то успевают загрузиться и выполниться длл которые статически импортирует .exe .
    Что делать?
     
  2. mrcrown

    mrcrown Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    227
    Хз, мжет есть проще решения, но как вариант свой загрузчик.
     
  3. ohne

    ohne New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2009
    Сообщения:
    431
    Имеется в виду динамически может?
     
  4. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    GoldFinch
    >Если создавать процесс с флагом CREATE_SUSPENDED, то успевают загрузиться и выполниться длл которые статически импортирует .exe.

    Да ну? Повторимся: После возврата из CreateProcess(CREATE_SUSPENDED) первичный поток новосозданного процесса остановлен – и не исполнил ни одной инструкции в юзермоде. Т.е. те модули, которые загружены в него в этот момент (из реально исполняемых это только нативная ntdll и главный модуль процесса) – загружены ядром, и ты с этим ничего не поделаешь.
     
  5. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
     
  6. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    я ошибся =\

    я запускал .ехе с флагом CREATE_SUSPENDED,
    делал CreateRemoteThread, у меня при этом загружались длл в импортах .ехе, а только потом запускался поток

    я это увидел, и сделал вывод что если запускать процесс с флагом CREATE_SUSPENDED, то длл всеравно загружаются :dntknw:
     
  7. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    тему можно закрыть, всем спасибо
     
  8. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    если заменить CreateRemoteThread на QueueUserAPC, наблюдается тот же эффект
    похоже что SetThreadContext - наше всё.
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    GoldFinch
    Остановка процесса - это останов всех его потоков, ядро енумит и суспендит каждый.
    Стартуп-апк ядерная, из юзермода не измените. Можно флажки изменить, а далее обработать останов локально или удалённо как дебуггер.
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Код (Text):
    1. SEH_FRAME struct
    2. pLink   PVOID ?
    3. pSeh        PVOID ?
    4. pSafe   PVOID ?
    5. rEbp        PVOID ?
    6. SEH_FRAME ends
    7. PSEH_FRAME typedef ptr SEH_FRAME
    8.  
    9. STACK_FRAME struct
    10. Seh     SEH_FRAME <>
    11. pRet        PVOID ?
    12. Data        PVOID ?
    13. STACK_FRAME ends
    14. PSTACK_FRAME typedef ptr STACK_FRAME
    15.  
    16. REMOTE_SEH macro
    17.     assume fs:nothing
    18.     mov esp,dword ptr [esp + 2*4]       ; ExceptionList.
    19.     mov fs:[TEB.Tib.ExceptionList],NULL
    20.     push STACK_FRAME.Seh.pSafe[esp]
    21.     xor ebp,ebp
    22.     ret sizeof(SEH_FRAME)
    23. endm
    24.  
    25. ; typedef VOID (*PSTARTUP_ROUTINE)(
    26. ;    IN PVOID StartupParameter
    27. ;    );
    28.  
    29. ; +
    30. ; Создаёт поток без вызова LdrInitializeThunk().
    31. ;
    32. CreateHiddenThread proc ProcessHandle:HANDLE, ExceptionHandler:PREMOTE_SEH, CreateSuspended:BOOLEAN, StartupRoutine:PVOID, StartupParameter:PVOID, OutThreadHandle:PHANDLE
    33. Local ClientId:CLIENT_ID
    34. Local ThreadHandle:HANDLE
    35. Local ThreadInformation:THREAD_BASIC_INFORMATION
    36. Local Buffer:STACK_FRAME
    37. Local Context:CONTEXT
    38.     invoke RtlCreateUserThread, ProcessHandle, NULL, TRUE, 0, 0, PAGE_SIZE*2, 0, 0, addr ThreadHandle, addr ClientId
    39.     test eax,eax
    40.     jnz Exit
    41.     invoke ZwQueryInformationThread, ThreadHandle, ThreadBasicInformation, addr ThreadInformation, sizeof(THREAD_BASIC_INFORMATION), NULL
    42.     test eax,eax
    43.     mov Context.ContextFlags,CONTEXT_CONTROL
    44.     jnz Kill
    45.     invoke ZwGetContextThread, ThreadHandle, addr Context
    46.     test eax,eax
    47.     mov ecx,ExceptionHandler
    48.     mov edx,StartupRoutine
    49.     jnz Kill
    50.     mov Buffer.Seh.pLink,-1
    51.     sub Context.regEsp,sizeof(SEH_FRAME)
    52.     mov Buffer.Seh.pSeh,ecx
    53.     mov Buffer.Seh.pSafe,edx
    54.     mov ecx,StartupParameter
    55.     mov Buffer.Seh.rEbp,eax
    56.     mov Buffer.pRet,eax
    57.     mov Buffer.Data,ecx
    58.     invoke ZwWriteVirtualMemory, ProcessHandle, ThreadInformation.TebBaseAddress, addr Context.regEsp, 4, NULL  ; TEB.Tib.ExceptionList
    59.     test eax,eax
    60.     jnz Kill
    61.     invoke ZwWriteVirtualMemory, ProcessHandle, Context.regEsp, addr Buffer, sizeof(STACK_FRAME), NULL
    62.     test eax,eax
    63.     jnz Kill
    64.     or Context.regEFlags,EFLAGS_TF
    65.     invoke ZwSetContextThread, ThreadHandle, addr Context
    66.     test eax,eax
    67.     mov ecx,OutThreadHandle
    68.     mov edx,ThreadHandle
    69.     jnz Kill
    70.     cmp CreateSuspended,eax
    71.     mov dword ptr [ecx],edx
    72.     jne Exit
    73.     invoke ZwResumeThread, ThreadHandle, NULL
    74.     test eax,eax
    75.     jz Exit
    76. Kill:
    77.     push eax
    78.     invoke ZwTerminateThread, ThreadHandle, Eax
    79. ;   invoke RtlFreeUserThreadStack, ProcessHandle, ThreadHandle  ; or TEB.FreeStackOnTermination
    80.     pop eax
    81. Exit:
    82.     ret
    83. CreateHiddenThread endp
    84.  
    85. gExceptionHandler proc C
    86.     REMOTE_SEH
    87. gExceptionHandler endp
    88.  
    89. gStartupRoutine proc StartupParameter:PVOID
    90.     ...
    91. gStartupRoutine endp
    92.  
    93. Local ThreadHandle:HANDLE
    94.     invoke CreateHiddenThread, NtCurrentProcess, addr gExceptionHandler, FALSE, addr gStartupRoutine, 0, addr ThreadHandle
     
  11. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Clerk
    спасибо.