Проблема с перехватом CreateProcess

Тема в разделе "WASM.WIN32", создана пользователем agruzdev, 4 авг 2005.

  1. agruzdev

    agruzdev New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2005
    Сообщения:
    1
    Появилась такая проблема. При перехвате 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 и сделать перед ней задержку секунды две - то все работает... Второй день уже бьюсь...
     
  2. Bill_Prisoner

    Bill_Prisoner New Member

    Публикаций:
    0
    Регистрация:
    4 май 2005
    Сообщения:
    238
    Ну как получилось?
     
  3. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    что-то у тебя все в кучу. и по приведенному листингу не понятно, что и как.
    отвечу не по существу, а по тем мыслям, что бродят у меня в голове.
    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, хотя это тоже слишком заметно