Как я могу спровоцировать зависание Windows (зависание)?

180

Мне нужно проверить поведение оборудования в случае, если Windows сильно зависает / зависает (например, зависший экран, нет мигания светодиодов, нет реакции на вводы, включая Ctrl + Alt + Del и т. Д.). Чтобы провести достаточно экспериментов за достаточно короткое время, мне нужно инициировать эти зависания либо программно, либо иным образом.

В частности, меня интересует Windows 10, но любой способ работы с другими версиями приветствуется.

Каждый поиск, который я проводил по этой теме, не удивительно приводит меня к обсуждению того, как устранить эти ситуации, а не провоцировать их. Так что вопрос может показаться достаточно странным.

Обратная связь: Я перепробовал многие рецепты, предлагаемые в ответах и ​​комментариях. Прежде всего, меня не интересовали сбои, которые приводят к BSoD (именно поэтому я описал замораживание, а не сбой).

Должен признаться, что 64-битная Windows 10 показала хорошую устойчивость ко многим способам. Он неплохо справляется практически с любым методом загрузки процессора (включая форк-бомбу , петли и т. Д.). Методы, которые вызывают немедленные ошибки (большинство методов зависания NotMyFault) обрабатываются ОС с перезагрузкой или выключением (что я не преследовал). Наилучшие результаты были достигнуты путем утечке памяти методов NotMyFault - реальное замораживание без возможности перезагрузки.

Наконец, я был впечатлен количеством документации Microsoft, в которой говорится о заморозке Windows. Похоже, они знают эту часть намного лучше, чем противоположность (борьба с замораживанием) ;-)

гиперэкстензии
источник
Комментарии не для расширенного обсуждения; этот разговор был перенесен в чат .
DavidPostill
3
Есть расчет, который вы могли бы сделать, используя калькулятор, который замораживает ядро ​​на процессоре до его завершения. На четырехъядерном компьютере вы бы сделали это четыре раза. Но я не могу на всю жизнь вспомнить математическое уравнение, которое его вызывает.
mickburkejnr
6
@mickburkejnr Это факториал 100000. Переключитесь на «Scientific View», наберите 100000 и нажмите «n!». Это хорошо работало на старых версиях Windows. В настоящее время вы получите предупреждение, что этот расчет может занять много времени, и вы можете отменить его.
Дуэнни
25
Просто начни его использовать.
Самази
5
Установка обновлений у меня всегда работала.
Даниэль Р Хикс

Ответы:

230

Может быть, это может помочь: принудительное падение системы с клавиатуры

На USB-клавиатурах необходимо включить сбой, вызванный клавиатурой, в реестре. В разделе реестра HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Services \ kbdhid \ Parameters создайте значение с именем CrashOnCtrlScroll и установите для него значение REG_DWORD, равное 0x01.

Вы должны перезагрузить систему, чтобы эти настройки вступили в силу.

После этого сбой клавиатуры можно инициировать с помощью следующей последовательности горячих клавиш: Удерживая крайнюю правую клавишу CTRL, дважды нажмите клавишу SCROLL LOCK.

Или вы можете запустить вилочную бомбу: посмотрите этот ТАК вопрос

Также есть NotMyFault

Notmyfault - это инструмент, который вы можете использовать для сбоя, зависания и утечки памяти ядра в вашей системе Windows. Это полезно для изучения того, как выявлять и диагностировать драйвер устройства и проблемы с оборудованием, и вы также можете использовать его для генерации файлов дампа синего экрана в плохо функционирующих системах.

duenni
источник
9
Пробовал ForkBomb и NotMyFault. Один из методов утечки, кажется, делает то, что я хочу. Другие бесполезны, поскольку они приводят к перезагрузке / выключению, а не замораживанию. Большое спасибо.
Hyper
6
CtrlScroll приносит вам BSOD. Зависит ли система отладки или просто перезагружается, зависит от настроек загрузки.
grawity
51
Aaannnddd duenni никогда не разрешается рядом с моими компьютерами. Когда-либо.
CorsiKa
25

Похоже, вы тестируете реакцию внешнего устройства на то, что ОС перестает отвечать на запросы.

Если ваше оборудование может быть подключено к виртуализированной установке Windows, вы можете приостановить и возобновить работу виртуальной машины столько раз, сколько захотите. Установите желаемую ОС в среде VirtualBox (или другой виртуализации десктопов), предоставьте доступ к любому используемому аппаратному интерфейсу (USB, Ethernet или любой другой) для виртуальной машины.

Затем вы можете приостановить и возобновить работу виртуальной машины по своему желанию.

барбекю
источник
24

По крайней мере, в более старой версии Windows (несколько лет назад) работало следующее:

Я написал программу на C с бесконечным циклом:

while(1) {}

... затем я дал этой программе "приоритет в реальном времени" в диспетчере задач (есть также API, который может сделать это).

В многоядерной системе мне нужно делать это несколько раз, чтобы на каждом ядре работал один цикл ...

Мартин Розенау
источник
39
Для того, чтобы нагреть ваш процессор меньше, делая это: положить _mm_pause()из #include <immintrin.h>в петле. Это аппаратная инструкция процессора, а не системный вызов "сна"; Что касается ОС, то ваш процесс неотличим от SuperPI; разница только в том, сколько энергии потребляет процессор во время работы цикла.
Питер Кордес
5
Я не уверен, останавливает ли это работу частей окна в режиме ядра.
CodesInChaos
2
@CodesInChaos: большинство потоков ядра работают с обычным приоритетом. Один из них на процессор и ядро ​​тоже почти готов.
Иисус Навин
Еще один прием, включающий сборку x86 ( STI+ HLT): stackoverflow.com/questions/3747847/…
meklarian
3
@meklarian: Должно быть CLI; HLT. Предположительно, вы должны сделать это из привилегированного режима. В принципе, он все еще может быть спасен NMI или подобным.
Нейт Элдридж
10

Самое сильное зависание ядра (то есть отсутствие отслеживания мыши и т. Д.) - это когда код переходит в бесконечный цикл в режиме ядра с отключенными прерываниями.

Этого можно добиться с помощью драйвера устройства, и, что еще лучше, вы можете написать драйвер так, чтобы он запускался и останавливал зависание под вашим контролем (предполагая, что бесконечный цикл проверяет состояние, которым вы управляете).

Как написать и установить этот драйвер, было бы темой другого или трех вопросов, но я бы выбрал этот подход.

Дилан МакНами
источник
9

Пожалуйста, проверьте следующий вопрос на StackOverflow, который похож на ваш: Как заставить Windows зависнуть на короткий промежуток времени

Дело в том, что нет способа (надежно) сделать это.

Вместо того, чтобы зависать или заставлять Windows зависать, возможно, вы можете просто прервать связь с вашим оборудованием.

Я понятия не имею, какое у вас оборудование и как вы его подключаете. Например, если это адаптер USB или Ethernet, вы можете легко отключить его в диспетчере устройств или отключить? Если вы принудительно сломаете или повесите систему, вы можете повредить ее различными способами, поэтому будьте осторожны с тем, что вы делаете.

Ralf
источник
1
Я рассмотрю физическое отключение оборудования, если я не удовлетворен результатами программного обеспечения. Благодарю.
Hyper
5

Режим отладки ядра не вариант?

Я установил его в Windows 7, и в связанных инструкциях в этом ответе указан XP или более поздняя версия, поэтому он должен работать с Windows 10.

Я настроил его на FireWire / 1394 , так как, на мой взгляд, он самый простой. Но вы также можете сделать это по сети или через USBмногое другое ).

В основном,

Настройте целевой компьютер, выполнив эти команды в режиме с повышенными привилегиями (выбирая канал n):

bcdedit /debug on
bcdedit /dbgsettings 1394 channel:n

Это то же самое, что перейти на вкладку загрузки msconfigи нажать кнопку «Дополнительно»:

введите описание изображения здесь

введите описание изображения здесь

Затем (после перезагрузки целевого компьютера) запустите WinDbg на главном компьютере, используя ту же битность WinDbg целевого компьютера.

Тогда нужно просто приостановить выполнение ядра, когда вы захотите с хост-компьютера. Если на тестируемом оборудовании выполняется какая-то асинхронная операция, она должна быть такой же эффективной, как и другие средства.

Ник
источник
Интересный способ. Требуется второй ПК, хотя. Но постараюсь, когда это возможно.
Hyper
2

Я не знаю, считается ли это полной остановкой, потому что курсор мыши все еще движется на экране, но пользовательский интерфейс Windows 7 перестает отвечать на запросы, если у вас есть ошибки ввода-вывода устройства, в частности, сбой жесткого диска. Один из моих жестких дисков - самоотчет о неминуемой неисправности диска через SMART, и Windows 7 будет его монтировать, но зависает всякий раз, когда я пытаюсь получить доступ к определенным файлам, сохраненным на нем. Пользовательский интерфейс блокируется (за исключением движения курсора мыши) на срок до 5 минут, пока он не сможет прочитать файл или отключить диск после истечения времени ожидания. Я не знаю, использует ли Windows системные часы для тайм-аута, но, может быть, если вы как-то заморозите время, вы можете увеличить продолжительность тайм-аута? Может быть, это поможет вам частично, но не 100% ответ, который вы ищете.

помешан
источник
2

Эта ошибка довольно быстро замораживает Windows из-за истощения ресурсов. Легко воспроизвести тоже.

Как оказалось, это на самом деле ошибка в том, как командная строка (более конкретно cmd.exe) анализирует командные файлы и может привести к быстрому отказу в атаке типа сервиса; размещение следующей строки в пакетном файле (без новых строк) очень быстро израсходует огромные объемы памяти из-за этой ошибки (в качестве примера):

^ nul<^

Короче говоря, когда каретка находится в конце файла, фактический конец файла «игнорируется», а дескриптор файла «сбрасывается» в 0 (по существу), так что пакет анализируется снова (до бесконечности).

beatcracker
источник
2

Вот исходный код приложения, которое я использую на уроках отладки. Он показывает, как приложение в пользовательском режиме может выполнять своего рода DoS-атаку.

Вы заметите, что ваш курсор мыши перемещается очень редко (один раз каждые одиннадцать секунд на моем компьютере). Потенциально ваш компьютер все равно будет реагировать на кнопку питания, если вы будете ждать достаточно долго.

Он работает, используя бесконечный цикл и устанавливая наивысший приоритет для процесса ( 0x100«в реальном времени») и устанавливая наивысший приоритет для потоков ( 15«критичный ко времени»). Запустится 8 из них, чего достаточно для компьютеров i7. Если вам нужно больше, адаптируйте цикл. Больше из них потенциально замедлит вещи больше.

#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;
}
Томас Веллер
источник
ExitProcess(0)
Ben Voigt
@BenVoigt В этом случае (то есть с g++), если -O0этого недостаточно, может быть gcc -Q -O0 --help=optimizers | grep enabled (и отключение выжившей оптимизации руками) может быть решить ExitProcess(0)проблему?
Хастур
@BenVoigt: не могли бы вы уточнить, какую часть вы считаете неопределенным поведением?
Томас Веллер
@BenVoigt ИМХО компилятор может только оптимизировать return 0оператор, потому что он существует после while(true). Компилятор может узнать, что это недостижимое утверждение.
Томас Веллер
Язык C ++ требует, чтобы каждый поток в конечном итоге делал успехи, определенные в терминах нескольких типов наблюдаемого поведения. Поскольку бесконечный цикл никогда не делает заметного прогресса, компилятор может сделать вывод, что он не достигнут, и удалить не только его, но и весь код над ним обратно в ближайшую ветвь.
Бен Фойгт
0

Вы пробовали утилиту CPUEater, входящую в комплект поставки Process Lasso? Ps. Я не работаю на битум.

beppe9000
источник
Я думаю, что вы имеете в виду «Ты пробовал», а не «Ты пробовал». :)
fabspro
@fabspro Я думаю, что «Вы пытались» правильно, потому что ФП уже принял другой ответ, поэтому событие, на которое я ссылаюсь («решение проблемы»), прошло, но, вероятно, можно сказать, что Интернет всегда происходит. В любом случае, если вы предложите редактирование, я с удовольствием передам задачу принятия его в очередь на проверку. Источник: englishforums.com/English/HaveYouTriedOrDidYouTry/zclxb/…
beppe9000
Я думаю, если бы он решил проблему, ваш запрос мог бы стать комментарием к его ответу - что-то вроде «когда вы исследовали свою проблему, была ли одна из вещей, которую вы пробовали _______ полезна?» возможно ... просто предлагая вещи :)
fabspro
... touché :)
beppe9000
huehuehuehuehue
fabspro
-2

Если вы действительно хотите , чтобы повесить ваш компьютер, полностью , заставляя его просто заморозить , просто использовать все его памяти и заставить его страницы памяти. Это будет выходить за рамки простого замораживания и просто перегрузить объект, так что вы даже не сможете использовать диспетчер задач, даже с клавиатуры. Даже после завершения процесса восстановление ПК займет много времени. (Это лучшее!)

Например, вы можете создать класс с указателем на себя и в цикле while создать новый экземпляр этого класса навсегда, сохраняя каждый новый экземпляр в указателе предыдущего экземпляра. Возможно, добавьте в класс несколько двойников или векторов, чтобы быстрее использовать память. Тогда у вас может быть таймер, который выходит из цикла while и деконструирует все; конечно, вам придется немного подождать, пока он восстановится.

Андрей
источник
-4

Я бы предложил просто создать командный файл со следующим кодом:

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

Это, наверное, самый простой и безопасный способ сделать это. Вы можете заменить имена процессов на любые приложения Windows.

слизистый
источник
3
Это, скорее всего, просто исчерпает ОЗУ и приведет к перегрузке жесткого диска. В зависимости от характеристик вашего компьютера, возможно, что компьютер продолжит работать через это, тем более что 4 из перечисленных программ довольно легковесны ( iexplore.exeи, возможно, explorer.exeокажут большее влияние). Это просто уничтожит процессы захвата памяти автоматически.
MoonRunestar
-10
  1. Перейдите в C: \ Windows \ Temp \
  2. Нажмите Ctrl-a для выбора всех
  3. Нажмите Enter
asrhargar
источник
8
Вам понадобится много тысяч предметов, чтобы это было хоть сколько-нибудь эффективным! Моя папка% TEMP% пуста ...
AlainD
6
Хотя это кажется законной попыткой ответить на вопрос, совершенно неясно, как именно это должно привести к блокировке Windows в соответствии с запросом OP. Пожалуйста, измените ваш вопрос, чтобы объяснить, почему это будет делать то, что хочет ОП.
Twisty Impersonator
9
Мне было бы жаль тех, кто попробовал это и не осознавал, что они пострадали от загрузок с вредоносного программного обеспечения.
MoonRunestar