Ответ 1
KeBugCheck в Windows - это документированный способ получить BSOD.
Вы также можете попробовать удалить корневой раздел реестра (\REGISTRY
) в Windows XP, используя собственный NT API.
Если бы я мог написать пользовательскую программу, которая разбила бы мою ОС (не мое приложение), как бы я это сделал?
Я думал, как-то переключить мою программу usermode в режим ядра и вызвать повреждение памяти. Возможно ли это?
Примечание. Я не создаю вирус. Просто любопытство.
KeBugCheck в Windows - это документированный способ получить BSOD.
Вы также можете попробовать удалить корневой раздел реестра (\REGISTRY
) в Windows XP, используя собственный NT API.
Запишите и загрузите модуль ядра, который вызывает panic() или реализует его эквивалент.
Или просто выполните команду shutdown или halt или syscall, которая ее реализует.
Если ОС - это окна, создайте поддельный драйвер, который разыскивает указатель NULL. Крах!
Вся идея операционной системы заключается в том, что пользовательская программа не может сбой при нормальных условиях. Конечно, вы все равно можете сделать что-то вроде исчерпания дискового пространства на разделе, который используется для файла подкачки, что может повредить многие операционные системы, или вы можете найти известную уязвимость, но нет очень простого способа надежно свернуть ее.
В Linux Alt-SysRq-C приведет к сбою/перезапуску вашего ядра.
В Windows см. http://www.dailygyan.com/2008/09/some-methods-to-crash-your-windows.html
Для Windows одна возможность - написать драйвер режима ядра, который блокирует некоторые страницы памяти, принадлежащие процессу, а затем завершает этот процесс. В результате BSOD "Процесс заблокировал страницы".
Linux: несмотря на то, что вы не просто сбой операционной системы, вы можете легко сделать ее непригодной, выделив много памяти (и прочитав/записав ее для того, чтобы распределение действительно стало эффективным и значительно изменило ОС) и путем разворачивания лотов процессов. "Вилка-бомба" - это ключевое слово и может быть выполнена даже в оболочке script.
Попробуйте выделить куски памяти, пока у вас не будет свободной памяти:
int alloced = 0;
for(;;)
{
char *alloc = malloc(10*1024*1024); // alloc 10 MB
if(alloc != NULL)
{
alloced += 10;
// edit: you have to memset the memory otherwise the system will give it back to you next time
memset(alloc, 0xab, 10*1024*1024);
printf(" alloced %d MB\n", alloced);
}
}
изменить: Я на самом деле пробовал прямо сейчас на 64-битном Linux с 2 ГБ оперативной памяти и 3,3 ГБ свопа: экран заморозился, я мог выделить 4950 МБ оперативной памяти, но затем процесс был убит системой, а Linux упал на ноги изящно, так, нет, это не работает: =)
Я думаю, что причина, по которой вы хотите сбой ОС, здесь важна. Вы пытаетесь имитировать условие для тестирования, или вам просто интересно?
Вот два варианта, если вы хотите воссоздать и автоматизировать сбой с целью отказоустойчивости.
Другие многочисленные предложения хороши, если вы хотите сбой в самой ОС. Эти сбои программного обеспечения могут помочь воспроизвести злоумышленный процесс. Аналогичный набор аппаратных сбоев может также работать (например, снижение скорости на программируемом вентиле и перегрев процессора).
Причина вашего запроса на самом деле очень важна, поскольку все различные ошибки приведут к немного другому результату.
Сбой операционной системы с использованием чистого пользовательского режима означает, что ядро уязвимо. Если ОС хорошо протестирована, это не должно происходить.
Вы можете попробовать BSoD Windows, атакуя жестких сторонних драйверов, отправив им мусорные IO-CONTROL.
Функция DeviceIoControl (Windows) http://msdn.microsoft.com/en-us/library/aa363216(VS.85).aspx
В окнах вы можете обратиться к программе "Notmyfault" и ее исходным кодам. http://blogs.technet.com/b/markrussinovich/archive/2005/08/17/unkillable-processes.aspx