ある日、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
5 番目のパラメーターが 6 (OptionShutdownSystem) の場合、BSOD が発生します。これには、シャットダウン権限を有効にする必要があります。
ユーザーモードプログラムがバグのあるドライバーとやり取りしない限り、ユーザーモードからBSODを作成することは非常に困難です(特定の操作シーケンスで特定のドライバーのバグが明らかになる可能性があります)。ユーザー モードから、システムの安定性を確保するために、入力はカーネル モードに渡される前に十分に検証されます。Microsoft API/ドライバーのほとんどは、システム内のセキュリティの問題を回避するために適切に検証されています。ドライバーの製造も同様です。
最善の方法は、ドライバー スタックを妨害することですが、それはユーザー モードではありません。
NotMyFault SystInternals ユーティリティを使用して BSOD を作成できます。基本的にドライバーを挿入し、BSOD を作成します。
バグ以外のアプローチはリソースの枯渇です。調査できる領域は、マシン上のすべての CPU を消費し (リアルタイムの優先度レベルでコアと同じ数のスレッドを実行する)、カーネル リソースを消費し、リアルタイムの優先度に依存してカーネルのクリーニングを停止することです。上。
ただし、適切なリソースが何であるかはわかりません。CPU をクリーンアップできないデバイスに対して未処理の非同期操作がたくさんありますか? 少なくともその方向で実験することができます。
キーボードで強制的にシステムをクラッシュさせることができます。あなたのタイトルはユーザーモードについて語っていますが、これがユーザーモードに該当するかどうかはわかりませんが、役に立つかもしれません.
オペレーティング システムにバグがない場合、ユーザー空間からマシンを BSOD にすることは不可能です。最悪の場合、問題のあるアプリケーションをクラッシュさせるだけです。
ただし、完璧なものはありません。すべてのオペレーティング システムにはバグがあり、すべてのオペレーティング システムには、ユーザー空間から悪用可能な BSOD (または Linux のような OOPS、または特定の OS が回復不能なエラーを報告することを選択する) を引き起こすバグがありました。
詳細に関しては、バグの性質に大きく依存します。「はい、可能です」以外の一般的な答えはありません。
詳細については、OS の設計と、ページング、リング レベル、およびその他の手法を使用してプロセスを互いに分離し、カーネル スペースを分離する方法を詳しく調べる必要があります。
BSOD は、カーネル モードで発生する回復不能なエラーによるものです。何らかの方法でカーネル エラーを発生させずにこれを発生させる方法はありません。一般に、そうしたい場合は、ドライバーの欠陥を見つけて[編集:またはコメント者が指摘したように、システムコール]、それを悪用する必要があります。
または、このアプリが行うことを行うこともできます: http://www.nirsoft.net/utils/start_blue_screen.html。好きな方法でシステムをクラッシュさせる独自のドライバーを作成するだけです。:)
ウィキペディアのページには興味深い情報がいくつかあったので、参考のためにそれを含めます: http://en.wikipedia.org/wiki/Blue_Screen_of_Death .
ドライバーを使用しない 2 つの方法:
- 誰かが指摘したように、文書化されていない関数 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 と入力するだけです。