Windows10藍屏事件分析

Windows10 BSOD分析

近期突然曝出能夠讓Windows10系統拒絕服務的藍屏符號鏈接:\.\globalroot\device\condrv\kernelconnect,只要在Google瀏覽器中輸入這串字符串,電腦就會崩潰。上手就試,啪,很快啊~就崩潰了
在這裏插入圖片描述注意到發生崩潰的驅動文件是 c o n d r v . s y s \textcolor{orange}{condrv.sys} condrv.sys。打開內核調試器,重新嘗試。
在這裏插入圖片描述
根據調用棧分析,在瀏覽器中輸入這串字符串的時候,瀏覽器調用了 G e t F i l e A t t r i b u t e s ( ) \textcolor{cornflowerblue}{GetFileAttributes()} GetFileAttributes(),對應的內核函數爲 N t Q u e r y F u l l A t t r i b u t e s F i l e ( ) \textcolor{cornflowerblue}{NtQueryFullAttributesFile()} NtQueryFullAttributesFile()並最終在 c o n d r v ! C d p D i s p a t c h C l e a n u p ( ) \textcolor{cornflowerblue}{condrv!CdpDispatchCleanup()} condrv!CdpDispatchCleanup()中發生崩潰。
在這裏插入圖片描述
原因就是訪問了空指針!對應的僞代碼:
在這裏插入圖片描述
是什麼導致這個空指針的出現?回過頭來看到路徑中的KernelConnect,通過交叉引用來到了 C d C r e a t e K e r n e l C o n n e c t i o n ( ) \textcolor{cornflowerblue}{CdCreateKernelConnection()} CdCreateKernelConnection()
在這裏插入圖片描述
動態調試後發現判斷是UserMode的執行模式就會直接返回拒絕類型,關鍵是 C d C r e a t e K e r n e l C o n n e c t i o n ( ) \textcolor{cornflowerblue}{CdCreateKernelConnection()} CdCreateKernelConnection()








v1->MajorFunction[0] = (PDRIVER_DISPATCH)CdpDispatchCreate;

中調用的,而 C d p D i s p a t c h C r e a t e ( ) \textcolor{cornflowerblue}{CdpDispatchCreate()} CdpDispatchCreate()屬於 R I P _ M J _ C R E A T E \textcolor{orange}{RIP\_MJ\_CREATE} RIP_MJ_CREATE類型的分發函數。在分發函數中,返回非成功類型的值前都應該進行如下操作:

...
(PRIP)a2->IoStatus.Status = 0;
(PRIP)a2->IoStatus.Information = 0i64;
IofCompleteRequest(a2, 0);//分發完成例程請求

這樣就能避免在失敗的返回後還能獲取到設備的對象。而出問題的代碼段中正好少了這一步,導致返回了拒絕訪問後還能讓調用者獲取到設備的對象,此時這個對象並沒有被初始化,所以調用者使用完該對象後在釋放對象的過程中就訪問到了一個野指針,可能是某處對該指針的內存進行了清零,從而導致了這場了災難!

到這可以說該藍屏的問題與瀏覽器沒有直接的關係,通過下面這段代碼也能觸發BSOD

#include<iostream>
#include<windows.h>

using namespace std;

int main() {
   
   
	GetFileAttributesW(L"\\\\.\\globalroot\\device\\condrv\\kernelconnect");
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章