如何以编程方式使系统崩溃

How to crash a system programmatically

本文关键字:系统 崩溃 方式使 编程      更新时间:2023-10-16

如果我可以编写一个用户程序,使我的操作系统(不是我的应用程序)崩溃,我该怎么做?

我正在考虑以某种方式将我的用户模式程序切换到内核模式并导致内存损坏。这可能吗?

注意:我没有创建病毒。只是好奇心。

在Windows上KeBugCheck是获得BSOD的文档方式。

您也可以尝试在Windows XP中使用本地 NT API删除注册表项(REGISTRY)。

编写并加载调用panic()的内核模块或实现与之等价的内核模块

或者直接执行shutdown或halt命令或实现它的系统调用。

如果操作系统恰好是windows,创建一个假驱动程序去引用NULL指针。崩溃!

操作系统的全部思想是用户程序在正常情况下不会使其崩溃。当然,你仍然可以做一些事情,比如耗尽用于交换文件的分区上的磁盘空间,这将损害许多操作系统,或者你可能会发现一个已知的漏洞,但没有非常简单的方法来可靠地崩溃它。

在Linux中,Alt-SysRq-C会使内核崩溃或重新启动。

在Windows中,请参见:https://web.archive.org/web/20110513143420/http://www.dailygyan.com/2008/09/some-methods-to-crash-your-windows.html[编辑:2021年3月8日-由于网站宕机,切换到Archive.org链接]

对于Windows,一种可能性是编写一个内核模式驱动程序来锁定进程拥有的一些内存页,然后终止该进程。会导致BSOD "Process has locked pages"

Linux:即使没有严格地使操作系统崩溃,您也可以很容易地通过分配大量内存(并通过读写内存使分配变得有效并使操作系统大量交换)和分叉大量进程使其无法使用。"Fork bomb"是关键字,甚至可以在shell脚本中完成。

我认为你想让操作系统崩溃的原因与此相关。你是想模拟测试的条件,还是只是好奇?

如果您希望重新创建和自动化崩溃,以实现容错,这里有两个选项。

  • 在虚拟机(vmware, VirtualBox)内运行,并简单地杀死虚拟机进程。或者你可以给它很低的优先级,丢弃设备,或者模拟不好的东西。
  • 使用具有管理控制台的服务器。这将有一个API可以简单地关闭设备。

如果您希望从操作系统内部崩溃,那么其他许多建议都是不错的。这些软件崩溃可以帮助重现一个错误的进程。类似的一组硬件相关的崩溃也可能起作用(例如降低可编程风扇的速度和CPU过热)。

请求背后的原因实际上非常重要,因为所有不同的错误都会产生略有不同的结果。

尝试分配内存块,直到没有空闲内存:

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 MBn", alloced);
    }
}

编辑:我实际上刚刚在64位linux上尝试了2GB内存和3.3GB交换空间:屏幕已经冻结,我可以分配4950MB内存,但随后该进程被系统杀死,linux优雅地重新站起来,所以,不,这不起作用:=)

使用纯用户模式应用程序使操作系统崩溃意味着内核是脆弱的。如果操作系统经过了良好的测试,那么这种情况应该不会发生。

你可以通过发送垃圾io控制来攻击有问题的第三方驱动程序来尝试BSoD Windows。

DeviceIoControl功能(Windows)http://msdn.microsoft.com/en-us/library/aa363216 (VS.85) . aspx