Если создавать процесс с флагом CREATE_SUSPENDED, то успевают загрузиться и выполниться длл которые статически импортирует .exe . Что делать?
GoldFinch >Если создавать процесс с флагом CREATE_SUSPENDED, то успевают загрузиться и выполниться длл которые статически импортирует .exe. Да ну? Повторимся: После возврата из CreateProcess(CREATE_SUSPENDED) первичный поток новосозданного процесса остановлен – и не исполнил ни одной инструкции в юзермоде. Т.е. те модули, которые загружены в него в этот момент (из реально исполняемых это только нативная ntdll и главный модуль процесса) – загружены ядром, и ты с этим ничего не поделаешь.
я ошибся =\ я запускал .ехе с флагом CREATE_SUSPENDED, делал CreateRemoteThread, у меня при этом загружались длл в импортах .ехе, а только потом запускался поток я это увидел, и сделал вывод что если запускать процесс с флагом CREATE_SUSPENDED, то длл всеравно загружаются
если заменить CreateRemoteThread на QueueUserAPC, наблюдается тот же эффект похоже что SetThreadContext - наше всё.
GoldFinch Остановка процесса - это останов всех его потоков, ядро енумит и суспендит каждый. Стартуп-апк ядерная, из юзермода не измените. Можно флажки изменить, а далее обработать останов локально или удалённо как дебуггер.
Код (Text): SEH_FRAME struct pLink PVOID ? pSeh PVOID ? pSafe PVOID ? rEbp PVOID ? SEH_FRAME ends PSEH_FRAME typedef ptr SEH_FRAME STACK_FRAME struct Seh SEH_FRAME <> pRet PVOID ? Data PVOID ? STACK_FRAME ends PSTACK_FRAME typedef ptr STACK_FRAME REMOTE_SEH macro assume fs:nothing mov esp,dword ptr [esp + 2*4] ; ExceptionList. mov fs:[TEB.Tib.ExceptionList],NULL push STACK_FRAME.Seh.pSafe[esp] xor ebp,ebp ret sizeof(SEH_FRAME) endm ; typedef VOID (*PSTARTUP_ROUTINE)( ; IN PVOID StartupParameter ; ); ; + ; Создаёт поток без вызова LdrInitializeThunk(). ; CreateHiddenThread proc ProcessHandle:HANDLE, ExceptionHandler:PREMOTE_SEH, CreateSuspended:BOOLEAN, StartupRoutine:PVOID, StartupParameter:PVOID, OutThreadHandle:PHANDLE Local ClientId:CLIENT_ID Local ThreadHandle:HANDLE Local ThreadInformation:THREAD_BASIC_INFORMATION Local Buffer:STACK_FRAME Local Context:CONTEXT invoke RtlCreateUserThread, ProcessHandle, NULL, TRUE, 0, 0, PAGE_SIZE*2, 0, 0, addr ThreadHandle, addr ClientId test eax,eax jnz Exit invoke ZwQueryInformationThread, ThreadHandle, ThreadBasicInformation, addr ThreadInformation, sizeof(THREAD_BASIC_INFORMATION), NULL test eax,eax mov Context.ContextFlags,CONTEXT_CONTROL jnz Kill invoke ZwGetContextThread, ThreadHandle, addr Context test eax,eax mov ecx,ExceptionHandler mov edx,StartupRoutine jnz Kill mov Buffer.Seh.pLink,-1 sub Context.regEsp,sizeof(SEH_FRAME) mov Buffer.Seh.pSeh,ecx mov Buffer.Seh.pSafe,edx mov ecx,StartupParameter mov Buffer.Seh.rEbp,eax mov Buffer.pRet,eax mov Buffer.Data,ecx invoke ZwWriteVirtualMemory, ProcessHandle, ThreadInformation.TebBaseAddress, addr Context.regEsp, 4, NULL ; TEB.Tib.ExceptionList test eax,eax jnz Kill invoke ZwWriteVirtualMemory, ProcessHandle, Context.regEsp, addr Buffer, sizeof(STACK_FRAME), NULL test eax,eax jnz Kill or Context.regEFlags,EFLAGS_TF invoke ZwSetContextThread, ThreadHandle, addr Context test eax,eax mov ecx,OutThreadHandle mov edx,ThreadHandle jnz Kill cmp CreateSuspended,eax mov dword ptr [ecx],edx jne Exit invoke ZwResumeThread, ThreadHandle, NULL test eax,eax jz Exit Kill: push eax invoke ZwTerminateThread, ThreadHandle, Eax ; invoke RtlFreeUserThreadStack, ProcessHandle, ThreadHandle ; or TEB.FreeStackOnTermination pop eax Exit: ret CreateHiddenThread endp gExceptionHandler proc C REMOTE_SEH gExceptionHandler endp gStartupRoutine proc StartupParameter:PVOID ... gStartupRoutine endp Local ThreadHandle:HANDLE invoke CreateHiddenThread, NtCurrentProcess, addr gExceptionHandler, FALSE, addr gStartupRoutine, 0, addr ThreadHandle