Вызвать синий экран смерти с помощью управляемого кода

Просто любопытно: можно ли вызвать синий экран смерти Windows с помощью управляемого кода .net под Windows XP/Vista? И если можно, то каким может быть пример кода?

Просто для протокола: это не для какой-либо злонамеренной цели, мне просто интересно, какой код потребуется, чтобы фактически убить операционную систему, как указано.


person Matthew Ruston    schedule 10.11.2008    source источник
comment
Есть ли синий экран смерти в Висте? Кстати: Какая может быть незлонамеренная цель?   -  person DilbertDave    schedule 10.11.2008
comment
DilbertDave: иногда, когда вы хотите получить полный дамп в то время, когда вы запускаете его. Полезно для вещей низкого уровня, но не уверен насчет .NET...   -  person Alex Angas    schedule 10.11.2008
comment
@Alex Angas: Вам, вероятно, лучше использовать windbg для получения минидампа, если вы хотите использовать его для целей отладки.   -  person Mendelt    schedule 10.11.2008
comment
Это важный вопрос. Если я развертываю приложение .NET на клиенте, а позже он получает синий экран смерти, я хочу знать, могу ли я сказать, что это определенно не было вызвано моим приложением, поскольку это приложение .NET.   -  person MusiGenesis    schedule 10.11.2008
comment
@DilbertDave Да, в Vista есть BSOD.   -  person Matt Refghi    schedule 10.11.2008
comment
Защищено, так как этот вопрос привлекает спамеров.   -  person    schedule 06.08.2010


Ответы (11)


Клавиатура, вероятно, хороший вариант, но если вам нужно сделать это с помощью кода, продолжайте читать...

На самом деле вам не нужно ничего блевать, все, что вам нужно сделать, это найти функцию KeBugCheck(Ex) и вызвать ее.

http://msdn.microsoft.com/en-us/library/ms801640.aspx http://msdn.microsoft.com/en-us/library/ms801645.aspx

Для сбоев, инициированных вручную, вы хотите использовать 0xE2 (MANUALLY_INITIATED_CRASH) или 0xDEADDEAD (MANUALLY_INITIATED_CRASH1) в качестве кода проверки ошибок. Они зарезервированы явно для этого использования.

Однако поиск функции может оказаться немного сложным. Windows DDK может помочь (проверьте Ntddk.h) - в данный момент у меня его нет, и я не могу найти решающую информацию прямо сейчас - я думаю, что он находится в ntoskrnl.exe или ntkrnlpa.exe, но я не уверен, и в настоящее время у меня нет инструментов для его проверки.

Возможно, вам будет проще просто написать простое приложение на C++ или что-то, что вызывает функцию, а затем просто запустить это.

Имейте в виду, я предполагаю, что Windows не блокирует вам доступ к функции из пользовательского пространства (.NET может иметь некоторые специальные положения). Я не проверял это сам.

person Michael Madsen    schedule 10.11.2008
comment
KeBugCheck(Ex) — это функция ядра. Похоже, что в ntdll.dll нет соответствующей оболочки пользовательского режима. - person bk1e; 10.11.2008
comment
Не будет оболочки пользовательского режима для функции KeBugCheck именно потому, что программам пользовательского режима не разрешено вызывать сбой системы. Однако это не мешает вам написать собственный драйвер режима ядра для реализации этого. - person Jesse Weigert; 20.03.2009

Я не знаю, действительно ли это работает, и я уверен, что вам нужны права администратора, но вы можете установить ключ реестра CrashOnCtrlScroll, а затем использовать SendKeys для отправки CTRL+Scroll Lock+Scroll Lock.

Но я считаю, что это ДОЛЖНО исходить из драйвера клавиатуры, поэтому я думаю, что простой SendKeys недостаточно хорош, и вам нужно либо каким-то образом подключиться к драйверу клавиатуры (звучит очень грязно), либо проверить, что CrashDump имеет API, который может вызываться с помощью P/Invoke.

http://support.microsoft.com/kb/244139

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters
Имя: CrashOnCtrlScroll
Тип данных: REG_DWORD
Значение: 1
Перезапустить

person Michael Stum    schedule 10.11.2008
comment
Я нахожу эту статью о Tech Republic немного легче для понимания. Однако это тот же метод: articles.techrepublic.com.com/5100-10878_11 -5710338.html - person Joe Pineda; 10.11.2008

Я должен был бы сказать нет. Вам придется p/invoke и взаимодействовать с драйвером или другим кодом, который находится в пространстве ядра. Код .NET находится далеко в стороне от этой области, хотя и были разговоры об управляемых драйверах в будущих версиях Windows. Просто подождите еще несколько лет, и вы можете разбиться, как наши неуправляемые друзья.

person Community    schedule 10.11.2008

Насколько я знаю, настоящий BSOD требует сбоя в коде режима ядра. В Vista по-прежнему бывают BSOD, но они реже, потому что в новой модели драйверов меньше драйверов в режиме ядра. Любые сбои в пользовательском режиме просто приведут к уничтожению вашего приложения.

Вы не можете запускать управляемый код в режиме ядра. Поэтому, если вы хотите получить BSOD, вам нужно использовать PInvoke. Но даже это достаточно сложно. Вам нужно сделать несколько действительно причудливых PInvokes, чтобы что-то в режиме ядра вызывало рвоту.

Но среди тысяч пользователей SO наверняка есть кто-то, кто это делал :-)

person Mendelt    schedule 10.11.2008

Вы можете использовать инструмент OSR Online, который вызывает сбой ядра. Я никогда не пробовал это сам, но я думаю, вы могли бы просто запустить его через стандартный класс .net Process:

http://www.osronline.com/article.cfm?article=153

person Luke Quinane    schedule 19.11.2008

Однажды мне удалось безответственно сгенерировать BSOD в Windows XP, используя System.Net.Sockets в .NET 1.1. Я мог бы повторять это довольно регулярно, но, к сожалению, это было пару лет назад, и я точно не помню, как я это запустил, и исходный код больше не у меня.

person Terence Lewis    schedule 10.11.2008
comment
Я также видел это с .NET 3.5 в Vista, и обновление драйвера для встроенного сетевого интерфейса устранило проблему. Очевидно, что программа .NET вызвала проблему с драйвером, которую ранее не вызывала ни одна другая программа. - person realMarkusSchmidt; 02.12.2009

Попробуйте вводить видео в реальном времени с помощью directshow в DirectX8 или DirectX9, большинство обращений идет к видеодрайверам режима ядра. Я преуспел во многих синих экранах при запуске процедуры обратного вызова из источника видеозахвата в реальном времени, особенно если ваш обратный вызов занимает много времени, может остановить весь драйвер ядра.

person Community    schedule 10.11.2008

Управляемый код может вызвать проверку ошибок, если у него есть доступ к неисправным драйверам ядра. Однако это будет драйвер ядра, который непосредственно вызывает BSOD (например, BSOD DirectShow uffe, BSOD сокета Теренса Льюиса или BSOD, наблюдаемые при использовании BitTorrent с определенными сетевыми адаптерами).

Прямой доступ в пользовательском режиме к привилегированным низкоуровневым ресурсам может вызвать ошибку (например, запись на Device\PhysicalMemory, если это не повредит ваш жесткий диск; Vista не разрешает доступ в пользовательском режиме к физической памяти).

Если вам просто нужен файл дампа, то предложение Мендельта по использованию WinDbg гораздо лучше, чем использование ошибки в драйвере ядра. К сожалению, команда .dump не поддерживается для локальной отладки ядра, поэтому вам потребуется второй ПК, подключенный через последовательный порт или 1394, или виртуальная машина, подключенная через виртуальный последовательный порт. LiveKd может быть вариантом для одного ПК, если вы необходимо, чтобы состояние дампа памяти было полностью самосогласованным.

person bk1e    schedule 10.11.2008

Для этого не нужны никакие драйверы режима ядра, только SeDebugPrivilege. Вы можете сделать свой процесс критическим с помощью NtSetInformationProcess, или RtlSetProcessIsCritical и просто завершите свой процесс. Вы увидите тот же код проверки ошибок, что и при уничтожении csrss.exe, потому что вы установили тот же «критический» флаг для своего процесса.

person John Smith    schedule 22.08.2013

К сожалению, я знаю, как это сделать, поскольку служба .NET на нашем сервере вызывала синий экран. (Примечание: Windows Server 2008 R2, а не XP/Vista).

Я с трудом мог поверить, что виновата программа .NET, но это было так. Кроме того, я только что воспроизвел BSOD на виртуальной машине.

Код нарушения вызывает ошибку 0x00000f4:

string name = string.Empty; // This is the cause of the problem, should check for IsNullOrWhiteSpace

foreach (Process process in Process.GetProcesses().Where(p => p.ProcessName.StartsWith(name, StringComparison.OrdinalIgnoreCase)))
{
    Check.Logging.Write("FindAndKillProcess THIS SHOULD BLUE SCREEN " + process.ProcessName);
    process.Kill();
    r = true;
}

Если кому-то интересно, почему я хочу воспроизвести синий экран, в этом нет ничего злонамеренного. Я изменил наш класс ведения журнала, чтобы он принимал аргумент, указывающий ему записывать прямо на диск, поскольку действия, предшествовавшие BSOD, не отображались в журнале, несмотря на вызов .Flush(). Я воспроизвел сбой сервера, чтобы проверить изменение журнала. VM должным образом разбился, но регистрация работала.

РЕДАКТИРОВАТЬ: Уничтожение csrss.exe, по-видимому, вызывает синий экран. Согласно комментариям, это, вероятно, происходит в коде ядра.

person Stephen Kennedy    schedule 20.03.2012
comment
Как указано в комментариях выше, BSOD может быть вызван только кодом ядра. Ваш код, скорее всего, запускает некоторые драйверы, и это причина сбоя. Тем не менее, это указывает на то, что лежащий в основе код ядра недостаточно надежен, и на самом деле это брешь, которую можно использовать, пока она не будет устранена в коде ядра. - person SomeWittyUsername; 22.10.2012
comment
Да, я думаю, вы правы. По сути, мой код убивает важную службу времени выполнения, вызывая сбой Windows. - person Stephen Kennedy; 02.05.2013

Я обнаружил, что если вы запустите taskkill /F /IM svchost.exe от имени администратора, он попытается убить почти все хосты службы одновременно.

person Electroboss    schedule 03.12.2020