говоришь |= CREATE_SUSPENDED вызываешь настоящий CreateProcess, получаешь Handle процесса с помощью последовательности ReadProcessMemory в основном модуле по PE-хедеру находишь EntryPoint, запоминаешь ее копируешь ( WriteProcessMemory ) код такой же как для RemoteThread-а пишешь вместо оригинального EntryPoint адрес этого кода говоришь ResumeThread - при этом управление передается на этот твой код в конце его делаешь jump на сохраненный EntryPoint короче - все как ты делал но без CreateRemoteThread лично я так делал и все работало
Думаю обсуждение уже закрыто, судя по дате, но хочу добавить кое-что для тех, кто будет писать код основываясь на приведенных здесь. Дело в том, что была упушена одна маленькая, но немаловажная деталь. Суть в изменении флагов: В конце приведенных здесь процедур безусловно вызывается ResumeThread, совершенно не учитывая тот факт, что вызывающий процесс (не знающий о перехвате) мог создавать процесс с УЖЕ УСТАНОВЛЕННЫМ флагом CREATE_SUSPENDED. Для него (процесса) будет неприятной неожиданностью (которая возможно приведет к нарушению работы), что "функция kernel32" полностью проигнорировала его запрос и создала запущеный процесс. Помимо всего выше сказанного, надо внести следующие изменения в приведенный код: Код (Text): DWORD SaveFlags = dwCreationFlags; //сохраняем оригинальное значение флагов dwCreationFlags|=CREATE_SUSPENDED; ... //здесь выполняем все прочие действия if (! (SaveFlags && CREATE_SUSPENDED) ) //Запускаем поток только если об этом "просили" ResumeThread(lpProcessInformation->hThread);
Enils С этим ответом ты действительно припозднился Все уже было разжевано вдоль и поперек в этом же топике на сорцах.ру: http://forum.sources.ru/index.php?showtopic=177691&st=15
Посмотри здесь http://www.defendion.com/EliCZ/bugs/WinBugs.htm Remote thread into not-yet-initialized process causes various failures in that process