Запускаю процесс с CREATE_SUSPENDED, выделяю там память, пишу туда свой код. Дальше с GetThreadContext и SetThreadContext ставлю Eip на этот код. ResumeThread.. и сначала выполняется TLS, который был в том Exe. Как сделать, чтобы TLS стартовал вторым после моего кода?
Стартап апк нельзя изменить, Eip из контекста будет сохранено в APC-контексте и после отработки загрузчика этот контекст будет загружен в процессор.
Я помню извращаясь на перехвате РезюмеТред(или даже где то раньше, подзабыл чота) родительского процесса изменял первый адрес в массиве тлс дочернего процесса направляя его на свой код, внедренный перед этим же в его АП, в конце внедренного кода управление передавалось на оригинальный адрес 1го тлс. Можете так попробовать- все работало на отлишненько
Я бы сделал так: Код (Text): SecurityCookieInitialized = FALSE ; Lock cookie. OldCount = SecurityCookieInitCount SecurityCookieInitCount + 1 ResumeThread() Do NtYieldExecution() ; Or NtDelayExecution(30ms) Loop (SecurityCookieInitCount = OldCount + 1) SuspendThread() SecurityCookieInitCount - 1 SecurityCookieInitialized = TRUE ; Unlock cookie. STACK_FRAME.Ip[CONTEXT.rEbp] - 5 State{} = CONTEXT CONTEXT.rEip = @Payload ResumeThread() Payload(State{}): Dispatch() NtContinue(State{}) Иначе если использовать SEH(TF -> 1 и хэндлим брейк), то придётся применять некоторые способы для обхода /SAFESEH. Также можно подключить отладчик, обработать всё и отключить его.
выходит что нужно удалённо читать\писать в стек? Помимо удаленного мониторинга куков.. Код (Text): STACK_FRAME.Ip[CONTEXT.rEbp] - 5 или может я не правильно понял затеи)
ASMatic Это если нужно контекст получить. Если не нужно, то стек не нужно юзать. С таким же успехом можно залочить загрузочную кс(LdrpLoaderLock), все треды вновь созданные будут ждать на евенте. При его сигнализации они сразу все выйдут из ожидания.