Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

Вам действительно не нужно что-либо делать, как таковое, все, что вам нужно сделать, это найти функцию 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, но я не уверен, и в настоящее время нет инструментов для его проверки.

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

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

Ответ 2

Я не знаю, действительно ли это работает, и я уверен, что вам нужны права администратора, но вы можете установить ключ реестра 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
Restart

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

Это позволяет управляемому коду вызывать ошибку при доступе к поврежденным драйверам ядра. Тем не менее, именно драйвер ядра напрямую вызывает BSOD (например, uffe DirectShow BSOD, сокеты BSENs Terence Lewis или BSOD, которые видны при использовании BitTorrent с некоторыми сетевыми адаптерами).

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

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

Ответ 9

К сожалению, я знаю, как это сделать, поскольку служба .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 должным образом разбилась, но журнал работал.

EDIT: Killing csrss.exe, по-видимому, является причиной того, что вызывает синий экран. Согласно комментариям, это, вероятно, происходит в коде ядра.

Ответ 10

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