Делаем всё, как доктор в умных статьях прописал: Cоздаём процесс: CreateProcess(...., CREATE_SUSPENDED, ..) выделяем там память: VirtualAllocEx(...) Инжектим туда наш код: WriteProcessMemory(...) Меняем context.Eip на его адрес: GetThreadContext(...)/SetThreadContext(...) Запускаем процесс работать дальше: ResumeThread(...) Всё вроде хорошо. Кроме одного: у процесса есть DLL, которые грузятся вместе с ним. Не системные DLL, вроде kernel32.dll и user32.dll, а его DLL, но они такие же статические, их имена есть в exe-файле. И получается так, что их DllMain()'ы выполняются хоть и после нашего ResumeThread(...), но до того, как начнёт работать заинжекченый код. Всё, что делается в этих DllMain()'ах получается непохуканным нашим кодом. А это плохо, т.к. там много чего делается такого, что надо перехватить Что тут можно сделать?
дебаг лоадер перехватит все что угодно, ибо загрузка длл это тоже отладочное событие правда фраза несколько смутила, это какие такие?
Asterix Человек имел ввиду, что либы прописаны в импорт, а не загружаются через LoadLibrayA masharabinovich На будущее - статические, это либы статической линковки .lib
masharabinovich не "получается так" а "как и должно быть" Сначала выполняются дллмайны для всех импортных и депенденсных дллек И только потом - ентри пойнт Это надо понимать. Хочешь по-другому? пиши свою винду варианты: патчи через вритепроцессмемори тут же где инжект делаешь или воткни свой код где-нить на выходе из дллмайна кернел32 везде будут грабли на обращениях к еще не инициализированным/не загруженным дллкам
Не возражаю Прикол в том, что они выполняются еще раньше - до context.Eip (а это адрес в kernel32.dll). Ентри поинт самого exe будет уже потом, это всё происходит до попадания на entry point. вот это не понятно, "тут же" - это где ? Для меня было "тут же" - это по адресу context.Eip полученному в GetThreadContext(), но оказалось что это неправильно. Как-то можно получить EIP с которого реально старнует тред ? То есть до DllMain'ов. Вот это интереснее, попробую. Еще один вариант нашёлся в Detours - там патчицца в памяти таблица импорта запускаемого exe, и первой в список ставится detours.dll, но он предполагает наличие своей dll.
masharabinovich там один call до ентри пойнта context.Eip - это BaseProcessStartThunk все импортные DllEntry отрабатывают DLL_PROCESS_ATTACH раньше