Jak sprowokować system Windows do zawieszenia (zawieszenia)?


180

Muszę przetestować zachowanie urządzenia w przypadku systemu Windows twarde zawiesza się / zawiesza się (np zamrożony ekran, brak diody migające, brak reakcji na wejściach, w tym Ctrl + Alt + Del , etc.). Aby mieć wystarczająco dużo eksperymentów w dość krótkim czasie, muszę zainicjować te zawieszenia programowo lub w inny sposób.

Interesuje mnie w szczególności system Windows 10, ale doceniam każdy działający w innych wersjach.

Każde wyszukiwanie, które przeprowadziłem na ten temat, nie zaskakuje mnie w dyskusji na temat tego, jak wyeliminować te sytuacje, a nie ich sprowokować. Pytanie może więc wydawać się dość dziwne.

Informacje zwrotne: Wypróbowałem wiele przepisów kulinarnych zawartych w odpowiedziach i komentarzach. Przede wszystkim nie interesowały mnie awarie, które przynoszą BSoD (dlatego opisałem zawieszenie, a nie awarię).

Muszę przyznać, że 64-bitowy system Windows 10 wykazywał dobrą odporność na wiele sposobów. Radzi sobie z prawie każdą metodą obciążenia procesora (w tym bombami widełkowymi , pętlami itp.) Całkiem dobrze. Metody wywołujące natychmiastowe błędy (większość metod zawieszania się NotMyFault) są obsługiwane przez system operacyjny z ponownym uruchomieniem lub zamknięciem systemu (co nie jest moim celem). Najlepsze wyniki osiągnięto dzięki metodom wycieku pamięci NotMyFault - prawdziwe zawieszenie bez szans na ponowne uruchomienie.

Wreszcie byłem pod wrażeniem ilości dokumentacji firmy Microsoft, która mówi o zawieszeniu systemu Windows. Wygląda na to, że znają tę część znacznie lepiej niż na odwrót (walka z zamrażaniem) ;-)


Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
DavidPostill

3
Istnieje obliczenie, które można wykonać za pomocą kalkulatora, który zamraża rdzeń procesora aż do jego ukończenia. Na czterordzeniowej maszynie zrobiłbyś to oczywiście cztery razy. Ale nie mogę pamiętać o moim życiu równania matematycznego, które je powoduje.
mickburkejnr

6
@mickburkejnr Jest silnikiem 100000. Przełącz na „Widok naukowy” typ 100000 i naciśnij „n!”. Działa to dobrze na starych wersjach systemu Windows. W dzisiejszych czasach pojawi się ostrzeżenie, że obliczenia te mogą zająć dużo czasu i można je anulować.
duenni

25
Po prostu zacznij go używać.
samazi

5
Instalowanie aktualizacji zawsze działało dla mnie.
Daniel R Hicks,

Odpowiedzi:


230

Może to może pomóc: Wymuszenie awarii systemu z klawiatury

W przypadku klawiatur USB należy włączyć awarię inicjowaną przez klawiaturę w rejestrze. W kluczu rejestru HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Services \ kbdhid \ Parameters utwórz wartość o nazwie CrashOnCtrlScroll i ustaw ją na wartość REG_DWORD 0x01.

Musisz ponownie uruchomić system, aby te ustawienia zaczęły obowiązywać.

Po zakończeniu tej awarii klawiaturę można zainicjować przy użyciu następującej sekwencji klawiszy skrótu: Przytrzymaj prawy klawisz CTRL i naciśnij klawisz SCROLL LOCK dwa razy.

Lub możesz uruchomić bombę widelcową: zobacz to SO pytanie

Istnieje również NotMyFault

Notmyfault to narzędzie, którego można używać do zawieszania się, zawieszania i powodowania wycieków pamięci jądra w systemie Windows. Jest przydatny do nauki identyfikowania i diagnozowania problemów ze sterownikami urządzeń i sprzętem, a także można go używać do generowania plików zrzutu niebieskiego ekranu w źle funkcjonujących systemach.


9
Wypróbowano ForkBomb i NotMyFault. Jedna z metod wyciekania wydaje się robić to, co chcę. Inne nie są przydatne, ponieważ powodują ponowne uruchamianie / zamykanie systemu, a nie zamrażanie. Wielkie dzięki.
hypers

6
CtrlScroll przynosi BSOD. To, czy zawiesi system do debugowania, czy po prostu uruchomi go ponownie, zależy od ustawień rozruchu.
grawity

51
Aaannnddd duenni nigdy nie jest dozwolony w pobliżu moich komputerów. Zawsze.
corsiKa

25

Wygląda na to, że testujesz reakcję urządzenia zewnętrznego na brak reakcji systemu operacyjnego.

Jeśli Twój sprzęt można podłączyć do zwirtualizowanej instalacji systemu Windows, możesz wstrzymać i wznowić maszynę wirtualną tyle razy, ile chcesz. Zainstaluj żądany system operacyjny w środowisku VirtualBox (lub innej wirtualizacji pulpitu), ujawnij maszynie wirtualnej, niezależnie od używanego interfejsu sprzętowego (USB, Ethernet lub cokolwiek innego).

Następnie możesz dowolnie wstrzymywać i wznawiać maszynę wirtualną.


24

Przynajmniej w starszej wersji systemu Windows (kilka lat temu) działały:

Napisałem program C z nieskończoną pętlą:

while(1) {}

... wtedy nadałem temu programowi „priorytet w czasie rzeczywistym” w menedżerze zadań (istnieje również interfejs API, który może to zrobić).

W systemie wielordzeniowym musiałbym to zrobić wiele razy, aby na każdym rdzeniu działała jedna pętla ...


39
Aby mniej nagrzewać procesor, robiąc to: włóż _mm_pause()z #include <immintrin.h>pętli. Jest to instrukcja sprzętowa procesora, a nie jakiekolwiek wywołanie systemowe „uśpienia”; jeśli chodzi o system operacyjny, twój proces jest nie do odróżnienia od SuperPI; różnica polega na tym, ile mocy zużywa procesor podczas pracy w pętli.
Peter Cordes,

5
Nie jestem pewien, czy to powstrzyma części systemu Windows w trybie jądra od działania.
CodesInChaos

2
@CodesInChaos: Większość wątków jądra działa z normalnym priorytetem. Jeden z nich na procesor i jądro również jest prawie gotowy.
Joshua

Kolejna technika obejmująca montaż x86 ( STI+ HLT): stackoverflow.com/questions/3747847/…
meklarian,

3
@meklarian: Powinien być CLI; HLT. Prawdopodobnie musisz to zrobić w trybie uprzywilejowanym. Zasadniczo nadal można go uratować przez NMI lub podobny.
Nate Eldredge

10

Najsilniejsze zawieszenie jądra (tj. Brak śledzenia myszy itp.) Ma miejsce, gdy kod przechodzi w nieskończoną pętlę w trybie jądra z wyłączonymi przerwaniami.

Można to osiągnąć za pomocą sterownika urządzenia, a jeszcze lepiej, możesz napisać sterownik, aby uruchamiał się i zatrzymywał zawieszanie pod twoją kontrolą (zakładając, że nieskończona pętla testuje warunki, nad którymi masz kontrolę).

Jak napisać i zainstalować ten sterownik byłby tematem kolejnego pytania lub trzech, ale takie podejście przyjąłem.


9

Sprawdź następujące pytanie na StackOverflow, które jest podobne do twojego: Jak zawiesić okna na krótki czas

Tl; dr tego jest to, że nie ma sposobu (wiarygodnie) to zrobić.

Zamiast zamrażać lub zawieszać system Windows, być może możesz po prostu przerwać komunikację ze swoim sprzętem.

Nie mam pojęcia, jaki jest twój sprzęt i jak go podłączasz. Jeśli jest to adapter USB lub Ethernet, np. Można łatwo dezaktywować go w Menedżerze urządzeń lub odłączyć? Jeśli siłą zawiesisz lub zawiesisz system, możesz uszkodzić go na różne sposoby, więc bądź ostrożny z tym, co robisz.


1
Rozważę fizyczne odłączenie urządzenia, jeśli nie będę zadowolony z wyników oprogramowania. Dzięki.
hypers

5

Czy tryb debugowania jądra nie jest opcją?

Skonfigurowałem go w systemie Windows 7, a powiązane instrukcje w tej odpowiedzi określają XP lub nowszy, więc powinien działać z Windows 10.

Mam go ustawić na FireWire / 1394 , ponieważ jest to najprostszy, moim zdaniem. Ale możesz to również zrobić przez sieć lub USB (i więcej ).

Gruntownie,

Skonfiguruj komputer docelowy, uruchamiając następujące polecenia w podwyższonym wierszu (wybierając kanał n):

bcdedit /debug on
bcdedit /dbgsettings 1394 channel:n

To jest to samo, co przejście do zakładki rozruchu msconfigi wybranie przycisku „Zaawansowane”:

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

Następnie (po ponownym uruchomieniu komputera docelowego) uruchom program WinDbg na komputerze hosta, używając tej samej szybkości bitowej programu WinDbg na komputerze docelowym.

Następnie jest to tylko kwestia wstrzymania wykonywania jądra, kiedy tylko chcesz z komputera hosta. Jeśli testujesz sprzęt, który ma działającą asynchroniczną pracę, powinno to być tak samo skuteczne, jak inne środki.


Ciekawy sposób Potrzebuje jednak drugiego komputera. Ale spróbuje, jeśli to możliwe.
hypers,

2

Nie wiem, czy to kwalifikuje się jako całkowite zamrożenie, ponieważ kursor myszy nadal porusza się po ekranie, ale interfejs użytkownika systemu Windows 7 przestaje odpowiadać, jeśli wystąpią błędy we / wy urządzenia, a konkretniej awaria dysku twardego. Jednym z moich dysków twardych było zgłaszanie przez SMART nieuchronnej awarii dysku, a system Windows 7 montowałby go, ale zawiesił się, gdy próbowałem uzyskać dostęp do niektórych zapisanych na nim plików. Interfejs użytkownika zostanie zablokowany (z wyjątkiem ruchu kursora myszy) przez maksymalnie 5 minut, aż będzie mógł odczytać plik lub odinstalować dysk po upływie limitu czasu. Nie wiem, czy Windows używa zegara systemowego do przekroczenia limitu czasu, ale może jeśli w jakiś sposób zamrozisz czas, możesz wydłużyć limit czasu? Może to doprowadzi Cię do częściowego rozwiązania, ale nie w 100% szukasz odpowiedzi.


2

Ten błąd zawiesza system Windows dość szybko z powodu wyczerpania zasobów. Łatwe do odtworzenia.

Jak się okazuje, w rzeczywistości jest to błąd w sposobie, w jaki wiersz poleceń (a dokładniej cmd.exe) analizuje pliki wsadowe i może prowadzić do szybkiego ataku typu odmowa usługi; umieszczenie następującego wiersza w pliku wsadowym (bez nowych wierszy) bardzo szybko zużyje ogromne ilości pamięci z powodu tego błędu (na przykład):

^ nul<^

Krótko mówiąc, gdy na końcu pliku znajduje się kursor, rzeczywisty koniec pliku jest „ignorowany”, a uchwyt pliku „resetuje się” do 0 (zasadniczo), aby partia została ponownie przeanalizowana (ad infinitum).


2

Oto kod źródłowy aplikacji, której używam podczas lekcji debugowania. Pokazuje, jak aplikacja w trybie użytkownika może przeprowadzić rodzaj ataku DoS.

Zauważysz, że kursor myszy porusza się bardzo rzadko (raz na jedenaście sekund na moim komputerze). Potencjalnie komputer będzie nadal reagował na przycisk zasilania, jeśli będziesz czekać wystarczająco długo.

Działa przy użyciu nieskończonej pętli i ustawia najwyższy priorytet dla procesu ( 0x100„w czasie rzeczywistym”) i ustawia najwyższy priorytet dla wątków ( 15„krytyczny w czasie”). Uruchomi 8 z nich, co wystarcza na komputerach z systemem i7. Jeśli potrzebujesz więcej, dostosuj pętlę. Więcej z nich potencjalnie bardziej spowolni rzeczy.

#include "stdafx.h"
#include <windows.h>
#include <string>
#include <sstream>
#include <iostream>

void WasteTime()
{
    int priority = 15;
    ::SetThreadPriority(::GetCurrentThread(), priority);
    while (true)
    {
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    ::SetPriorityClass(::GetCurrentProcess(), 0x100);
    for(int i=0; i<7; i++)
    {
        LPDWORD threadid = 0;
        ::CreateThread(NULL, 64*1024, (LPTHREAD_START_ROUTINE)&WasteTime, NULL, 0, threadid);
        ::Sleep(2000);
    }

    WasteTime();

    return 0;
}

Uważaj, że ten program ma niezdefiniowane zachowanie w C ++, więc przy pewnych ustawieniach optymalizacji kompilator mógłby zastąpić całośćExitProcess(0)
Ben Voigt

@BenVoigt W takim przypadku (tj. Z g++) gdyby -O0nie było wystarczająco, może gcc -Q -O0 --help=optimizers | grep enabled (i wyłączenie ręcznej optymalizacji, która przetrwała) może rozwiązać ExitProcess(0)problem?
Hastur

@BenVoigt: czy możesz rozwinąć kwestię, którą część uważasz za zachowanie niezdefiniowane?
Thomas Weller,

@BenVoigt IMHO kompilator może tylko zoptymalizować return 0instrukcję, ponieważ istnieje ona po while(true). Kompilator może dowiedzieć się, że jest to nieosiągalne oświadczenie.
Thomas Weller,

Język C ++ wymaga, aby każdy wątek ostatecznie zrobił postęp, zdefiniowany w kategoriach kilku rodzajów obserwowalnych zachowań. Ponieważ nieskończona pętla nigdy nie robi zauważalnego postępu, kompilator może wywnioskować, że nie został osiągnięty, i usunąć nie tylko ją, ale cały kod nad nią z powrotem do najbliższej gałęzi.
Ben Voigt,

0

Czy wypróbowałeś narzędzie CPUEater dołączone do Process Lasso? Ps. Nie pracuję dla Bitsum.


Myślę, że masz na myśli „Próbowałeś”, a nie „Próbowałeś”. :)
fabspro,

@fabspro Myślę, że „Czy próbowałeś” jest poprawne, ponieważ PO już zaakceptował inną odpowiedź, więc wydarzenie, o którym mówię („rozwiązanie problemu”), miało miejsce w przeszłości, ale prawdopodobnie można powiedzieć, że internet zawsze się dzieje. W każdym razie, jeśli zaproponujesz edycję, chętnie przekażę zadanie przyjęcia jej do kolejki recenzji. Źródło: englishforums.com/English/HaveYouTriedOrDidYouTry/zclxb/...
beppe9000

Sądzę, że gdyby rozwiązał problem, twoje zapytanie mogłoby być komentarzem do jego odpowiedzi - coś w rodzaju „kiedy badałeś swój problem, czy była to jedna z rzeczy, które próbowałeś _______ użyteczność?” może ... po prostu sugeruję rzeczy :)
fabspro,

... touché :)
beppe9000,

huehuehuehuehue
fabspro

-2

Jeśli naprawdę chcesz zawiesić komputer, całkowicie powodując jego zawieszenie , po prostu zużyj całą pamięć RAM i wymuś pamięć strony. To wykracza poza zwykłe zamrażanie i tak naprawdę przeciąża to, że nie można nawet używać Menedżera zadań, nawet klawiatury. Nawet po zakończeniu procesu przywrócenie komputera zajmuje dużo czasu. (To jest najlepsze!)

Możesz na przykład utworzyć klasę ze wskaźnikiem do siebie, a po pewnym czasie utworzyć nową instancję tej klasy na zawsze, przechowując każdą nową instancję we wskaźniku poprzedniej instancji. Być może dodaj do klasy również podwójne lub wektory, aby szybciej zużyć pamięć. Wtedy możesz mieć licznik czasu, który wychodzi z pętli while i wszystko dekonstruuje; oczywiście będziesz musiał trochę poczekać, aż odzyska zdrowie.


-4

Sugerowałbym po prostu utworzenie pliku wsadowego z następującym kodem:

@echo off
:x
start cmd.exe
start explorer.exe
start calc.exe
start notepad.exe
start iexplorer.exe
start paint.exe
goto x

Jest to prawdopodobnie najłatwiejszy i najbezpieczniejszy sposób na zrobienie tego. Możesz zastąpić nazwy procesów dowolnymi aplikacjami systemu Windows.


3
Najprawdopodobniej spowoduje to wyczerpanie pamięci RAM i spowoduje uszkodzenie dysku twardego. W zależności od specyfikacji komputera możliwe jest, że komputer będzie przez to nadal działał, zwłaszcza że 4 z wymienionych programów są dość lekkie ( iexplore.exei może explorer.exemieć większy wpływ). Po prostu automatycznie zabije procesy zapamiętywania pamięci.
MoonRunestar,

-10
  1. Przejdź do C: \ Windows \ Temp \
  2. Naciśnij Ctrl-a, aby wybrać Zaznacz wszystko
  3. Wciśnij Enter

8
Będziesz potrzebował wielu tysięcy przedmiotów, aby była mało skuteczna! Mój folder% TEMP% jest pusty ...
AlainD

6
Chociaż wydaje się, że jest to uzasadniona próba odpowiedzi na pytanie, nie jest całkowicie jasne, w jaki sposób powinno to spowodować zablokowanie systemu Windows zgodnie z żądaniem OP. Proszę edytować swoje pytanie dlaczego to zrobi to, co PO chce.
Twisty Impersonator

9
Szkoda mi nikogo, kto próbował tego i nie zdawał sobie sprawy, że zostały pobite przez pobrane pliki ze złośliwym oprogramowaniem.
MoonRunestar,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.