Здраствуйте! Как Windows определяет критический процесс или нет? Можно-ли запустить свой процесс как критический? Или какнибудь подругому запретить завершение работы моего процесса из Диспетчера задач?
>> Как Windows определяет критический процесс или нет? имхо, никак не определяет, просто какие-то треды ждут на хендлах csrss-а, winlogon-a, smss-а, итд. если процесс по какой-либо причине умер - бсод >> Или какнибудь подругому запретить завершение работы моего процесса из Диспетчера задач? хукать NtOpenProcess, NtTerminateProcess заметил ещё интиресную фишку: если сделать инжект в винлогон напрмер, то средствами диспетчера задач подобный процесс так же как и обычный винлогон нельзя будет завершить (т.е., насколько я понял, тупо сравнивается путь к исполняемому файлу)
Диспетчер задач не позволяет завершать некоторые процессы просто сравнением имен с "winlogon", "csrss", "lsass", etc Другое дело, как винда определяет, что упал критический процесс и выводит БСоД CRITICAL_OBJECT_TERMINATION: тут почти тоже самое. Если происходит вызов ZwTerminateProcess, то происходит сравнение процессов. Если завершается критический процесс, то сразу генерится KeBugCheckEx( CRITICAL_OBJECT_TERMINATION, ... ) ZwTerminateProcess может быть вызван из обработчика исключения (например, если произошло необработанное исключение в системном процессе, я такое уже видел - сначала МесагБокс что прога выполнила недопустимую операцию, потом сразу же бсод), либо вручную, например, из Process Explorer (попробуй, например, убить csrss.exe - получишь бсод CRITICAL_OBJECT_TERMINATION). Третий момент - завершение процесса менеджера сессий (smss) в процессе загрузки тоже влечет синий экран SESSIONn_INITIALIZATION_FAILED, в коде стартапа ядра такие строчки (цитирую): Code (Text): // // Set up process parameters for the Session Manager Subsystem // .... RtlAppendUnicodeToString( &ProcessParameters->ImagePathName, L"\\smss.exe" ); .... ProcessParameters->CommandLine = ProcessParameters->ImagePathName; SessionManager = ProcessParameters->ImagePathName; Status = RtlCreateUserProcess( &SessionManager, OBJ_CASE_INSENSITIVE, RtlDeNormalizeProcessParams( ProcessParameters ), NULL, NULL, NULL, FALSE, NULL, NULL, &ProcessInformation ); if ( !NT_SUCCESS(Status) ) { KeBugCheckEx(SESSION3_INITIALIZATION_FAILED,Status,0,0,0); } Status = ZwResumeThread(ProcessInformation.Thread,NULL); .. // // Wait five seconds for the session manager to get started or // terminate. If the wait times out, then the session manager // is assumed to be healthy and the zero page thread is called. // OldTime.QuadPart = Int32x32To64(5, -(10 * 1000 * 1000)); Status = ZwWaitForSingleObject( ProcessInformation.Process, FALSE, &OldTime ); if (Status == STATUS_SUCCESS) { KeBugCheck(SESSION5_INITIALIZATION_FAILED); } else { ... Как видно, винда ждет 5 секунд освобождения хендла процесса smss и, если он освободился, херачит всю системУ)
А можно как-то добавить имя моего процесса в список критических? Можно ли отловить событие когда из Диспетчера пытаются завершить мой процесс и не дать это сделать?
Chikanok Универсальный метод - перехват ZwTerminateProcess. Винда делает так же практически, только она сразу в бсод падает, а ты возвращай STATUS_ACCESS_DENIED. Или пали открытие хендла процесса еще на стадии ZwOpenProcess с флагом PROCESS_TERMINATE
А че подробнее то. Берешь и перехватываешь. Лучше менять SSDT, но можно и сплайсингом. Примеры кода - в нете полно
Great Ну мне хотяб по русски. А вот так покатит: Поймать хэндл библиотеки(кстати а в какой dll эта функция). Найти адресс Процедуры и заменить на свой, сохранив старый для востановления. Только здесь вопрос А как поймать хэндл библиотеки? У своего приложения я знаю как, а у чужова? И дадут ли мне писать в память этого приложения?
эммм, я вообще-то про ядро говорил=\ ну если хочется, можно и в ntdll хучить для конкретных процессов. тока надежнее хука в ядре ниче нету )
Да. И еще: smss.exe при определении закрытия winlogon тоже валит систему. Что же в его коде это делает?