Як викликати BSOD

Всім відомо, що синій екран смерті (BSOD, Blue Screen Of Death) з'являється через помилки в ядрі. Але чи це так? Чи можна викликати BSOD з режиму користувача?

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

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

Є ще один спосіб, який, щоправда, не відрізняється універсальністю від запропонованого вище, бо немає можливості передавати свої параметри та потрібен привілей налагодження. При завантаженні системи SMSS запускає CSRSS і WINLOGON, у разі їх успішного запуску SMSS чекає на обох за допомогою ZwWaitForMultipleObjects, і якщо він їх чекає (тобто якщо один з цих двох процесів завершується) — генерує BSOD. Ідея способу – «допомогти» SMSS дочекатися будь-якого з процесів. Вибравши для прикладу WINLOGON, беремо привілей налагодження, після чого відкриваємо процес WINLOGON з правом доступу на завершення процесу та вбиваємо його з кодом завершення 9. Після цього хендл на WINLOGON можна навіть не закривати :). Повідомлялося, що це працює тільки в NT4, але це не так, що досить легко перевірити.