Come causare un BSOD su Windows XP e versioni più recenti?


14

C'è un modo per causare a livello di codice un BSOD su Windows XP e versioni più recenti? Come?

A proposito, solo per chiarire, questo non è per scopi dannosi. Il client ha richiesto di essere in grado di arrestare / riavviare un terminale sulla propria LAN in questo modo. Quando ho chiesto perché, hanno detto perché è più veloce di un normale riavvio ... :)

(Sono curioso di sapere quale parte di "programmaticamente" quelle persone non capiscono chi è migrato a Super User. Duh.)


18
Se ne trovi uno che non comporta la scrittura di un driver, avvisa Microsoft in modo che possa risolverlo.
Erik

13
Um. È più veloce di un normale riavvio per un motivo - non si spegne necessariamente con grazia. Se si dispone di un programma che si arresta molto lentamente, potrebbe non essere un problema interromperlo. Se si spegne forzatamente o si abbandona qualcosa di troppo vicino all'hardware I / O, si potrebbe finire con filesystem corrotti ecc. Considerarlo equivalente a un mezzo controllato dalla rete per spegnere e riaccendere l'alimentazione (che presumo siano disponibili per la vendita e che potrebbe essere risolto anche il tuo problema ...)

12
Il tuo cliente deve essere istituzionalizzato e le sue condizioni mentali seguite da un team medico più da vicino.
Darin Dimitrov,

9
Le ambulanze sono anche generalmente più veloci di guidare la propria auto in ospedale. Ciò non lo rende la modalità di viaggio preferita.
FreeAsInBeer

8
Dì al tuo cliente di tenere premuto il pulsante di accensione per 6 secondi. O semplicemente strappare il cavo di alimentazione, è più veloce.
Hans Passant,

Risposte:


15

Al driver della tastiera può essere detto di causare un BSOD:

HKLM\SYSTEM\CurrentControlSet\Services\kbdhid\Parameters

o (per tastiere PS / 2 precedenti)

HKLM\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters

E lì impostare un REG_DWORDnome CrashOnCtrlScrolla 1.

Dopo il successivo riavvio è possibile forzare la schermata blu di Ctrl+ ScrollLk+ ScrollLk. Il codice di controllo bug in questo caso sarà 0xE2 (MANUALLY_INITIATED_CRASH).

Se vuoi davvero un metodo programmatico, devi trovare un buco in alcuni driver su quella macchina o scrivere e installare un driver semplicistico che chiama KeBugChecko KeBugCheckEx.

Divertiti ;)

Nota a margine: può essere molto utile provocare deliberatamente un arresto del genere per gli autori di driver o anche quando si tratta di malware. Se hai configurato il tuo sistema per creare un dump di memoria pieno, avrai un'immagine del sistema in esecuzione che può essere ulteriormente analizzato. Considerare casi come un deadlock in cui un debugger non aiuta necessariamente in tutti i casi.


4
È vero? Va bene se lo è! (No, non ho
voglia di testarlo

3
Sì, in realtà non è inteso come uno scherzo. Questo è qualcosa che gli autori di driver usano da un po 'di tempo, anche se non ricordavo dalla mia testa quale fosse la posizione del registro. Ho dovuto cercarlo nei miei appunti.
0xC0000022L

Ho sperimentato un bsod digitando printcreen o con troppa memoria nell'uso di Ram o Hardisk interno. Forse sfruttando anche un sistema.
Tech-IO


1

Non so esattamente come causarlo, ma credo in Vista e 7, per impostazione predefinita si spegne in caso di errore del sistema e non mostra il BSOD.


Va bene, voglio quel comportamento.
Tamás Szelei,

1
@FreeAsInBeer: In realtà ciò è dovuto al fatto che le impostazioni di sistema indicano che si riavvierà dopo l'incidente. Questo può essere modificato nella scheda Avanzate delle proprietà del tuo computer. Inoltre, i dump di crash creati al giorno d'oggi sono di solito mini dump per impostazione predefinita, motivo per cui il riavvio avviene così velocemente che non riesci a vedere la schermata blu (letteralmente). Ma è lì, credimi;)
0xC0000022L

1
@STATUS_ACCESS_DENIED: Lo so, lo stavo semplicemente facendo sapere che il valore predefinito per questa variabile è impostato per non mostrare i BSOD, quindi sapeva di controllare quella proprietà se non ne aveva uno come previsto.
FreeAsInBeer

@FreeAsInBeer: abbastanza giusto :)
0xC0000022L

1

In genere, un BSOD si verifica quando qualcosa va terribilmente storto nel sistema operativo o nell'hardware. Ottenere qualcosa di sbagliato all'interno di uno di quelli al di fuori di essi è, intrinsecamente, piuttosto difficile, poiché gli autori del sistema operativo e i fornitori di hardware allo stesso modo non apprezzano i cattivi ingegneri del software che rendono i loro prodotti cattivi e rovinano l'esperienza dei loro utenti.

Scrivere un driver è uno dei pochi modi per avvicinarsi abbastanza al sistema operativo e all'hardware e causare un tale errore. Naturalmente, l'installazione di un tale driver non è qualcosa che generalmente fai senza conoscenza intenzionale e privilegi amministrativi, quindi l'utilizzo di questo per scopi dannosi si rivela piuttosto difficile. Con quel tipo di accesso, potresti fare molto più danno senza un BSOD o un tale giro di mezzi.


1

Un BSOD è un panico del kernel. Significa una parte del kernel, il vero nucleo del sistema operativo ha fatto qualcosa di veramente brutto. Forse scarabocchiava memoria, forse eseguiva codice che non avrebbe dovuto avere. A livello di programmazione, è necessario ottenere il codice nello spazio del kernel e quindi attivarlo in qualche modo su richiesta. Un po 'rischioso per un server prod.

Le macchine Windows normali hanno molto stato nei processi e nel kernel. Qualunque sia la pulizia di cui hai bisogno per mantenere coerente lo stato, beh, lo hai fatto cortocircuitare.

In particolare un BSOD è (di solito) un bug del kernel (o del driver), il kernel è in uno stato cattivo, così male che sembra che non possa ripulire e preferirebbe riavviare, perdendo qualsiasi stato buono abbia solo perché non lo fa sapere cosa è buono e cosa è male. Eventuali buffer non possono essere scaricati su disco / i. Quindi proverà a ripulire al riavvio, ma ha perso un sacco di contesto su arresto / panico, quindi sarà una pulizia conservativa, dovendo raccogliere dal panico gli avanzi buoni e quelli cattivi.

Quindi, alcuni dei tuoi vantaggi allo spegnimento sono andati all'avvio, dal momento che ora ha bisogno di capire dove sono state tagliate le gambe da sotto se stesso. Deve eseguire chkdsk e ripulire tutti i blocchi del disco che si trovavano in uno stato di scrittura parziale. I dischi USB memorizzano molto nella cache. È possibile disattivare la memorizzazione nella cache, il che renderebbe meno probabile la perdita di dati in caso di arresto anomalo, ma non la memorizzazione nella cache porta via una certa velocità. Quali file sei disposto a perdere?

In breve, questa è una cattiva idea. Qualsiasi macchina di produzione che accada può verificarsi in uno stato instabile anche dopo la pulizia. Questo non va bene.

Direi solo per prendere il colpo di spegnimento e riavviare. Perderai qualsiasi risparmio di tempo pensi di ottenere la prima volta che devi ricostruire il server perché non si avvia o i tuoi programmi non possono avviarsi.


Ti manca il punto. Esistono buoni motivi per causare un BSOD su richiesta durante il debug di un problema con un driver che si scrive. Tuttavia, penso che questa domanda non avrebbe mai dovuto essere migrata da SO a qui, a causa della sua natura.
0xC0000022L

@STATUS_ACCESS_DENIED Sono d'accordo con la tua affermazione, ma se ricordi alla domanda originale, non aveva nulla a che fare con il debug, ma una scorciatoia per spegnere un sistema. Secondo me non è una buona ragione.
Rich Homolka,

0

Devo dire che uccidere il processo csrss.exe renderebbe BSOD. Ma non su Windows più recente (8, 8.1).


Questo può essere fatto da un'app. Chiunque può creare una tale app in Visual Studio Express (gratuito).
pbies

Questo è il codice 0xC000021A ( STATUS_SYSTEM_PROCESS_TERMINATED), a proposito.
0xC0000022L

0

Lo snippet di codice di https://www.mpgh.net/forum/showthread.php?t=1100477 funziona su Windows 10.17134

#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
}

Sembra che non ci sia traccia nel registro eventi. Ci sarà sicuramente una traccia nel minidump però?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.