вот автор пишет следующие ... вот я собственно и не понял, если все моудли грузятся после вызова NtResumeThread, то как я перехвачу LdrInitializeThunk, ведь createremotethread не сработает пока не запущен основной тред процесса ... если понимать выше написанное как перехват LdrInitializeThunk в вмде контроля создания новых процессов ... то тут тоже не понятки, как такое может быть ведь автор пишет ... до выполнения первых инструкций процесса ... но эта функция вызывается уже в созданом процессе и NtResumeThread уже сработала ... большая просьба помогите с этим разобратся ...
цитата: из статьи ms rem'a перехват апи часть первая: "Но этот метод работать не будет, так как в момент создания основной нити процесс еще не проинициализирован и CreateRemoteThread возвращает ошибку." т.е. основной тред надо один фиг запускать первым ... почему сказть не могу, ибо не знаю ...
el- Все происходит в ring3. Пусть жертва создает процесс вызовом KERNEL32!CreateProcessW(). Перехватываем NTDLL!NtCreateProcess(). CreateProcessW() вызывает NtCreateProcess()(Ex), и перехватчик получает управление. Отрабатываем вызов реальной функции NtCreateProcess()(Ex). После этого вызова сам процесс(объект "процесс" в ядре) готов, созданно адресное пространство процесса, на него спроецированна NTDLL.DLL, PEB тоже уже есть. Потоков в процессе еще еще нет. Также статический импорт не проинициализирован, TLS тоже не инициализированна. Куча процесса, указатель которой должен храниться в PEB->ProcessHeap не создана, значит GetProcessHeap() вызывать нельзя. Зная, что после создания объекта процесса будет создан поток вызывом NtCreateThread(), что повлечет за собой вызов LdrpInitialize (любой поток при создании начинает выполнятся именно с этой функции посредством User-APC (NtCreateThread() -> (sysinter/int2e) -> KeInitThread() -> PspUserThreadStartup() -> (following calls will be in new process) -> LdrInitializeThunk() -> LdrInitialize() -> (if this not initialized process) -> LdrInitializeProcess), а дальше учитывая что это первый поток в непроинициализированном процессе, вызов LdrInitializeProcess(), то можно перехватывать LdrInitialize() либо LdrInitializeThunk(), отрабатывать ее вызов и к этому моменту ни одна инструкция нового процесса с точки входа не выполнена, но мы уже получили управление. Правильно, создавать новые потоки с помощью KERNEL32!CreateRemoteThread() мы не сможем, но это и не нужно, достаточно просто узнать адрес LdrInitialize(), которая находится в NTDLL.DLL, и записать на ее место переход на наш обработчик, который также до этого надо записать в АП нового процесса. Ведь писать мы может без проблем, и сам код CreateProcessW() это делает с легкостью.