質問

ここで興味があるのは、Windows XP / Vistaで.netマネージコードを使用してWindows Blue Screen of Deathを呼び出すことは可能ですか?可能であれば、サンプルコードはどうなりますか?

記録のためだけに、これは悪意のある目的のためではなく、指定されたとおりにオペレーティングシステムを実際に強制終了するためにどのようなコードが必要か疑問に思っています。

役に立ちましたか?

解決

キーボードはおそらく良いオプションですが、コードで行う必要がある場合は、読み続けてください...

それ自体、実際にbarfする必要はありません。KeBugCheck(Ex)関数を見つけて呼び出すだけです。

http://msdn.microsoft.com/en-us/library/ ms801640.aspx http://msdn.microsoft.com/en-us/library/ms801645.aspx

手動で開始されたクラッシュでは、バグチェックコードとして0xE2(MANUALLY_INITIATED_CRASH)または0xDEADDEAD(MANUALLY_INITIATED_CRASH1)を使用します。それらはその使用のために明示的に予約されています。

ただし、関数を見つけるのは少し難しいかもしれません。 Windows DDKが役立つ場合があります(Ntddk.hを確認してください)-現時点では入手できず、現時点では決定的な情報を見つけることができません-それはntoskrnl.exeにあると考えますまたはntkrnlpa.exeですが、私にはわかりません。現在、それを検証するツールがありません。

単純なC ++アプリまたは関数を呼び出すものを作成し、それを実行する方が簡単な場合があります。

お気づきのように、Windowsはユーザー空間から関数へのアクセスをブロックしません(には特別な規定があるかもしれません)。自分でテストしていません。

他のヒント

実際に機能するかどうかはわかりませんが、管理者権限が必要であると確信していますが、CrashOnCtrlScrollレジストリキーを設定し、SendKeysを使用してCTRL + Scroll Lock + Scroll Lockを送信できます。

しかし、これはキーボードドライバーからのものであると考えているため、単純なSendKeysでは不十分であり、何らかの形でキーボードドライバーにフックする必要があります(本当に面倒です)か、CrashDumpのチェックにP / Invokeで呼び出すことができるAPI。

http://support.microsoft.com/kb/244139

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ i8042prt \ Parameters
名前:CrashOnCtrlScroll
データ型:REG_DWORD
値:1
再起動

いいえと言わなければなりません。カーネル空間に存在するドライバーまたは他のコードとp / invokeして対話する必要があります。 .NETコードは、この領域から遠く離れて存在しますが、Windowsの将来のバージョンではマネージドドライバーについていくつかの話があります。さらに数年待つだけで、管理されていない友人と同じようにクラッシュできます。

私が知る限り、実際のBSODにはカーネルモードコードのエラーが必要です。 Vistaには引き続きBSODがありますが、カーネルモードでは新しいドライバーモデルのドライバーが少ないため、頻度は少なくなります。ユーザーモードでエラーが発生すると、アプリケーションが強制終了されます。

マネージコードをカーネルモードで実行することはできません。したがって、BSODを使用する場合は、PInvokeを使用する必要があります。しかし、これでも非常に困難です。カーネルモードでbarfに何かを取得するには、本当に素晴らしいPInvokesを行う必要があります。

しかし、数千のSOユーザーの中には、おそらくこれを行った人がいるでしょう:-)

カーネルクラッシュをトリガーするOSR Onlineのツールを使用できます。自分で試したことはありませんが、標準の.netプロセスクラスを介して実行できると思います。

http://www.osronline.com/article.cfm?article=153

.NET 1.1のSystem.Net.Socketsを使用してWindows XP上で無責任にBSODを生成することができました。かなり定期的に繰り返すことができましたが、残念なことに、それは数年前であり、それをトリガーした方法を正確に覚えていません。

directx8またはdirectx9でdirectshowを使用してライブビデオ入力を試してください。ほとんどの呼び出しはカーネルモードのビデオドライバーに送られます。ライブビデオキャプチャソースからコールバックプロシージャを実行するとき、特にコールバックに時間がかかる場合、カーネルドライバー全体が停止する可能性があるため、多くのブルースクリーンで成功しました。

マネージコードは、障害のあるカーネルドライバーにアクセスしたときにバグチェックを引き起こす可能性があります。ただし、BSODを直接引き起こすのはカーネルドライバーです(たとえば、uffeのDirectShow BSOD、Terence LewisのソケットBSOD、または特定のネットワークアダプターでBitTorrentを使用するときに表示されるBSOD)。

特権のある低レベルのリソースへの直接のユーザーモードアクセスは、バグチェックを引き起こす可能性があります(たとえば、 Device \ PhysicalMemory でハードディスクが破損しない場合、Vistaはそうではありません)物理メモリへのユーザーモードアクセスを許可します)。

ダンプファイルだけが必要な場合、カーネルドライバのバグを悪用するよりも、WinDbgを使用するというMendeltの提案の方がはるかに優れています。残念ながら、ローカルカーネルデバッグでは .dump コマンドはサポートされていないため、シリアルまたは1394で接続された2台目のPC、または仮想シリアルポートで接続されたVMが必要になります。 LiveKd は、1台のPCオプションです。メモリダンプの状態が完全に一貫している必要があります。

これにはカーネルモードドライバーは不要で、SeDebugPrivilegeが必要です。プロセスをクリティカルに設定するには、 NtSetInformationProcess 、または RtlSetProcessIsCritical そしてプロセスを強制終了します。同じ「クリティカル」を設定したため、csrss.exeを終了したときと同じバグチェックコードが表示されます。プロセスのフラグ。

残念ながら、サーバー上の.NETサービスがブルースクリーンを引き起こしたため、これを行う方法を知っています。 (注:XP / Vistaではなく、Windows Server 2008 R2)。

.NETプログラムが原因であるとはほとんど信じられませんでしたが、そうでした。さらに、仮想マシンにBSODを複製しました。

問題のコードにより、0x00000f4が発生します:

string name = string.Empty; // This is the cause of the problem, should check for IsNullOrWhiteSpace

foreach (Process process in Process.GetProcesses().Where(p => p.ProcessName.StartsWith(name, StringComparison.OrdinalIgnoreCase)))
{
    Check.Logging.Write("FindAndKillProcess THIS SHOULD BLUE SCREEN " + process.ProcessName);
    process.Kill();
    r = true;
}

ブルースクリーンを複製したい理由がわからない場合は、悪意はありません。ロギングクラスを修正して、直接ディスクに書き込む .Flush()が呼び出されたにもかかわらず、BSODより前のアクションがログに表示されなかったため。サーバーのクラッシュを再現して、ロギングの変更をテストしました。 VMは正常にクラッシュしましたが、ログは機能しました。

編集: csrss.exe を強制終了すると、ブルースクリーンが発生します。コメントによると、これはおそらくカーネルコードで発生しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top