有一天我对我的 XP 盒子感到厌烦,所以我决定尝试这个问题的一些答案,看看它们中的任何一个是否会导致 BSOD。
他们没有,而且他们似乎最有可能这样做,所以我想知道是否可以在 C/C++ 中从用户模式触发 BSOD,如果可以,如何?
10 回答
就是这样:
#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;
}
有未记录的函数 NtRaiseHardError。
http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/Error/NtRaiseHardError.html
如果第五个参数是 6 (OptionShutdownSystem),你会得到一个 BSOD。这需要启用关闭权限。
除非用户模式程序与有缺陷的驱动程序交互(可能是特定的操作序列可以揭示特定驱动程序中的错误)干扰驱动程序堆栈,否则从用户模式制造 BSOD 非常困难。从用户模式,输入在传递到内核模式之前经过验证,以确保系统的稳定性。大多数 Microsoft API/驱动程序都经过了很好的验证,以避免系统中的安全问题;驱动程序制造商也是如此。
最好的方法是干扰驱动程序堆栈,但这不是用户模式。
您可以使用 NotMyFault SystInternals 实用程序创建 BSOD。它从根本上注入驱动程序并创建 BSOD
除了错误之外的方法是资源耗尽。您可以调查的一个领域是消耗机器上的所有 CPU(以实时优先级运行与内核一样多的线程),并消耗内核资源并依赖实时优先级来阻止内核清理向上。
不知道什么是好的资源。针对无法清理 CPU 的设备执行大量未完成的异步操作?你至少可以朝那个方向进行试验。
如果操作系统中没有错误,那么应该不可能从用户空间对机器进行蓝屏死机。在最坏的情况下,它应该只会使有问题的应用程序崩溃。
然而,没有什么是完美的。每个操作系统中都存在错误,并且每个操作系统都存在导致可从用户空间利用的 BSOD(或像 Linux 那样的 OOPS,或者给定的操作系统选择报告不可恢复的错误)的错误。
就细节而言,这实际上取决于错误的性质。除了“是的,有可能”之外,没有通用的答案。
有关更多详细信息,您应该更多地研究操作系统设计,以及如何使用分页、环级别和其他技术将进程彼此分离以及内核空间。
好吧,蓝屏死机来自内核模式下发生的不可恢复的错误;如果不以某种方式触发内核错误,就无法导致这种情况发生。一般来说,如果你想这样做,你必须在驱动程序中找到一个缺陷[编辑:或者正如评论者指出的,一个系统调用]并利用它。
或者,您可以执行此应用程序的操作:http: //www.nirsoft.net/utils/start_blue_screen.html。只需编写自己的驱动程序即可以任何您想要的方式使系统崩溃。:)
维基百科页面有一些有趣的信息,所以我将其包括在内以供参考:http ://en.wikipedia.org/wiki/Blue_Screen_of_Death 。
您可以使用键盘强制系统崩溃。您的标题谈到了用户模式,我不确定这是否符合用户模式,但它可能有用。
不使用驱动程序的两种方法:
- 正如有人指出的那样使用未记录的函数 NtRaiseHardError
- 使用未记录的函数 RtlSetProcessIsCritical 设置关键进程,然后终止它。需要 SE_DEBUG_NAME 权限。http://www.codeproject.com/Articles/43405/Protecting-Your-Process-with-RtlSetProcessIsCriti
我在此链接中找到了一个生成 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
}
只需打开 Windows 运行并键入 C:\con\con