[轉]系統藍屏的幾種姿勢,確定不瞭解下麼?

前言

在 藍屏(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

效果如下:

win10 關鍵程序結束導致藍屏

3. 使用快捷鍵

如果系統由於某些原因掛起了,我們沒辦法殺死系統關鍵程序,也不能執行 NotMyFault 了。這時候我們還可以通過快捷鍵來使系統藍屏!不過我們需要預先做一些設定才行。把下面的程式碼儲存到 .reg 檔案,然後雙擊匯入登錄檔, 重啟生效 。

重啟後,按住 右側 的 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 檔案,雙擊匯入登錄檔, 重啟生效 。

重啟後,按住 左側 的 Ctrl 鍵,然後連續按 兩下  鍵就可以使系統藍屏了。注意: 一定要連續按兩下! 按一下是不行的。

想要正確設定自定義藍屏快捷鍵, 不是一件容易的事 。需要了解以下幾點:

1. 使用自定義快捷鍵需要先關閉  CrashOnCtrlScroll 設定,上面的程式碼已經做好了。因為不同型別的鍵盤對應的登錄檔位置不一樣,怎麼知道自己的機器上的鍵盤是哪種型別的?

2. 我們可以開啟裝置管理器,檢視當前機器上的鍵盤資訊。

我們可以用如下方法開啟  裝置管理器 :

  • win10 系統中,可以直接在搜尋框(或者按一下  windows 鍵)輸入  裝置管理器 搜尋開啟。

  • win10 系統中,按  Windows + x 快捷鍵,在彈出的系統選單裡點選  裝置管理器(M) 開啟。

  • 輸入 devmgmt.msc 開啟。

  • 通過控制面版開啟(不同系統中可能不一樣)。

  • 還有很多其它方法,不一一列舉了。

意義
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] 的定義如下(摘自微軟官方文件):

上面的例子中,鍵的掃描碼是  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 及更早的系統需要設定如下注冊表項:

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 後再開啟。或者 拷貝 轉儲檔案到其它目錄後再開啟即可。注意一定是 拷貝 ,而不是 剪下 。

 

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

本文轉自:https://www.mdeditor.tw/pl/pJpq/zh-tw