Comment provoquer un BSOD sur Windows XP et les versions plus récentes?

14

Existe-t-il un moyen de provoquer par programme un BSOD sur Windows XP et les versions plus récentes? Comment?

BTW juste pour clarifier, ce n'est pas à des fins malveillantes. Le client a demandé de pouvoir arrêter / redémarrer un terminal sur son LAN de cette façon. Quand j'ai demandé pourquoi, ils ont répondu parce que c'est plus rapide qu'un redémarrage normal ... :)

(Je suis curieux de savoir dans quelle partie du programme ces personnes ne comprennent pas qui a migré vers Super User. Duh.)

Tamás Szelei
la source
18
Si vous en trouvez un qui n'implique pas d'écrire un pilote, informez Microsoft afin qu'il puisse le corriger.
Erik
13
Hum. C'est plus rapide qu'un redémarrage normal pour une raison - il ne s'arrête pas nécessairement avec élégance. Si vous avez un programme qui s'arrête très lentement, il ne sera peut-être pas difficile de l'interrompre. Si vous arrêtez ou abandonnez de force quelque chose de trop proche du matériel d'E / S, vous pourriez vous retrouver avec des systèmes de fichiers corrompus, etc. votre problème aussi ...)
12
Votre client doit être institutionnalisé et ses conditions mentales suivies de plus près par une équipe médicale.
Darin Dimitrov
9
Les ambulances sont également généralement plus rapides que de conduire votre propre voiture à l'hôpital. Cela n'en fait pas le mode de transport préféré.
FreeAsInBeer
8
Dites à votre client d'appuyer sur le bouton d'alimentation et de le maintenir enfoncé pendant 6 secondes. Ou tout simplement brancher le cordon d'alimentation, c'est plus rapide.
Hans Passant

Réponses:

15

Le ou les pilotes de clavier peuvent provoquer un BSOD:

HKLM\SYSTEM\CurrentControlSet\Services\kbdhid\Parameters

ou (pour les claviers PS / 2 plus anciens)

HKLM\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters

Et il y a mis un REG_DWORDnommé CrashOnCtrlScrollà 1.

Après le prochain redémarrage, vous pouvez forcer l'écran bleu de Ctrl+ ScrollLk+ ScrollLk. Le code de vérification des bogues sera dans ce cas 0xE2 (MANUALLY_INITIATED_CRASH).

Si vous voulez vraiment une méthode programmatique, vous devez trouver un trou dans un pilote sur cette machine ou écrire et installer un pilote simpliste qui appelle soit KeBugCheckou KeBugCheckEx.

S'amuser ;)

Note: il peut être très utile de provoquer délibérément un crash comme celui-ci pour les rédacteurs de pilotes ou même lorsqu'il s'agit de logiciels malveillants. Si vous avez configuré votre système pour créer un vidage de mémoire complet, vous aurez alors une image du système en cours d'exécution qui peut être analysée plus en détail. Considérez des cas comme un blocage où un débogueur n'aide pas nécessairement dans tous les cas.

0xC0000022L
la source
4
Est-ce vrai? C'est cool si ça l'est! (Non, je ne suis pas d'humeur à le tester sur aucun de mes ordinateurs.)
Andreas Rejbrand
3
Oui, ce n'est pas une blague. C'est quelque chose que les rédacteurs de pilotes utilisent depuis un certain temps, bien que je ne me souvienne pas du haut de ma tête de l'emplacement du registre. J'ai dû chercher dans mes notes.
0xC0000022L
J'ai fait l'expérience d'un bsod en tapant printscreen ou en utilisant trop de mémoire en utilisant Ram ou Hardisk interne. Peut-être exploiter un système aussi.
Tech-IO
1

Je ne sais pas exactement comment le provoquer, mais je crois que dans Vista et 7, il se ferme par défaut en cas de défaillance du système et ne montre pas le BSOD.

FreeAsInBeer
la source
C'est bon, je veux ce comportement.
Tamás Szelei
1
@FreeAsInBeer: En fait, c'est parce que vos paramètres système lui demandent de redémarrer après le crash. Cela peut être modifié dans l'onglet Avancé des propriétés de votre ordinateur. En outre, les vidages sur incident créés de nos jours sont généralement des mini-vidages par défaut, c'est pourquoi le redémarrage se produit si rapidement que vous ne voyez pas l'écran bleu (littéralement). Mais c'est là, croyez-moi;)
0xC0000022L
1
@STATUS_ACCESS_DENIED: Je sais, je lui faisais simplement savoir que la valeur par défaut de cette variable est définie pour ne pas afficher les BSOD, donc il savait vérifier cette propriété s'il n'en obtenait pas une comme prévu.
FreeAsInBeer
@FreeAsInBeer: assez bien :)
0xC0000022L
1

Généralement, un BSOD se produit lorsque quelque chose se passe horriblement mal dans le système d'exploitation ou le matériel. Faire en sorte que quelque chose ne va pas chez l'un ou l'autre d'entre eux est en soi plutôt difficile, car les auteurs de systèmes d'exploitation et les fournisseurs de matériel n'apprécient pas que les mauvais ingénieurs logiciels rendent leurs produits mauvais et ruinent l'expérience de leurs utilisateurs.

L'écriture d'un pilote est l'une des rares façons de se rapprocher suffisamment du système d'exploitation et du matériel et de provoquer une telle erreur. Bien sûr, l'installation d'un tel pilote n'est pas quelque chose que vous faites généralement sans connaissances utiles et privilèges administratifs, donc l'utiliser à des fins malveillantes s'avère plutôt difficile. Avec ce type d'accès, vous pourriez faire beaucoup plus de mal sans BSOD ou un tel moyen de contournement.

Sion Sheevok
la source
1

Un BSOD est une panique du noyau. Cela signifie qu'une partie du noyau, le cœur même du système d'exploitation a fait quelque chose de vraiment mauvais. Il s'agit peut-être d'une mémoire gribouillée, d'un code exécuté qu'il ne devrait pas avoir. Par programme, vous devez obtenir du code dans l'espace du noyau, puis le déclencher d'une manière ou d'une autre à la demande. Un peu risqué pour un serveur prod.

Les machines Windows normales ont beaucoup d'état dans les processus et dans le noyau. Quel que soit le nettoyage dont vous avez besoin pour maintenir l'état cohérent, eh bien vous venez de le court-circuiter.

Plus précisément, un BSOD est (généralement) un bug du noyau (ou du pilote), le noyau est dans un mauvais état, si mauvais qu'il a l'impression qu'il ne peut pas être nettoyé et qu'il préfère redémarrer, perdant tout bon état qu'il a juste parce qu'il ne le fait pas savoir ce qui est bon et ce qui est mauvais. Aucun tampon n'a pu être vidé sur le (s) disque (s). Ensuite, il essaiera de nettoyer au redémarrage, mais il a perdu beaucoup de contexte à l'arrêt / panique, donc ce sera un nettoyage conservateur, devant choisir les bons et les mauvais restes de la panique.

Ainsi, certains de vos avantages à l'arrêt ont disparu au démarrage, car il doit maintenant déterminer où il a obtenu ses jambes coupées de dessous lui-même. Il doit exécuter chkdsk et nettoyer tous les blocs de disque qui étaient en état d'écriture partielle. Les disques USB mettent beaucoup en cache. Vous pouvez désactiver la mise en cache, ce qui rendrait moins probable la perte de données en cas de panne, mais la non-mise en cache enlève une certaine vitesse. Quels fichiers êtes-vous prêt à perdre?

Bref, c'est une mauvaise idée. Toute machine de production dans laquelle cela se produit peut être dans un état instable même après le nettoyage. C'est mauvais.

Je dirais juste de prendre le coup d'arrêt et de redémarrer. Vous perdrez le gain de temps que vous pensez obtenir la première fois que vous devez reconstruire le serveur car il ne démarre pas ou vos programmes ne peuvent pas démarrer.

Rich Homolka
la source
Vous manquez le point. Il existe de bonnes raisons de provoquer un BSOD à la demande lors du débogage d'un problème avec un pilote que vous écrivez. Cependant, je pense que cette question n'aurait jamais dû être migrée de SO à ici, en raison de sa nature.
0xC0000022L
@STATUS_ACCESS_DENIED Je suis d'accord avec votre déclaration, mais si vous vous en souvenez à la question d'origine, cela n'avait rien à voir avec le débogage, mais un raccourci pour arrêter un système. Pas une bonne raison à mon avis.
Rich Homolka
0

Je dois mentionner que tuer le processus csrss.exe ferait BSOD. Mais pas sur les derniers Windows (8, 8.1).

pbies
la source
Cela peut être fait par une application. Tout le monde peut créer une telle application dans Visual Studio Express (gratuit).
chat
Il s'agit du code 0xC000021A ( STATUS_SYSTEM_PROCESS_TERMINATED), btw.
0xC0000022L
0

L'extrait de code de https://www.mpgh.net/forum/showthread.php?t=1100477 fonctionne sous 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
}

Il ne semble pas y avoir de trace dans le journal des événements. Il y aura sûrement par une trace dans le minidump cependant?

oiseaux
la source