

系统蓝屏的几种姿势,确定不了解下么?
source link: http://mp.weixin.qq.com/s?__biz=MzAwNTMxMzg1MA%3D%3D&%3Bmid=2654077698&%3Bidx=6&%3Bsn=6cd93a24ab81087e15dd0269308dc172
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

前言
在 蓝屏(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); // __cdecl
typedef 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;
}
效果如下:

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
打开。 -
通过控制面版打开(不同系统中可能不一样)。
-
还有很多其它方法,不一一列举了。
Dump1Keys 0x70 ALT + CTRL + SHIFT值 意义 0x01 Rightmost SHIFT key 0x02 Rightmost CTRL key 0x04 Rightmost ALT key 0x10 Leftmost SHIFT key 0x20 Leftmost CTRL key 0x40 Leftmost 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 + ` + `
触发蓝屏的过程。按一次 `
是不行的, 一定要按两次
。

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 Code
是
0xF4(CRITICAL_OBJECT_TERMINATION)
。
通过
NMI
导致的蓝屏,对应的
Bug Check Code
是
0x80(NMI_HARDWARE_FAILURE)
,表示这个蓝屏是由于硬件错误触发的。
通过系统快捷键导致的蓝屏,对应的
Bug Check Code
是
0xe2(MANUALLY_INITIATED_CRASH)
,表示这个蓝屏是用户手动触发的。
我们可以用 !analyze -show
来查看转储文件中的 bug check code
信息。

从输出结果可知,这个蓝屏是用户手动触发蓝屏产生的。从调用栈可知,是 i8042prt.sys
处理了我们的按键,从而导致的蓝屏。
友情提示:
如果直接用 windbg
打开 %SystemRoot%\MEMORY.DMP
会提示权限不够。可以以管理员权限运行 windbg
后再打开。或者 拷贝
转储文件到其它目录后再打开即可。注意一定是 拷贝
,而不是 剪切
。

总结
-
特殊情况下,我们可能会主动使系统蓝屏来保存一份转储文件,供我们事后分析。
-
我们可以通过本文介绍的几种方法来使系统蓝屏。我个人偏向使用
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:
微软官方文档 —— Forcing a System Crash from the Keyboard: https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/forcing-a-system-crash-from-the-keyboard
github 上的 Invoke-BSOD 项目: https://github.com/peewpw/Invoke-BSOD/blob/master/Invoke-BSOD.ps1
猜你喜欢:
转储文件系列:
调试系列:
调试实战——你知道怎么使用DebugView查看调试信息吗?
调试实战——崩溃在ComFriendlyWaitMtaThreadProc
调试实战——使用windbg调试崩溃在ole32!CStdMarshal::DisconnectSrvIPIDs
排错系列:
排错实战——使用process explorer替换任务管理器
排错实战——通过对比分析sysinternals事件修复程序功能异常
Recommend
-
58
IT教育领导品牌 职场/人工智能/大数据 关注 人工智能人才缺口500万...
-
30
-
9
在mybatis的日常开发中,mapper接口中定义的参数如何与xml中的参数进行映射呢?除了我们常用的@Param注解之外,其他的方式是怎样的呢? I. 环境配置我们使用SpringBoot + Mybatis + MySql来搭建实例demo springboot:...
-
10
之前介绍过一篇拦截器的基本使用姿势:
-
9
在日常的业务需求开发过程中,批量插入属于非常常见的case,在mybatis的写法中,一般有下面三种使用姿势 单个插入,业务代码中for循环调用 <foreach>标签来拼接批量插入sql 复用会话,拆分小批量插入方式
-
8
微软承认某次系统更新会导致Win10 PC蓝屏死机,现已修复 新酷产品第一时间免费试玩,...
-
11
日久见人心:论建模用户长期兴趣的几种姿势 众所周...
-
9
PHP防御的几种姿势1.关闭错误提示说明:PHP配置文件php.ini中的display_errors=Off 2.魔术引号说明:当php.ini里的magic_quotes_gpc=On时,提交的变量中...
-
7
Windows 10 Enterprise LTSC做Windows To Go蓝屏无法进入系统 2022-09-04
-
8
当一个应用程序运行的有问题时,生成一个Dump文件来调试它可能会很有用。在Windows、Linux或Azure上有许多方法可以生成转储文件。 Windows平台 dotnet-dump (Windows)
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK