前言
在 藍屏(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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
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
檔案,然後雙擊匯入登錄檔, 重啟生效 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
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
檔案,雙擊匯入登錄檔, 重啟生效 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
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
開啟。 -
通過控制面版開啟(不同系統中可能不一樣)。
-
還有很多其它方法,不一一列舉了。
1 2 3 |
<span class="hljs-attribute">Dump1Keys</span> 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]
的定義如下(摘自微軟官方文件):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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 +
觸發藍屏的過程。按一次 +
是不行的, 一定要按兩次 。
如果以上方法都行不通,還可以使用 PCI Express Dump Switch Card
使系統藍屏。 Windows 7, Windows Server 2008 R2
及更早的系統需要設定如下注冊表項:
1 2 3 |
[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
資訊。
1 |
windbg !analyze -show & k |
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:
本文轉自:https://www.mdeditor.tw/pl/pJpq/zh-tw