Зависание Windows на стадии загрузки (Global hook)

Тема в разделе "WASM.WIN32", создана пользователем Android, 24 ноя 2006.

  1. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    Устанавливаю глобальный перехват апи. Для этого надо попасть во все процессы. Алгоритм следующий:
    1. При загрузке Windows csrss перебирает уже запущенные процессы и инжектит в них длл
    Процедура перечисления процессов
    Код (Text):
    1. BOOL EnumProcess(EP_CALLBACK EnumCallBack,LPVOID lParam)
    2. {
    3.     __mytry
    4.     PROCESSENTRY32 pe32;
    5.     HANDLE hSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    6.     if(hSnap!=INVALID_HANDLE_VALUE)
    7.     {
    8.         pe32.dwSize=sizeof pe32;
    9.         if(Process32First(hSnap,&pe32))
    10.         {
    11.             do
    12.             {
    13.                 if(!EnumCallBack(&pe32,lParam))break;
    14.             }
    15.             while(Process32Next(hSnap,&pe32));
    16.         }
    17.         CloseHandle(hSnap);
    18.         return true;
    19.     }
    20.     return false;
    21.     __myexcept(EnumProcess)
    22. }
    Запускает процедуру в целевом процессе
    Код (Text):
    1. BOOL __stdcall InjectThread(HANDLE hProc,LPVOID lpProc,DWORD dwProcSize,LPVOID lpData,DWORD dwDataSize,DWORD* lpdwExitCode)
    2. {
    3.     __mytry
    4.     BOOL result=false;
    5.    
    6.     LPVOID pCode=VirtualAllocEx(hProc,0,dwProcSize+dwDataSize,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
    7.     if(pCode)
    8.     {
    9.         DWORD dwWrite;
    10.         if(WriteProcessMemory(hProc,pCode,lpProc,dwProcSize,&dwWrite))
    11.         {
    12.             LPVOID pData=(LPVOID)( DWORD(pCode) + dwProcSize );
    13.             if(WriteProcessMemory(hProc,pData,lpData,dwDataSize,&dwWrite))
    14.             {
    15.                 HANDLE hThread=CreateRemoteThread(hProc,0,0,(LPTHREAD_START_ROUTINE)pCode,pData,0,0);
    16.                 if(hThread)
    17.                 {
    18.                     dtxt(“WaitForSingleObject begin”)
    19.                     //подвисание происходит здесь
    20.                     DWORD dwWait=WaitForSingleObject(hThread,-1);
    21.                     if(!dwWait)
    22.                     {
    23.                         dtxt("wait end")
    24.                         if(lpdwExitCode)result=GetExitCodeThread(hThread,lpdwExitCode);
    25.                         else result=true;
    26.                     }
    27.                     CloseHandle(hThread);
    28.                 }
    29.             }
    30.         }
    31.         VirtualFreeEx(hProc,pCode,0,MEM_RELEASE);
    32.     }
    33.     return result;
    34. __myexcept(InjectThread)
    35. }
    2. Длл устанавливает перехват создания нового процесса.

    Проблема в том, что иногда (1 раз из 15) Windows виснит при загрузке, при выводе сообщения “Загрузка виндовс…” или “Приветствие”, мышка работает но система не реагирует ни на что. При изучении отладки я выяснил что подвисание происходит при инжектке в очередной процесс, как правило это svchost, но иногда бывают и другие, на DWORD dwWait=WaitForSingleObject(hThread,-1); Выполняемая процедура корректная, всегда возвращает управление. Ошибок, связанных с исключениями нет, все процедуры контролируются обработчиками исключений, мне кажется что проблема в самом алгоритме или есть какие-то тонкости, которых я не знаю.

    Еще заметил, что подвисание никогда не происходило при старте ехе в уже запущенной винде, толко на стадии загрузки windows.

    Может кто-то сталкивался с подобной проблемой? Пишите любую информацию. Спасибо.
     
  2. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    Какой утилитой можно посмотреть состояние процессов, потоков в момент загрузки Windows (что-то вроде ProcessExplorer)?
     
  3. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    ты csrss заменил?
     
  4. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    Я просто в нем нахожусь.
     
  5. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    как?
     
  6. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    CreateRemoteThread(hProcessCsrss,....
     
  7. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    не понял... зачем инжектить код, который инжектит dll, в csrss?
    и приведи код lpProc