Как вызвать BSOD

Как вызвать синий экран смерти из пользовательского режима




Всем известно, что синий экран смерти (BSOD, Blue Screen Of Death) появляется из-за ошибок в ядре. Но так ли это? Можно ли вызвать BSOD из пользовательского режима?

При всем многообразии причин, которые приводят к BSOD, для его отображения (и дополнительных действий, описание которых здесь опустим) разработан специальный механизм, который необходимо вызвать. Банальность ответа о причине BSOD заключается в том, что BSOD «наступает» всякий раз, как только вызывается функция ядра KeBugCheckEx, и, независимо от источника и кода ошибки, именно эта функция и вызывается драйверами режима ядра. Процессы из пользовательского режима не могут напрямую её вызывать, однако, отображение BSOD всё-таки возможно по желанию пользовательского процесса.

Хитрость заключается в использовании функции ZwRaiseHardError с параметром OptionShutdownSystem. Для успешного вызова процесс должен иметь привилегию завершения работы (SE_SHUTDOWN_PRIVILEGE). Пример кода:

 HARDERROR_RESPONSE hr;
 UNICODE_STRING us = {24, 26, L"GENERIC BSOD"};
 ULONG a[3] = { 0, 0, (ULONG)&us };
 ZwRaiseHardError (Status, 3, 4, &a, OptionShutdownSystem, &hr);

или ещё короче:

 HARDERROR_RESPONSE hr;
 ZwRaiseHardError (Status, 0, 0, NULL, OptionShutdownSystem, &hr);

Есть ещё один способ, который, правда, не отличается универсальностью от предложенного выше, ибо нет возможности передавать свои параметры и требуется привилегия отладки. При загрузке системы SMSS запускает CSRSS и WINLOGON, в случае их успешного запуска SMSS ждёт их обоих с помощью ZwWaitForMultipleObjects, и если он их дожидается (то есть, если один из этих двух процессов завершается) — генерирует BSOD. Идея способа — «помочь» SMSS дождаться любого из процессов. Выбрав для примера WINLOGON, берём привилегию отладки, после чего открываем процесс WINLOGON с правом доступа на завершение процесса и убиваем его с кодом завершения 9. После этого хэндл на WINLOGON можно даже не закрывать :). Сообщалось, что это работает только в NT4, однако это не так, что довольно легко проверить.



Автор: Сергей Васкецов
Дата: 19.11.2002


При копировании материалов хорошим тоном будет указание авторства и ссылка на сайт.