Появилась такая проблема. При перехвате CreateProcessW методом сплайсинга пытаюсь проводить загрузку DLL в только что созданный процесс: ... // останавливаем все потоки процесса, кроме текущего Stop_Resume_Other_Threads(TRUE); // восстанавливаем оригинальные заголовок перехватываемой ф-и DWORD Bytes_Transfered; WriteProcessMemory(hCurr_Process,Orig_CreateProcessW,&Orig_CreateProcessW_Header, sizeof(Orig_CreateProcessW_Header),&Bytes_Transfered); FlushInstructionCache(hCurr_Process,Orig_CreateProcessW,sizeof(Orig_C reateProcessW_Header)); // создаем процесс с изначально suspended потоком DWORD New_CreationFlags=dwCreationFlags | CREATE_SUSPENDED; BOOL Orig_Result=Orig_CreateProcessW( lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, New_CreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation ); // загружаем в новый процесс нашу DLL Implant_DLL(lpProcessInformation->hProcess,"hook.dll"); if (!(dwCreationFlags & CREATE_SUSPENDED)) ResumeThread(lpProcessInformation->hThread); // восстанавливаем код-перехватчик WriteProcessMemory(hCurr_Process,Orig_CreateProcessW,&NearJump_Sim, sizeof(NearJump_Sim),&Bytes_Transfered); FlushInstructionCache(hCurr_Process,Orig_CreateProcessW,sizeof(NearJu mp_Sim)); Stop_Resume_Other_Threads(FALSE); ... "имплантация" DLL выполняется с помощью CreateRemoteThread(...). Проблема в том, что некоторые приложения (у меня TotalCommander и MS Outlook) нормально не запускаются, хотя DLL подгружается, например Outlook мигает сплэш-скрином и выдает ошибку (access violation), TotalCommander не отображает файлы и иконки на кнопках. Если убрать WaitForSingleObject(hRemote_Thread,INFINITE) на созданный удаленный поток, проявление становится неустойчивым (то запускаются, то не запускаются). А если еще перенести Implant_DLL в конец обработчика CreateProcess и сделать перед ней задержку секунды две - то все работает... Второй день уже бьюсь...
что-то у тебя все в кучу. и по приведенному листингу не понятно, что и как. отвечу не по существу, а по тем мыслям, что бродят у меня в голове. 1] остановка/запуск потоков на некоторых приложениях может аукнуться; 2] FlushInstructionCache на фиг не нужно, т.к. на одноЦПшных машинах достаточно выполнить jump на модифицированный код или любую инструкцию сериализации (например, CPUID), а на многоЦПшных - просто любую инструкцию сериализации. подробнее об этом Handling Self- and Cross-Modifying Code в System Programming Guide от Intel. 3] модифицируя CreateProcessW ты уже оказываешься в адресном пространстве чужого процесса, поэтому LoadLibrary вполне достаточно, после чего ты просто отдаешь управление оригинальной CreateProcessW и все! порождать новый процесс нет никакой необходимости! 4] все равно получится глючно. ну остановил ты потоки, ну и какого хрена ты думаешь, что ни один из них не начал выполнять пролог CreateProcessW?! только он выполнил PUSH EBP, как ты вставил туда jmp label, после чего при возобновлении выполнения поток получит вместо MOV EBP,ESP "кусочек" jmp label, а это ласты! 5] по нормальному надо делать через App_Ini_Dlls. это хоть и заметно, зато на 100% надежно, т.к. твоя dll-перехватчик стартует тогда, когда никаких других потоков еще нет. 6] еще можно делать через SetWindowsHookEx, хотя это тоже слишком заметно