Создать BSOD из пользовательского режима? - PullRequest
5 голосов
/ 12 августа 2011

Однажды мне стало скучно с моей коробкой XP, поэтому я решил попробовать некоторые из ответов на этот вопрос , чтобы посмотреть, не вызовет ли какой-либо из них BSOD.
Они этого не сделали, и казалось, что они будут делать это с наибольшей вероятностью, поэтому мне было интересно, можно ли вызвать BSOD из пользовательского режима в C / C ++, и если да, то как?

Ответы [ 9 ]

11 голосов
/ 08 июня 2013

Есть недокументированная функция NtRaiseHardError.

http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/Error/NtRaiseHardError.html

http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/Error/HARDERROR_RESPONSE_OPTION.html

Если пятым параметром является 6 (OptionShutdownSystem), вы получите BSOD. Для этого необходимо включить привилегию выключения.

7 голосов
/ 12 августа 2011

Серьезно сложно сделать BSOD из пользовательского режима, если программа пользовательского режима не взаимодействует с ошибочными драйверами (может быть, определенная последовательность операций может выявить ошибки в конкретном драйвере) нарушает стек драйверов.Из пользовательского режима входные данные проверяются задолго до перехода в режим ядра, чтобы обеспечить стабильность системы.Большинство API / драйверов Microsoft прошли валидацию, чтобы избежать проблем с безопасностью в системе;так же производит драйвер.

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

Вы можете создать BSOD с помощью утилиты NotMyFault SystInternals.Он принципиально внедряет драйвер и создает BSOD

http://download.sysinternals.com/Files/Notmyfault.zip

5 голосов
/ 15 декабря 2016

Это просто так:

#include <iostream>
#include <Windows.h>
#include <winternl.h>
using namespace std;
typedef NTSTATUS(NTAPI *pdef_NtRaiseHardError)(NTSTATUS ErrorStatus, ULONG NumberOfParameters, ULONG UnicodeStringParameterMask OPTIONAL, PULONG_PTR Parameters, ULONG ResponseOption, PULONG Response);
typedef NTSTATUS(NTAPI *pdef_RtlAdjustPrivilege)(ULONG Privilege, BOOLEAN Enable, BOOLEAN CurrentThread, PBOOLEAN Enabled);
int main()
{
    BOOLEAN bEnabled;
    ULONG uResp;
    LPVOID lpFuncAddress = GetProcAddress(LoadLibraryA("ntdll.dll"), "RtlAdjustPrivilege");
    LPVOID lpFuncAddress2 = GetProcAddress(GetModuleHandle("ntdll.dll"), "NtRaiseHardError");
    pdef_RtlAdjustPrivilege NtCall = (pdef_RtlAdjustPrivilege)lpFuncAddress;
    pdef_NtRaiseHardError NtCall2 = (pdef_NtRaiseHardError)lpFuncAddress2;
    NTSTATUS NtRet = NtCall(19, TRUE, FALSE, &bEnabled); 
    NtCall2(STATUS_FLOAT_MULTIPLE_FAULTS, 0, 0, 0, 6, &uResp); 
    return 0;
}
3 голосов
/ 12 августа 2011

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

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

2 голосов
/ 22 января 2013

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

2 голосов
/ 12 августа 2011

Ну, BSOD из-за неисправимых ошибок, которые происходят в режиме ядра;нет способа заставить это произойти, не вызывая ошибку ядра каким-либо образом.В общем, если вы хотите это сделать, вам нужно будет найти недостаток в драйвере [править: или, как указал комментатор, системный вызов] и использовать это.

Или вы можете сделать то, чтоэто приложение делает: http://www.nirsoft.net/utils/start_blue_screen.html.Просто напишите свой собственный драйвер, чтобы вывести систему из строя любым удобным для вас способом.:)

На странице Википедии была интересная информация, поэтому я включил ее для справки: http://en.wikipedia.org/wiki/Blue_Screen_of_Death.

2 голосов
/ 12 августа 2011

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

Однако, нет ничего идеального. В каждой операционной системе есть ошибки, и в каждой операционной системе есть ошибки, которые вызывают BSOD (или OOPS, как это делает Linux, или, тем не менее, данная ОС решает сообщить об ошибке), которую можно использовать из пространства пользователя.

Что касается специфики, то это действительно зависит от характера ошибки. Нет общего ответа, кроме «да, это возможно».

Для получения более подробной информации вам следует больше узнать о дизайне ОС и о том, как пейджинг, уровни вызова и другие методы могут использоваться для отделения процессов друг от друга и пространства ядра.

1 голос
/ 30 июня 2016

Два способа без использования драйверов:

  1. Использование недокументированной функции NtRaiseHardError, как кто-то указал
  2. Установка критического процесса с недокументированной функцией RtlSetProcessIsCritical и его завершение. Требуется привилегия SE_DEBUG_NAME. http://www.codeproject.com/Articles/43405/Protecting-Your-Process-with-RtlSetProcessIsCriti
0 голосов
/ 18 октября 2018

Я нашел по этой ссылке код, который генерирует BSOD: https://www.mpgh.net/forum/showthread.php?t=1100477

А вот код (я попробовал, и он работает, вам просто нужно вызвать функцию BlueScreen ())

#include <windows.h>
#pragma comment(lib, "ntdll.lib")

extern "C" NTSTATUS NTAPI RtlAdjustPrivilege(ULONG Privilege, BOOLEAN Enable, BOOLEAN CurrentThread, PBOOLEAN OldValue);
extern "C" NTSTATUS NTAPI NtRaiseHardError(LONG ErrorStatus, ULONG NumberOfParameters, ULONG UnicodeStringParameterMask,
    PULONG_PTR Parameters, ULONG ValidResponseOptions, PULONG Response);

    void BlueScreen()
    {
        BOOLEAN bl;
        ULONG Response;
        RtlAdjustPrivilege(19, TRUE, FALSE, &bl); // Enable SeShutdownPrivilege
        NtRaiseHardError(STATUS_ASSERTION_FAILURE, 0, 0, NULL, 6, &Response); // Shutdown
    }
...