Критические процессы

Тема в разделе "WASM.BEGINNERS", создана пользователем Chikanok, 25 апр 2007.

  1. Chikanok

    Chikanok New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2007
    Сообщения:
    57
    Здраствуйте!
    Как Windows определяет критический процесс или нет?
    Можно-ли запустить свой процесс как критический?
    Или какнибудь подругому запретить завершение работы моего процесса из Диспетчера задач?
     
  2. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    >> Как Windows определяет критический процесс или нет?
    имхо, никак не определяет, просто какие-то треды ждут на хендлах csrss-а, winlogon-a, smss-а, итд. если процесс по какой-либо причине умер - бсод

    >> Или какнибудь подругому запретить завершение работы моего процесса из Диспетчера задач?
    хукать NtOpenProcess, NtTerminateProcess

    заметил ещё интиресную фишку: если сделать инжект в винлогон напрмер, то средствами диспетчера задач подобный процесс так же как и обычный винлогон нельзя будет завершить (т.е., насколько я понял, тупо сравнивается путь к исполняемому файлу)
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Диспетчер задач не позволяет завершать некоторые процессы просто сравнением имен с "winlogon", "csrss", "lsass", etc

    Другое дело, как винда определяет, что упал критический процесс и выводит БСоД CRITICAL_OBJECT_TERMINATION:
    тут почти тоже самое. Если происходит вызов ZwTerminateProcess, то происходит сравнение процессов. Если завершается критический процесс, то сразу генерится KeBugCheckEx( CRITICAL_OBJECT_TERMINATION, ... )
    ZwTerminateProcess может быть вызван из обработчика исключения (например, если произошло необработанное исключение в системном процессе, я такое уже видел - сначала МесагБокс что прога выполнила недопустимую операцию, потом сразу же бсод), либо вручную, например, из Process Explorer (попробуй, например, убить csrss.exe - получишь бсод CRITICAL_OBJECT_TERMINATION).

    Третий момент - завершение процесса менеджера сессий (smss) в процессе загрузки тоже влечет синий экран SESSIONn_INITIALIZATION_FAILED, в коде стартапа ядра такие строчки (цитирую):
    Код (Text):
    1.     //
    2.     // Set up process parameters for the Session Manager Subsystem
    3.     //
    4. ....
    5.     RtlAppendUnicodeToString( &ProcessParameters->ImagePathName,
    6.                               L"\\smss.exe"
    7.                             );
    8. ....
    9.     ProcessParameters->CommandLine = ProcessParameters->ImagePathName;
    10.     SessionManager = ProcessParameters->ImagePathName;
    11.     Status = RtlCreateUserProcess(
    12.                 &SessionManager,
    13.                 OBJ_CASE_INSENSITIVE,
    14.                 RtlDeNormalizeProcessParams( ProcessParameters ),
    15.                 NULL,
    16.                 NULL,
    17.                 NULL,
    18.                 FALSE,
    19.                 NULL,
    20.                 NULL,
    21.                 &ProcessInformation
    22.                 );
    23.     if ( !NT_SUCCESS(Status) ) {
    24.         KeBugCheckEx(SESSION3_INITIALIZATION_FAILED,Status,0,0,0);
    25.     }
    26.  
    27.     Status = ZwResumeThread(ProcessInformation.Thread,NULL);
    28. ..
    29.     //
    30.     // Wait five seconds for the session manager to get started or
    31.     // terminate. If the wait times out, then the session manager
    32.     // is assumed to be healthy and the zero page thread is called.
    33.     //
    34.  
    35.     OldTime.QuadPart = Int32x32To64(5, -(10 * 1000 * 1000));
    36.     Status = ZwWaitForSingleObject(
    37.                 ProcessInformation.Process,
    38.                 FALSE,
    39.                 &OldTime
    40.                 );
    41.  
    42.     if (Status == STATUS_SUCCESS) {
    43.         KeBugCheck(SESSION5_INITIALIZATION_FAILED);
    44.     } else {
    45. ...
    Как видно, винда ждет 5 секунд освобождения хендла процесса smss и, если он освободился, херачит всю системУ)
     
  4. Chikanok

    Chikanok New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2007
    Сообщения:
    57
    А можно как-то добавить имя моего процесса в список критических?
    Можно ли отловить событие когда из Диспетчера пытаются завершить мой процесс и не дать это сделать?
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Chikanok
    Универсальный метод - перехват ZwTerminateProcess. Винда делает так же практически, только она сразу в бсод падает, а ты возвращай STATUS_ACCESS_DENIED.
    Или пали открытие хендла процесса еще на стадии ZwOpenProcess с флагом PROCESS_TERMINATE
     
  6. Chikanok

    Chikanok New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2007
    Сообщения:
    57
    Great
    Можно поподробней! Лучше с кодом.
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    А че подробнее то. Берешь и перехватываешь. Лучше менять SSDT, но можно и сплайсингом. Примеры кода - в нете полно
     
  8. Chikanok

    Chikanok New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2007
    Сообщения:
    57
    Great
    Ну мне хотяб по русски.


    А вот так покатит:
    Поймать хэндл библиотеки(кстати а в какой dll эта функция).
    Найти адресс Процедуры и заменить на свой, сохранив старый для востановления.
    Только здесь вопрос А как поймать хэндл библиотеки? У своего приложения я знаю как, а у чужова? И дадут ли мне писать в память этого приложения?
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    эммм, я вообще-то про ядро говорил=\
    ну если хочется, можно и в ntdll хучить для конкретных процессов. тока надежнее хука в ядре ниче нету )
     
  10. Winlogon

    Winlogon New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    1
    Да. И еще: smss.exe при определении закрытия winlogon тоже валит систему. Что же в его коде это делает?