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

StackOverflow https://stackoverflow.com/questions/277959

Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

Я не знаю, действительно ли это работает, и я уверен, что вам нужны права администратора, но вы можете установить ключ реестра 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
Имя:СбойOnCtrlScroll
Тип данных:РЕГ_DWORD
Ценить:1
Перезапуск

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

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

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

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

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

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

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

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

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

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

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

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

К сожалению, я знаю, как сделать так, чтобы служба .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 (). Я повторил сбой сервера, чтобы проверить изменения в журнале. Виртуальная машина должным образом потерпела крах, но регистрация работала.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top