如何以编程方式崩溃系统

时间:2011-04-29 07:22:06

标签: c++ c operating-system kernel

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

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

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

10 个答案:

答案 0 :(得分:8)

Windows上的

KeBugCheck是获得BSOD的记录方式。

您还可以尝试使用 native NT API在Windows XP中删除 root 注册表项(\REGISTRY)。

答案 1 :(得分:7)

编写并加载调用panic()或实现其等效的内核模块。

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

答案 2 :(得分:6)

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

答案 3 :(得分:4)

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

答案 4 :(得分:3)

在Linux中,Alt-SysRq-C将崩溃/重新启动内核。

在Windows中,请参阅:http://www.dailygyan.com/2008/09/some-methods-to-crash-your-windows.html

答案 5 :(得分:2)

对于Windows,一种可能性是编写内核模式驱动程序,该驱动程序锁定进程拥有的一些内存页,然后终止该进程。将导致BSOD“进程已锁定页面”。

答案 6 :(得分:1)

Linux:即使没有严格地破坏操作系统,你也可以很容易地通过分配大量内存(以及读取/写入分配实际上变得有效并使操作系统交换很多)并通过分叉来使其无法使用进程“Fork bomb”是关键字,甚至可以在shell脚本中完成。

答案 7 :(得分:1)

我认为您想要崩溃操作系统的原因在这里是相关的。您是在尝试模拟测试条件,还是只是好奇?

如果您希望为了容错而重新创建和自动崩溃,这里有两个选项。

  • 运行内部虚拟机(vmware,VirtualBox)并简单地终止虚拟机进程。或者,你可以给它非常低的优先级,丢弃设备,或以其他方式模拟坏事。
  • 使用具有管理控制台的服务器。这将有一个API,可以简单地关闭设备。

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

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

答案 8 :(得分:0)

尝试分配内存块,直到没有可用内存为止:

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,2GB内存和3.3GB交换:屏幕已冻结,我可以分配4950MB内存,但随后该过程被系统杀死,并且linux重新站起来优雅,所以,不,这不起作用:=)

答案 9 :(得分:0)

使用纯用户模式应用程序崩溃操作系统意味着内核容易受到攻击。 如果操作系统经过充分测试,则不应发生这种情况。

您可以通过向他们发送垃圾IO-CONTROL来攻击错误的第三方驱动程序来尝试BSoD Windows。

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