Можно из.Net управляемого кода вызвать произвольный BSOD?

Интересно, можно ли из.Net управляемого кода или, возможно, p/ вызвать необходимую NT dll, если бы я мог сгенерировать BSOD (Blue Screen Of Death) с определенной причиной кода ошибки.

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

Кто-то может прояснить мне вещи и предложить альтернативный способ (если он существует) для управляемого кода?

2 ответа

Решение

Я не могу с уверенностью сказать, что ядро ​​не предоставляет каких-либо средств для вызова KeBugCheck с произвольными аргументами из пользовательского режима, даже если только для процессов с высоким уровнем привилегий, но я очень надеюсь, что никто не делает, и я, конечно, сочувствую всем, кто задается вопросом, почему на Земля, вы бы хотели, чтобы что-то подобное существовало, не говоря уже о том, чтобы использовать это.

Конечно, даже если ядро ​​еще не предоставляет его для вызова из пользовательского режима, оно легко доступно в режиме ядра, то есть для вызова драйверами. Однако даже там драйверам настоятельно не рекомендуется прибегать к нему в любом коде, который когда-либо выпускался. Хотя драйвер может предоставлять интерфейс пользовательского режима, например, через Control I/O Device, для вызова KeBugCheck от имени клиента пользовательского режима, даже непривилегированного, это будет невероятно безответственно перед автором драйвера (за исключением того, что возможно, для частного тестирования).

Что касается CSRSS, некоторые из вас, возможно, захотят знать в качестве фона (и, возможно, уже знают), что архитектура уже давно допускает, что CSRSS не должна быть критической (в том смысле, что ее убийство убивает Windows), а также что она не должна быть единственный. Существует недокументированная функция RtlSetProcessIsCritical, программы, такие как CSRSS, вызывают себя, чтобы зарегистрировать себя как настолько жизненно важные, что когда ядро ​​видит, что они выходят, ядро ​​должно выполнить одну из двух конкретных проверок ошибок.

Вы можете убить процесс csrss, довольно просто:

System.Diagnostics.Process.GetProcessesByName("csrss").Single().Kill();

Даже если это требует прав администратора

У меня был код, который делал именно это: вам может понадобиться ntdll.dll, но я использовал его, не устанавливая ничего... хотя коды проверки ошибок не кажутся нормальными типами

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System.IO;

namespace bsod
{
    class Program
    {


        private static uint STATUS_ASSERTION_FAILURE = 0xC0000420;
      //  private static uint KMODE_EXEPTION_NOT_HANDLED=0x0000008E;
        static void Main(string[] args) {

            while (Console.ReadKey(true).Key == ConsoleKey.W) 
            {

                    crash();

            }

        }
        static void crash()
        {

            bool previousValue=false;
           // Console.WriteLine("Adjusting privileges");
            RtlAdjustPrivilege(19, true, false, out previousValue);
           // Console.WriteLine("Triggering BSOD");
            uint oul = 0;
            IntPtr sptr = Marshal.StringToHGlobalAnsi("");
            NtRaiseHardError(STATUS_ASSERTION_FAILURE, 0, 0, IntPtr.Zero, 6, out oul);

        }

        [DllImport("ntdll.dll")]
        private static extern uint RtlAdjustPrivilege(
int Privilege,
bool bEnablePrivilege,
bool IsThreadPrivilege,
out bool PreviousValue
);

        [DllImport("ntdll.dll")]
        private static extern uint NtRaiseHardError(
            uint ErrorStatus,
            uint NumberOfParameters,
            uint UnicodeStringParameterMask,
            IntPtr Parameters,
            uint ValidResponseOption,
            out uint Response
        );

    }
}

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

Другие вопросы по тегам