6

有一天我对我的 XP 盒子感到厌烦,所以我决定尝试这个问题的一些答案,看看它们中的任何一个是否会导致 BSOD。
他们没有,而且他们似乎最有可能这样做,所以我想知道是否可以在 C/C++ 中从用户模式触发 BSOD,如果可以,如何?

4

10 回答 10

12

就是这样:

#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;
}
于 2016-12-15T18:16:34.263 回答
11

有未记录的函数 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。这需要启用关闭权限。

于 2013-06-08T19:52:03.323 回答
7

除非用户模式程序与有缺陷的驱动程序交互(可能是特定的操作序列可以揭示特定驱动程序中的错误)干扰驱动程序堆栈,否则从用户模式制造 BSOD 非常困难。从用户模式,输入在传递到内核模式之前经过验证,以确保系统的稳定性。大多数 Microsoft API/驱动程序都经过了很好的验证,以避免系统中的安全问题;驱动程序制造商也是如此。

最好的方法是干扰驱动程序堆栈,但这不是用户模式。

您可以使用 NotMyFault SystInternals 实用程序创建 BSOD。它从根本上注入驱动程序并创建 BSOD

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

于 2011-08-12T01:23:30.360 回答
3

除了错误之外的方法是资源耗尽。您可以调查的一个领域是消耗机器上的所有 CPU(以实时优先级运行与内核一样多的线程),并消耗内核资源并依赖实时优先级来阻止内核清理向上。

不知道什么是好的资源。针对无法清理 CPU 的设备执行大量未完成的异步操作?你至少可以朝那个方向进行试验。

于 2011-08-12T01:04:37.747 回答
2

如果操作系统中没有错误,那么应该不可能从用户空间对机器进行蓝屏死机。在最坏的情况下,它应该只会使有问题的应用程序崩溃。

然而,没有什么是完美的。每个操作系统中都存在错误,并且每个操作系统都存在导致可从用户空间利用的 BSOD(或像 Linux 那样的 OOPS,或者给定的操作系统选择报告不可恢复的错误)的错误。

就细节而言,这实际上取决于错误的性质。除了“是的,有可能”之外,没有通用的答案。

有关更多详细信息,您应该更多地研究操作系统设计,以及如何使用分页、环级别和其他技术将进程彼此分离以及内核空间。

于 2011-08-12T00:59:02.147 回答
2

好吧,蓝屏死机来自内核模式下发生的不可恢复的错误;如果不以某种方式触发内核错误,就无法导致这种情况发生。一般来说,如果你想这样做,你必须在驱动程序中找到一个缺陷[编辑:或者正如评论者指出的,一个系统调用]并利用它。

或者,您可以执行此应用程序的操作:http: //www.nirsoft.net/utils/start_blue_screen.html。只需编写自己的驱动程序即可以任何您想要的方式使系统崩溃。:)

维基百科页面有一些有趣的信息,所以我将其包括在内以供参考:http ://en.wikipedia.org/wiki/Blue_Screen_of_Death 。

于 2011-08-12T01:02:37.743 回答
2

您可以使用键盘强制系统崩溃。您的标题谈到了用户模式,我不确定这是否符合用户模式,但它可能有用。

于 2013-01-22T09:36:21.200 回答
1

不使用驱动程序的两种方法:

  1. 正如有人指出的那样使用未记录的函数 NtRaiseHardError
  2. 使用未记录的函数 RtlSetProcessIsCritical 设置关键进程,然后终止它。需要 SE_DEBUG_NAME 权限。http://www.codeproject.com/Articles/43405/Protecting-Your-Process-with-RtlSetProcessIsCriti
于 2016-06-30T13:43:00.197 回答
1

我在此链接中找到了一个生成 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
    }
于 2018-10-18T18:50:45.627 回答
0

只需打开 Windows 运行并键入 C:\con\con

于 2021-03-05T11:13:01.143 回答