Подскажите как правильно ижектить exe в новый процесс? После создания процесса через ZwCreateUserProcess, делаю ZwUnmapViewOfSection основного модуля того процесса и инжекчу свой exe. Изменяю ImageBase в PEB удаленного процесса. Потом при создании основного потока корректирую начало его выполнения в соответствии с инжекченным exe. Проблема в том что если делать ZwUnmapViewOfSection то после ResumeThread процесс падает, а если не делать ZwUnmapViewOfSection то все работает как часы.. Подскажите что и где не так...? Скорее всего надо изменить так же ImageBase и SizeOfImage не только в PEB но и еще где нибудь?
Олька не аттачится к процесс сразу после ZwCreateUserProcess только после выполнения освного потока.. а как раз там и падает... В PEB->Ldr все списки пустые сразу после выполнения ZwCreateUserProcess, там менять нечего..
используйте windbg в качестве постмортем отладчика и посмотрите конкретно где падает. Списки пустые тк вы скорее всего передаете управление не на лоадер, а на свою точку входа. Изза этого процесс еще не проинициализирован.
Это приколы загрузчика в Win7,Vista. Корректируй ImageBase, он должен совпадать с адресом, куда ты смапил секцию во втором процессе
Это естественно так, только я имею ввиду инжект exe а не dll, и допустим если этот exe без релоков. Тогда, чтобы правильно его спроецировать, надо выделить память по адресу указанному в ImageBase. И еще одно но, если ImageBase инжектируемого exe перекрывается модулем загруженным в удаленном процессе. Тогда, чтобы выделить память для инжектируемого exe надо сначала освободить память уже загруженного, основного exe.
oleg_nefedov Это само собой рузумеется. Ничего не мешает добавить релоки, разумеется если модуль ваш или написан для вас, а не криптор, пакер какой или есчо что работающее с чужими бинарями. Используйте надстройку для фильтрации исключений, это может быть длл, VEH и пр., что подрубит отладчик.
Бинарь "мой", просто перекомпилировать нет возможности... иходников нет... Подсунуть dll которая остановит дебаггер? да, вроде хорошая идея... Начинаю подозревать что адрес и размеры основного модуля процесса записаны где то в системе, и из третьего кольца туда доступа конечно нет, и сделать с этим ничего нельзя...
Проверил где падает... На первой же инструкции RtlUserThreadStart, это mov dword prt [esp+4],eax эксепшн C0000005, как будто в стек писать не может, а в стек вообще нормальный, память нормальная, ничего странного.. Если UnmapViewOfSection не делать, то все нормально...
Значит первой инструкции нет - нтдлл анмаплена. Предположу что тред вылетает изза исчерпания стека, так как будут рекурсивные вызовы диспетчера фолтов.
Получается что вместе с ZwUnmapViewOfSection система освободила все зависимости модуля..? Так как же все таки быть в этом случае?