系统蓝屏的几种姿势,确定不了解下么?

前言

在 蓝屏(BSOD)转储设置,看本文就够了!这篇文章里比较详细的介绍了蓝屏转储设置。做好设置后,我们就可以在需要的时候使系统蓝屏了。本文介绍几种使系统蓝屏的办法,当然肯定还有其它办法,如果哪位小伙伴儿知道比较实用的方法,欢迎留言分享。

几种蓝屏方法

1. 通过驱动

思路是:在内核执行有问题的代码(比如,在驱动的入口处加上简单的 int* p = 0; *p = 0; ,然后加载有问题的驱动即可)。sysinternals 系列工具中的 NotMyFault 就是加载驱动,然后在驱动中模拟各种非法操作来使系统蓝屏的。


我们可以点击 Colors... 按钮,来看看其它颜色的 “蓝屏” 效果。可以通过 Hang 让系统挂起,也可以通过 Leak 模拟内核级内存泄漏。

我们还可以在命令行执行 notMyfault.exe /crash 来直接使系统蓝屏。如果我们想指定崩溃类型,可以使用 NotMyFault 的命令行版本 —— notmyfaultc.exe。具体选项大家可以直接运行 notmyfaultc.exe 查看或者参考下图:

2. 杀死系统关键进程

如果系统关键进程挂掉了(比如,csrss.exe),那么系统也会蓝屏。


win7 系统中,具有管理员权限的进程可以杀死 csrss 进程,但是在 win10 中不能简单粗暴的杀死 csrss 进程了。

win10 变通方法:我们可以把其它进程设置为系统关键进程,然后杀掉。或者伪装成系统关键进程,然后自动退出。感谢 https://bytecode77.com/hacking/payloads/bsod

int _tmain(int argc, _TCHAR* argv[])
{typedef NTSTATUS (*pfnRtlSetProcessIsCritical) (BOOLEAN, PBOOLEAN, BOOLEAN); // __cdecltypedef BOOL(WINAPI * pfnRtlAdjustPrivilege) (ULONG, BOOL, BOOL, PBOOLEAN);auto ntdll = ::LoadLibrary(TEXT("ntdll.dll"));auto RtlAdjustPrivilege = (pfnRtlAdjustPrivilege)GetProcAddress((HINSTANCE)ntdll, "RtlAdjustPrivilege");auto RtlSetProcessIsCritical = (pfnRtlSetProcessIsCritical)GetProcAddress((HINSTANCE)ntdll, "RtlSetProcessIsCritical");BOOLEAN e = 0;RtlAdjustPrivilege(20, 1, 0, &e);RtlSetProcessIsCritical(1, 0, 0);return 0;
}

效果如下:

win10 关键进程结束导致蓝屏

3. 使用快捷键

如果系统由于某些原因挂起了,我们没办法杀死系统关键进程,也不能运行 NotMyFault 了。这时候我们还可以通过快捷键来使系统蓝屏!不过我们需要预先做一些设置才行。把下面的代码保存到 .reg 文件,然后双击导入注册表,重启生效

Windows Registry Editor Version 5.00;------------------------------------------------------------------------------
; enable BSOD by right CTRL + SCROLL + SCROLL
;------------------------------------------------------------------------------
; For PS/2 keyboards
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters]
"CrashOnCtrlScroll"=dword:00000001; For USB keyboards
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\kbdhid\Parameters]
"CrashOnCtrlScroll"=dword:00000001; For Hyper-V keyboards (BCN:I never use this, copy it from document)
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\hyperkbd\Parameters]
"CrashOnCtrlScroll"=dword:00000001

重启后,按住右侧Ctrl 键,然后按两下 SCROLL LOCK 键就可以使系统蓝屏了。这个方法在极少数的情况下会失效。比如,系统挂起在更高的中断请求级别(IRQL),没办法处理按键。不过,我们应该没那么点儿背。正如微软官方文档介绍的那样,有时候即使 CTRL + ALT + DELETE 不响应了,RCTRL + SCROLL + SCROLL 还能工作。

如果键盘上没有 Scroll Lock 键,怎么办?

4. 使用自定义快捷键

也许有的小伙伴使用的笔记本电脑的键盘上没有 Scroll Lock 键,该怎么办呢?Windows 已经考虑到了这种情况,允许我们自定义蓝屏快捷键。具体设置可以参考 微软官方文档 —— Forcing a System Crash from the Keyboard[1] 。保存下面的代码到 .reg 文件,双击导入注册表,重启生效

Windows Registry Editor Version 5.00;------------------------------------------------------------------------------
; enable BSOD by custom key, mutually exclusive with CrashOnCtrlScroll setting
; Dump1Keys: 20 stands for LEFT CTRL
; Dump2Key:  HEXadecimal INDEX in keyToScanTbl[134]
;            01 stands for `/~ key (left of 1/! key)
;            3d stands for space key.
;            1f stands for A key. but after test, ctrl + a will not work.
;            WARNING: not sure this works for all keyboards, try your luck :)
;------------------------------------------------------------------------------; For PS/2 keyboards
; disable CrashOnCtrlScroll first
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters]
"CrashOnCtrlScroll"=-; setup custom key
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\crashdump]
"Dump1Keys"=dword:00000020
"Dump2Key"=dword:00000001; For USB keyboards
; disable CrashOnCtrlScroll first
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\kbdhid\Parameters]
"CrashOnCtrlScroll"=-; setup custom key
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\kbdhid\crashdump]
"Dump1Keys"=dword:00000020
"Dump2Key"=dword:00000001; For Hyper-V keyboards (BCN:I never use this, reference above setting)
; disable CrashOnCtrlScroll first
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\hyperkbd\Parameters]
"CrashOnCtrlScroll"=-
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\hyperkbd\crashdump]
"Dump1Keys"=dword:00000020
"Dump2Key"=dword:00000001

重启后,按住左侧Ctrl 键,然后连续按两下 ` 键就可以使系统蓝屏了。注意:一定要连续按两下! 按一下是不行的。

想要正确设置自定义蓝屏快捷键,不是一件容易的事。需要了解以下几点:

1. 使用自定义快捷键需要先关闭 CrashOnCtrlScroll 设置,上面的代码已经做好了。因为不同类型的键盘对应的注册表位置不一样,怎么知道自己的机器上的键盘是哪种类型的?

2. 我们可以打开设备管理器,查看当前机器上的键盘信息。


我们可以用如下方法打开 设备管理器

  • win10 系统中,可以直接在搜索框(或者按一下 windows 键)输入 设备管理器 搜索打开。

  • win10 系统中,按 Windows + x 快捷键,在弹出的系统菜单里点击 设备管理器(M) 打开。

  • 输入 devmgmt.msc 打开。

  • 通过控制面版打开(不同系统中可能不一样)。

  • 还有很多其它方法,不一一列举了。

3. Dump1Keys 的值可以是组合值,比如,0x70 表示同时按下左侧的 ALT + CTRL + SHIFT。每一项的意义请参考下表(摘自微软官方文档):

意义
0x01Rightmost SHIFT key
0x02Rightmost CTRL key
0x04Rightmost ALT key
0x10Leftmost SHIFT key
0x20Leftmost CTRL key
0x40Leftmost ALT key

4. Dump2Key 是按键的扫描码在数组 keyToScanTbl[134] 中的索引值keyToScanTbl[134]的定义如下(摘自微软官方文档):

const UCHAR keyToScanTbl[134] = {0x00,0x29,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x7D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x00,0x3A,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x2B,0x1C,0x2A,0x00,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x73,0x36,0x1D,0x00,0x38,0x39,0xB8,0x00,0x9D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD2,0xD3,0x00,0x00,0xCB,0xC7,0xCF,0x00,0xC8,0xD0,0xC9,0xD1,0x00,0x00,0xCD,0x45,0x47,0x4B,0x4F,0x00,0xB5,0x48,0x4C,0x50,0x52,0x37,0x49,0x4D,0x51,0x53,0x4A,0x4E,0x00,0x9C,0x00,0x01,0x00,0x3B,0x3C,0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x57,0x58,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x7B,0x79,0x70 };

上面的例子中,` 键的扫描码是 0x29,在keyToScanTbl[134]的索引是 1 。

5. 关于扫描码,按下和抬起按键时会产生不同的扫描码,我们需要关注的是按下时对应的扫描码。同时,不同的键盘可能有不同的扫描码。下面给出 101/102键 键盘(PC/AT 和 PS/2) 的扫描码。

101/102键 键盘(PC/AT 和 PS/2)图,摘自Defrag-Tools-179

6. 我们参考相关文档的时候需要注意:按下按键对应的术语是(Make),抬起按键对应的术语是(Break)。下面贴一张扫描码表的部分截图:

表格最后的说明非常重要:

高亮部分的意思是:操作系统的其它部分和所有的应用程序按 Scan Code Set 1 里的值处理扫描码。所以我猜测微软官方文档里的 keyToScanTbl[134] 的值是按照 Scan Code Set 1 给出的。实在没精力调查的更清楚了,如果哪位小伙伴儿熟悉相关内容,请务必指点!
我特意录制了使用自定义快捷键 CTRL + ` + ` 触发蓝屏的过程。按一次 ` 是不行的,一定要按两次

使用 CTRL + ` + ` 手动蓝屏

5. 借助硬件

如果以上方法都行不通,还可以使用 PCI Express Dump Switch Card 使系统蓝屏。Windows 7, Windows Server 2008 R2 及更早的系统需要设置如下注册表项:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CrashControl]
"NMICrashDump"=dword:00000001

6. 内核调试器

如果已经用内核调试器附加到目标系统了,我们可以直接使用 .dump 命令保存转储文件,没必要使系统蓝屏再保存转储文件。当然,如果我们喜欢,也可以使用 .crash 命令使系统蓝屏,如果执行完该命令后,系统没蓝屏,请执行 g 命令。说明:如果当前正在执行 bug check处理函数,不要使用 .crash 命令。

7. 其它

  • 利用 NtRaiseHardError,参考 github 上的 Invoke-BSOD 项目[2]

  • 利用系统漏洞。这方面我不擅长,欢迎搞安全的小伙伴儿分享。

蓝屏转储一瞥

通过杀死系统关键进程导致的蓝屏,对应的 Bug Check Code0xF4(CRITICAL_OBJECT_TERMINATION)

通过 NMI 导致的蓝屏,对应的 Bug Check Code0x80(NMI_HARDWARE_FAILURE),表示这个蓝屏是由于硬件错误触发的。

通过系统快捷键导致的蓝屏,对应的 Bug Check Code0xe2(MANUALLY_INITIATED_CRASH),表示这个蓝屏是用户手动触发的。

我们可以用 !analyze -show 来查看转储文件中的 bug check code 信息。

windbg !analyze -show & k

从输出结果可知,这个蓝屏是用户手动触发蓝屏产生的。从调用栈可知,是 i8042prt.sys 处理了我们的按键,从而导致的蓝屏。

友情提示:

如果直接用 windbg 打开 %SystemRoot%\MEMORY.DMP 会提示权限不够。可以以管理员权限运行 windbg 后再打开。或者拷贝转储文件到其它目录后再打开即可。注意一定是拷贝,而不是剪切

windbg 打开 MEMORY.dmp 失败

总结

  • 特殊情况下,我们可能会主动使系统蓝屏来保存一份转储文件,供我们事后分析。

  • 我们可以通过本文介绍的几种方法来使系统蓝屏。我个人偏向使用 NotMyFault 或者蓝屏快捷键使系统蓝屏。

  • 使用自定义的蓝屏快捷键的时候,需要关闭 CrashOnCtrlScroll 设置。

  • Dump1Keys 的值可以是组合值,比如,0x70 表示同时按下左侧的 ALT + CTRL + SHIFT

  • Dump2Key 的值是对应按键的扫描码在数组 keyToScanTbl[134] 中的索引值,而且是 16 进制的。

  • 需要连续按两次设置的按键才能蓝屏!比如,我们需要按 CTRL + ` + `,而不是 CTRL + `

  • 尽量不要设置已经被占用的快捷键。我尝试使用 CTRL + A + A 作为快捷键,但是不能触发蓝屏,猜测是因为 CTRL + A 被占用了。但是 ALT + CTRL+ SHIFT + A + A 是可以的。

  • windbg 中通过 !analyze -show 可以查看转储文件中的 bug check code 信息。

  • 对于手动蓝屏得到的转储文件,使用 !analyze -v 不能得到更多有效的信息,我们需要分析转储文件中的其它信息。

  • %SystemRoot%\MEMORY.DMP 需要管理员权限才能打开,可以拷贝(而不是剪切)到其它目录,就可以正常打开了。

参考资料

  • https://channel9.msdn.com/Shows/Defrag-Tools/Defrag-Tools-179-Manually-Forcing-a-Crash-Dump

  • https://support.microsoft.com/en-us/help/2750146/nmi-hardware-failure-error-when-an-nmi-is-triggered-on-windows-8-and-w "NMI_HARDWARE_FAILURE error when an NMI is triggered on Windows 8 and Windows Server 2012"

  • https://docs.microsoft.com/en-us/windows/client-management/generate-kernel-or-complete-crash-dump#use-nmi

  • https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/forcing-a-system-crash-from-the-debugger

  • https://www.scs.stanford.edu/10wi-cs140/pintos/specs/kbd/scancodes-9.html

  • https://codertw.com/%E4%BC%BA%E6%9C%8D%E5%99%A8/135227/

  • http://advdbg.org/forums/3067/PrintPost.aspx

  • https://en.wikipedia.org/wiki/Scancode

  • https://en.wikipedia.org/wiki/Keyboard_layout

  • http://www.philipstorr.id.au/pcbook/book3/scancode.htm

  • https://www.scs.stanford.edu/10wi-cs140/pintos/specs/kbd/scancodes-9.html

  • http://www.geoffchappell.com/studies/windows/win32/ntdll/api/rtl/peb/setprocessiscritical.htm

References:

[1]

微软官方文档 —— Forcing a System Crash from the Keyboard: https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/forcing-a-system-crash-from-the-keyboard

[2]

github 上的 Invoke-BSOD 项目: https://github.com/peewpw/Invoke-BSOD/blob/master/Invoke-BSOD.ps1

猜你喜欢:

转储文件系列:

转储文件知多少

你需要知道的 N 种抓取 dump 的工具

你生成的转储文件有问题吗?

向大厂看齐!为自己的程序增加自动转储的功能!

内核转储,开抓啦!

蓝屏(BSOD)转储设置,看本文就够了!

调试系列:

调试实战——你知道怎么使用DebugView查看调试信息吗?

调试实战——程序CPU占用率飙升,你知道如何快速定位吗?

调试实战——崩溃在ComFriendlyWaitMtaThreadProc

调试实战——使用windbg调试崩溃在ole32!CStdMarshal::DisconnectSrvIPIDs

调试实战——调试PInvoke导致的内存破坏

调试实战——调试excel启动时死锁

调试实战——调试DLL卸载时的死锁

调试实战——调试TerminateThread导致的死锁

排错系列:

排错实战——VS清空最近打开的工程记录

排错实战——拯救加载调试符号失败的IDA

排错实战——你知道拖动窗口时只显示虚框怎么设置吗?

排错实战——解决Tekla通过.tsep安装插件失败的问题

排错实战——使用process explorer替换任务管理器

排错实战——通过对比分析sysinternals事件修复程序功能异常

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/311475.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最长公共子串-dp

题目: 给定两个字符串,求出它们之间最长的相同子字符串的长度。 公共子串和公共子序列不同,公共子序列不要求连续,但公共子串必须是连续的。如: A “helloworld” B “loop” A和B的最长公共子序列是"loo",但最长公共子串是&quo…

智能对话引擎:两天快速打造疫情问答机器人

01微软AI技术开源知识库疫情机器人近一个月来,“新冠肺炎疫情”成了所有人的热点话题,抗击疫情的战役在全国紧张有序地进行着。随着全国各地的企业陆续复工,怎样防范、保护自己和家人成了当下每个人的焦点。为了配合奋战在一线的医护人员打赢…

数码管

题目背景 小明的单片机上面的LED显示屏坏掉了,于是他请你来为他修显示屏。 屏幕上可以显示0~9的数字,其中每个数字由7个小二极管组成,各个数字对应的表示方式如图所示: 题目描述 为了排除电路故障,现在你需要计算&am…

fh 幅频特性曲线怎么画fl_初学者怎么练习线条?教你如何画出流畅线条的技巧...

初学者怎么练习线条?怎样才能画出流畅线条?画出流畅线条有哪些技巧?想必这些问题都是绘画初学者们比较伤脑筋的问题,那么到底怎样才能画出流畅线条呢?今天灵猫课堂老师就在网络上收集整理了关于初学者怎么练习线条&…

.NET Core开发实战(第12课:配置变更监听)--学习笔记

12 | 配置变更监听:配置热更新能力的核心这一节讲解如何使用代码来监视配置变化并做出一些动作当我们需要追踪配置发生的变化,可以在变化发生时执行一些特定的操作配置主要提供了一个 GetReloadToken 方法,这就是跟踪配置的关键方法接着使用上…

ASP.NET Core Web API基于RESTFul APIs的集合结果过滤和分页

译者荐语:如何在RESTFul APIs中进行集合结果分页?还是用客户端来拼接链接地址么?原文来自互联网,由长沙DotNET技术社区【邹溪源】翻译。如译文侵犯您的版权,请联系小编,小编将在24小时内删除。在ASP.NET Co…

.net 微服务实践

l 前言本文记录了我的一次.net core 微服务架构实践经验,以及所用到的技术l 优点每个服务聚焦于一块业务,无论在开发阶段或是部署阶段都是独立的,更适合被各个小团队开发维护,团队对服务的整个生命周期负责,工作在独…

redis过期监听性能_基于Redis的延迟处理

延迟处理是一个非常常用的一个功能;例如, 下单成功后,在30分钟内没有支付,自动取消订单;延迟队列便是延迟处理中最常见的实现方式;先一起看下JDK中延迟队列是如何实现的.JUC的DelayQueue在JDK中, 提供了一套延迟队列的实现, 是JUC包中DelayQueue类.在使用时只需要让处理的元素对…

【译】来看看WebWindow,一个跨平台的.NET Core webview 库

本文翻译自 ASP.NET 项目组的 Steve Sanderson 的博客,发表于 2019 年 11 月 18 日。Steve Sanderson 是 Blazor 最早的创造者。它类似于 Electron,但没有捆绑 Node.js 和 Chromium,也没有大部分 API。我的上一篇文章研究了如何用 web 渲染的…

sql if 和insert_拼多多面试:Mybatis是如何实现SQL语句复用功能的?

在工作中&#xff0c;往往有这样的需求&#xff0c;对于同一个sql条件查询&#xff0c;首先需要统计记录条数&#xff0c;用以计算pageCount&#xff0c;然后再对结果进行分页查询显示&#xff0c;看下面一个例子。<sql id"studentProperties"><!--sql片段-…

代码演示C#各版本新功能

代码演示C#各版本新功能C#各版本新功能其实都能在官网搜到&#xff0c;但很少有人整理在一起&#xff0c;并通过非常简短的代码将每个新特性演示出来。代码演示C#各版本新功能C# 2.0版 - 2005泛型分部类型匿名方法可以为null的值类型迭代器协变和逆变C# 3.0版 - 2007自动实现的…

《C++ Primer》1.52节练习

练习1.23 #include <iostream> #include "Sales_item.h"using namespace std;int main() {Sales_item trans1, trans2;cout << "请输入若干销售记录:" << endl;if (cin >> trans1) {int num 1;while (cin >> trans2)if (t…

ASP.NET Core 反向代理部署知多少

引言最近在折腾统一认证中心&#xff0c;看到开源项目[IdentityServer4.Admin&#xff1a;https://github.com/skoruba/IdentityServer4.Admin]集成了IdentityServer4和管理面板&#xff0c;就直接拿过来用了。在尝试Nginx部署时遇到了诸如虚拟目录映射&#xff0c;请求头超长、…

函数传参string_JavaScript 高阶函数入门浅析

原文&#xff1a;https://www.freecodecamp.org/news/a-quick-intro-to-higher-order-functions-in-javascript-1a014f89c6b/译者&#xff1a;jingruzhang校对者&#xff1a;acusp高阶函数高阶函数可以接收函数作为参数&#xff0c;同时也可以返回一个新的函数。高阶函数之所以…

.NET Core开发实战(第13课:配置绑定:使用强类型对象承载配置数据)--学习笔记...

13 | 配置绑定&#xff1a;使用强类型对象承载配置数据要点&#xff1a;1、支持将配置值绑定到已有对象2、支持将配置值绑定到私有属性上继续使用上一节代码首先定义一个类作为接收配置的实例class Config {public string Key1 { get; set; }public bool Key5 { get; set; }pub…

工业互联网白皮书_发布|《工业互联网平台安全白皮书(2020)》发布

12月4日&#xff0c;2020年中国工业信息安全大会暨全国工控安全深度行(京津冀站)在北京国际会议中心举行。大会由国家工业信息安全发展研究中心、工业信息安全产业发展联盟主办&#xff0c;以“贯彻总体国家安全观&#xff0c;把牢工控安全基准线”为主题。会上&#xff0c;国家…

ASP.NET Core Razor 视图预编译、动态编译

0x01 前言ASP.NET Core在默认发布情况下&#xff0c;会启动预编译将试图编译成xx.Views.dll,也许在视图中打算修改一处很细小的地方我们需要再重新编译视图进行发布。下面我将从 ASP.NET Core 3 之前版本到 ASP.NET Core 3X 之后版本的一个配置列下下方供大家参考。0x02 预编译…

《C++ Primer》2.1.2节练习

练习2.3 #include <iostream> using namespace std;int main() {unsigned u 10, u2 42;cout << u2 - u << endl;cout << u - u2 << endl;int i 10, i2 42;cout << i2 - i << endl;cout << i - i2 << endl;cout <…

如何构建基于.NET Core和云环境下的微服务技术体系?

这个内核用处不大&#xff0c;但.NET 内核却666随着业务需求的增长&#xff0c;我们现在开发非常大型和复杂的项目&#xff0c;需要更多时间来构建和部署。每当质量检查报告任何问题时&#xff0c;我们都需要对其进行调试或修复&#xff0c;然后部署整个代码。为了降低这些复杂…