проблема с перехватом CreateProcess
От: agruzdev  
Дата: 04.08.05 17:03
Оценка:
Появилась такая проблема. При перехвате 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 и сделать перед ней задержку секунды две — то все работает...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.