Опять к перехвату запуска процессов

Тема в разделе "WASM.WIN32", создана пользователем WaterGhost, 5 апр 2010.

  1. WaterGhost

    WaterGhost New Member

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    130
    rin3. ring0 не предлагать, слишком пустяковая задача для того чтобы лезть в ядро. Необходимо перехватить запуск процесса определнным процессом. Для этого делаю DLL'ку инжектю её в процесс от которого надо отслеживать запуск процесса. DLL'кой перехватываю ZwCreateThreadEx(для Vist'ы, и 7ёрки), ZwCreateThread(для WinXP) и ZwResumeThread. Этот метод был раньше распространен в интернете. Когда вызыватся ZwCreateThread проверяю совпадает ли PID процесса потока и GetCurrentProcessPid() если нет то устанавливаю флаг NewProcess = TRUE; Далее в ZwResumeThread
    Код (Text):
    1.         if(NewProcess)
    2.     {
    3.         NewProcess = FALSE;
    4.         OutputDebugString(L"NewProcess :)");
    5.         ZwQueryInformationThread(ThreadHandle, ThreadBasicInformation, &ThreadInfo, sizeof(THREAD_BASIC_INFORMATION), NULL);
    6.                 if(ThreadInfo.ClientID.UniqueProcess != CurrProcPid)
    7.         {
    8.                      // Новый процесс создан
    9.         }
    10.     }
    Так вот в Windows 7 всегда ThreadInfo.ClientID.UniqueProcess == CurrProcPid. Почему? Ведь в WinXP все работало =\ Или я что-то неправильно делаю?

    П.С. В ZwCreateThreadEx нет параметра (PCLIENT_ID ClientId) я получаю его при помощи той же ZwQueryInformationThread.
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    WaterGhost
    CID определяет поток и процесс, в контексте которого этот поток исполняется. Это не идентификаторы родителей.
    CID не может не возвращаться при создании потока, в сервисе NtCreateThreadEx на сколько помню ссылка на на неё передаётся последним параметром.
    Так вобшем способ норм, по сути. Нужно только изменить способ захвата, таким образом, дабы код не изменялся в модулях.
     
  3. WaterGhost

    WaterGhost New Member

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    130
    Спасибо большое за ответ. Получается что последний параметр NtCreateThreadEx и есть PCLIENT_ID ClientId? :)
     
  4. WaterGhost

    WaterGhost New Member

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    130
    NtCreateThreadEx возвращает (ClientId->UniqueProcess == 36) всегда =\ Может Dr.Web подменяет что-то?
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    WaterGhost
    Наверно вы в одном и томже процессе поток создаёте, мб в текушем..
     
  6. WaterGhost

    WaterGhost New Member

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    130
    Я ничего не создаю. Я перехватываю запуск процесса. Я инжектю в Explorer мою DLL а из него перехватываю запуск процесса
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    WaterGhost
    Потоки создаются не только при создании процесса, понятно что проводник в себе потоки создаёт постоянно. Хотябы разобрались в механизмах, а то перехватываете функи не понимая зачем и какие.
     
  8. WaterGhost

    WaterGhost New Member

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    130
    Ну то что NtCreateThreadEx возвращает (ClientId->UniqueProcess == 36) не проблема. Флаг NewProcess всеравно приравнивается к TRUE, т.к. getCurrentProcessId() != 36. Дело в том что в NewZwResumeThread при получении информации о потоке
    Код (Text):
    1. ZwQueryInformationThread(ThreadHandle, ThreadBasicInformation, &ThreadInfo, sizeof(THREAD_BASIC_INFORMATION), NULL);
    ThreadInfo.ClientID.UniqueProcess всегда равен GetCurrentProcessId(). Получается что созданный поток принадлежит моему приложению в котором находится моя DLL (eplorer.exe) =\
     
  9. WaterGhost

    WaterGhost New Member

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    130
    Откуда вы знаете что я не понимаю что перехватываю и зачем? Вы просто невнимательно прочитали и не достаточно подумали о том что я имею ввиду, а уже отсылаете в раздел для новичков :)
    Потоки создаются и резюмятся и в самом процессе, это и дураку ясно. Для этого и сделан перехват ZwCreateThreadEx где я проверяю не равен ли PID процесса создаваемого потка PID'у explorer'а и выставляю NewProcess = TRUE если это не так. Далее в ZwResumeThread я проверяюустановлен ли флаг в NewProcess в TRUE если да, то получаю инфу о потоке ZwQueryInformationThread(вызов завершается успешно STATUS_SUCCESS, т.е. привилегий хватает) сравниваю равен ли опять таки PID процесса потока PID'у explorer'а. Если нет то создан новый процесс и все отлично. Но у меня полученный PID всегда равен PID'у explorer'а. Что не так? =\
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    WaterGhost
    Давайте посмотрим. Брейк на ZwCreateThreadEx и покажите бактрейс.
     
  11. WaterGhost

    WaterGhost New Member

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    130
    А можно без брейков, как-нить по другому? Я этим пока не владею :)
     
  12. Hellspawn

    Hellspawn New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2006
    Сообщения:
    310
    Адрес:
    Москва
    семёрка и виста для создания процесса юзают ntdll.ZwCreateUserProcess, а первичный поток создаётся в ядре :)
     
  13. WaterGhost

    WaterGhost New Member

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    130
    Боже 0_о Огромное спасибо ) Пошел пробовать )
     
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Собственно о чём и речь была, не те сервисы дёргаются.
     
  15. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ахах)
     
  16. mrcrown

    mrcrown Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    227
    Да, меня тож улыбнуло. :)
     
  17. megaaa

    megaaa New Member

    Публикаций:
    0
    Регистрация:
    29 май 2009
    Сообщения:
    51
    Достаточно перехватывать ZwResumeThread, у меня везде пашет.

    Код (Text):
    1. DWORD GetPidByThread( HANDLE hThread )
    2. {
    3.     THREAD_BASIC_INFORMATION Threads;
    4.     DWORD dwReturnLen;
    5.  
    6.     if ( pZwQueryInformationThread( hThread, ThreadBasicInformation, &Threads, sizeof( THREAD_BASIC_INFORMATION ), &dwReturnLen ) == STATUS_SUCCESS )
    7.     {
    8.         return (DWORD)Threads.ClientId.UniqueProcess;
    9.     }
    10.  
    11.     return -1;
    12. }
    13.  
    14. NTSTATUS WINAPI ZwResumeThreadHook( HANDLE hThread, PULONG PreviousSuspendCount )
    15. {
    16.     DWORD dwPid = GetPidByThread( hThread );   
    17.  
    18.     if ( dwPid != -1 && dwPid != (DWORD)pGetCurrentProcessId() )
    19.     {
    20.         OBJECT_ATTRIBUTES ObjectAttributes = { sizeof( ObjectAttributes ) } ;
    21.         CLIENT_ID ClientID;
    22.  
    23.         ClientID.UniqueProcess = (HANDLE)dwPid;
    24.         ClientID.UniqueThread  = 0;
    25.  
    26.         HANDLE hProcess;
    27.        
    28.         if ( pZwOpenProcess( &hProcess, PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE, &ObjectAttributes, &ClientID ) == STATUS_SUCCESS )
    29.         {
    30.             DWORD dwAddr = InjectCode( hProcess, RootkitThread );
    31.  
    32.             if ( dwAddr != -1 )
    33.             {
    34.                 pZwQueueApcThread( hThread, (LPTHREAD_START_ROUTINE)dwAddr, NULL, NULL, NULL );
    35.             }
    36.  
    37.             pZwClose( hProcess );
    38.         }      
    39.     }
    40.  
    41.     return ZwResumeThreadReal( hThread, PreviousSuspendCount );
    42. }
     
  18. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    megaaa
    Как (без изменения сеций кода) перехватываете интересно ?
     
  19. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Для перехвата создания процесса я хукаю CreateProcessInternalW
    Работает и на XP и на Win7
     
  20. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    Partner, да. в общем случае это самый нормальный вариант.