我正在尝试分析在重启期间在Windows 10计算机上发生的BSOD(0xFC,ATTEMPTED_EXECUTE_OF_NOEXECUTE_MEMORY),但我被卡住了。
!analyze -v
提供了有用的信息,如:
DEFAULT_BUCKET_ID: WIN8_DRIVER_FAULT PROCESS_NAME: System MODULE_NAME: mrxsmb IMAGE_NAME: mrxsmb.sys FAILURE_BUCKET_ID: 0xFC_mrxsmb!MRxSmbQueryLbfoTeamCapability BUCKET_ID: 0xFC_mrxsmb!MRxSmbQueryLbfoTeamCapability PRIMARY_PROBLEM_CLASS: 0xFC_mrxsmb!MRxSmbQueryLbfoTeamCapability # Child-SP RetAddr Call Site 00 ffffd000`20505ba8 fffff802`a03e1a7c nt!KeBugCheckEx 01 ffffd000`20505bb0 fffff802`a0319229 nt! ?? ::FNODOBFM::`string'+0x1377c 02 ffffd000`20505bf0 fffff802`a031a661 nt!MiSystemFault+0x7e9 03 ffffd000`20505ce0 fffff802`a03c8bbc nt!MmAccessFault+0x5f1 04 ffffd000`20505e40 fffff800`1cf70030 nt!KiPageFault+0x13c 05 ffffd000`20505fd8 fffff802`a072fea2 ndis!_NULL_IMPORT_DESCRIPTOR+0x558 06 ffffd000`20505fe0 fffff802`a07300e6 nt!IopXxxControlFile+0x1162 07 ffffd000`205061b0 fffff802`a03ca1a3 nt!NtDeviceIoControlFile+0x56 08 ffffd000`20506220 fffff802`a03c2860 nt!KiSystemServiceCopyEnd+0x13 09 ffffd000`20506428 fffff800`1d7df2aa nt!KiServiceLinkage 0a ffffd000`20506430 fffff800`1d818b5b mrxsmb!MRxSmbQueryLbfoTeamCapability+0x16a 0b ffffd000`20506570 fffff800`1cbc1c7d mrxsmb!MRxSmbPnPBindingHandler+0x1ab 0c ffffd000`205066e0 fffff800`1cbc2194 TDI!TdiNotifyNewPnpClient+0x12d 0d ffffd000`20506710 fffff800`1cbc1db0 TDI!TdiExecuteRequest+0x2d4 0e ffffd000`20506760 fffff800`1cbc184c TDI!TdiHandleSerializedRequest+0x120 0f ffffd000`205067d0 fffff800`1d7e0b96 TDI!TdiRegisterPnPHandlers+0x12c 10 ffffd000`20506800 fffff800`1d81ab71 mrxsmb!MRxSmbStartTransport+0xfe 11 ffffd000`20506890 fffff800`1d228f2f mrxsmb!MRxSmbStart+0x51 12 ffffd000`205068e0 fffff800`1d816faf rdbss!RxStartMinirdr+0xef 13 ffffd000`20506930 fffff800`1d7d366e mrxsmb!MRxSmbDevFcbXXXControlFile+0x1eb 14 ffffd000`205069a0 fffff800`1d2567de mrxsmb!SmbShellDevFcbXXXControlFile+0xe 15 ffffd000`205069d0 fffff800`1d256665 rdbss!RxXXXControlFileCallthru+0xb6 16 ffffd000`20506a00 fffff800`1d2694d9 rdbss!RxCommonDevFCBFsCtl+0xa5 17 ffffd000`20506a50 fffff802`a0367c11 rdbss!RxFspDispatch+0xe9 18 ffffd000`20506b10 fffff802`a034f399 nt!IopProcessWorkItem+0x81 19 ffffd000`20506b80 fffff802`a02c3b35 nt!ExpWorkerThread+0xe9 1a ffffd000`20506c10 fffff802`a03c4b16 nt!PspSystemThreadStartup+0x41 1b ffffd000`20506c60 00000000`00000000 nt!KiStartSystemThread+0x16
这些信息让我知道出了什么问题:
根据WinDbg,问题的根源可能在 mrxsmb!MRxSmbQueryLbfoTeamCapability
函数中。
MRxSMB是所谓的“SMB迷你重定向器”。重定向器是一个组件,它是远程文件系统驱动程序的一部分。 rdbss的东西也是构建MRxSMB的重定向器架构的一部分。
TDI的东西代表“传输驱动程序接口”,并且根据Windows Internals预订某种遗留的“内核模式设备驱动程序,它实现了网络API实现的内核模式部分”。
由此我假设Windows尝试通过SMB访问远程文件系统。我认为它实际上试图访问无法访问的网络驱动器。 但我想了解为什么会导致BSOD。
我的问题是:
WinDbg如何知道问题以mrxsmb!MRxSmbQueryLbfoTeamCapability+0x16a
开头而后不会发生?
ndis!_NULL_IMPORT_DESCRIPTOR
看起来很可疑。根据谷歌这样的描述符标志着一个加载库的结束。但为什么它会在这里显示为功能呢?
如果我取回ndis!_NULL_IMPORT_DESCRIPTOR
的返回地址(fffff802`a072fea2)并在内存中返回一些字节,我就明白了:
1: kd> u fffff802`a072fe90 fffff802`a072fea2 nt!IopXxxControlFile+0x1150: fffff802`a072fe90 eb13 jmp nt!IopXxxControlFile+0x1165 (fffff802`a072fea5) fffff802`a072fe92 488bd7 mov rdx,rdi fffff802`a072fe95 488b8c2488000000 mov rcx,qword ptr [rsp+88h] fffff802`a072fe9d e8fe8dc1ff call nt!IofCallDriver (fffff802`a0348ca0) fffff802`a072fea2 448be0 mov r12d,eax
我的假设是否正确,ndis!_NULL_IMPORT_DESCRIPTOR+0x558
事实实际发生在nt!IofCallDriver
,因为这是ndis!_NULL_IMPORT_DESCRIPTOR+0x558
的返回地址之前的最后一条指令?但是为什么这个函数不会出现在堆栈跟踪中呢?
如何实际获取函数参数?根据我的理解,我不能,因为调用约定是前4个参数是在寄存器而不是堆栈中传递的,而我只有最后一个操作的寄存器内容?
如何进行?