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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/251696.html
標籤:其他
上一篇:記一次偶然發現的進度條View
