背景:
近2~3天win10频繁出现CRITICAL_STRUCTURE_CORRUPTION故障
暂无法100%复现该蓝屏故障,无法确定是windows补丁、硬件驱动、第三方软件哪一方导致的问题,需要参考系统日志进行蓝屏故障分析。
参考资料:
MicroSoft:停止错误或蓝屏错误问题的高级疑难解答
MicroSoft:Windows调试工具
MicroSoft:109错误代码
MicroSoft:社区专家建议
- 环境:
Windows 10 Pro - 工具:
winDbg Privew (winDbg的新版) - 参考日志
windows 系统日志
miniDump 小内存转储文件 - 分析流程
参考windows系统日志进行初步分析
使用winDbg工具,进一步分析dump信息
文章目录
一、故障描述
系统发生蓝屏,故障描述为CRITICAL_STRUCTURE_CORRUPTION
,官方文档解释为:内核已检测到关键的内核代码或数据损坏
二、初步分析
查看蓝屏代码,无法获取具体的蓝屏信息,需要查看系统日志,跟踪到蓝屏时间的系统日志。
查看系统日志:win+r ==》 eventvwr
查看系统日志可以发现,系统于9:06发生蓝屏错误,具体蓝屏代码为0x00000109
,结合网友提供的参考信息及微软文档,可以初步判断是内核代码被篡改导致的系统崩溃
。
三、进一步分析
通过基本分析,暂无法得出蓝屏的详细信息。造成蓝屏的问题很多,涉及系统补丁、驱动程序、第三方软件、病毒、硬件不可靠等诸多因素,需要进一步使用dump文件进行分析。
1、设置系统搜集dump故障转储文件
写这篇文章时,本机dump日志已经是开启状态,因此可以直接获取dump到文件,用windbg工具进行分析。
转储文件类型较多,不同类型记录的日志详细状况不一,建议设置为小内存转储(数百KB~数MB)即可,如日志信息不够详细,可进一步设置为更详细的完全内存转储(约数百MB)
2、配置winDbg分析软件
可以使用微软官方提供的WinDbg工具,或新版的WinDbg Priview进行分析。
新版分析工具较旧版本在界面上有所改动,可以看到打开工具时,右下角提示,已经获取到最新的dump文件,是否立即开始分析?同意后,在联网的状态下,会自动从MSDN在线下载分析dump所需的符号文件
。联网在线下载符号文件这一点,倒是很方便的一个功能。
注意: 脱机状态下,需要手动从msdn下载符号文件,并在WinDbg分析工具中设置符号文件路径。
3、使用dump文件开始分析
鼠标点击 !analyze -v
开始进行分析,有缺少的符号文件,联网状态下,也会自动补充更新。
4、bugcheck 原文
...........................
For analysis of this file, run !analyze -v
nt!KeBugCheckEx:
fffff800`3d59d900 48894c2408 mov qword ptr [rsp+8],rcx ss:0018:fffff90b`8400cd30=0000000000000109
4: kd> !analyze -v
*******************************************************************************
* *
* Bugcheck Analysis *
* *
*******************************************************************************
CRITICAL_STRUCTURE_CORRUPTION (109)
This bugcheck is generated when the kernel detects that critical kernel code or
data have been corrupted. There are generally three causes for a corruption:
1) A driver has inadvertently or deliberately modified critical kernel code
or data. See http://www.microsoft.com/whdc/driver/kernel/64bitPatching.mspx
2) A developer attempted to set a normal kernel breakpoint using a kernel
debugger that was not attached when the system was booted. Normal breakpoints,
"bp", can only be set if the debugger is attached at boot time. Hardware
breakpoints, "ba", can be set at any time.
3) A hardware corruption occurred, e.g. failing RAM holding kernel code or data.
Arguments:
Arg1: a3a01865857cf4e9, Reserved
Arg2: b3b724ebd7fd3a7c, Reserved
Arg3: fffff8003d758e60, Failure type dependent information
Arg4: 000000000000001e, Type of corrupted region, can be
0 : A generic data region
1 : Modification of a function or .pdata
2 : A processor IDT
3 : A processor GDT
4 : Type 1 process list corruption
5 : Type 2 process list corruption
6 : Debug routine modification
7 : Critical MSR modification
8 : Object type
9 : A processor IVT
a : Modification of a system service function
b : A generic session data region
c : Modification of a session function or .pdata
d : Modification of an import table
e : Modification of a session import table
f : Ps Win32 callout modification
10 : Debug switch routine modification
11 : IRP allocator modification
12 : Driver call dispatcher modification
13 : IRP completion dispatcher modification
14 : IRP deallocator modification
15 : A processor control register
16 : Critical floating point control register modification
17 : Local APIC modification
18 : Kernel notification callout modification
19 : Loaded module list modification
1a : Type 3 process list corruption
1b : Type 4 process list corruption
1c : Driver object corruption
1d : Executive callback object modification
1e : Modification of module padding
1f : Modification of a protected process
20 : A generic data region
21 : A page hash mismatch
22 : A session page hash mismatch
23 : Load config directory modification
24 : Inverted function table modification
25 : Session configuration modification
26 : An extended processor control register
27 : Type 1 pool corruption
28 : Type 2 pool corruption
29 : Type 3 pool corruption
2a : Type 4 pool corruption
2b : Modification of a function or .pdata
2c : Image integrity corruption
2d : Processor misconfiguration
2e : Type 5 process list corruption
2f : Process shadow corruption
30 : Retpoline code page corruption
101 : General pool corruption
102 : Modification of win32k.sys
Debugging Details:
------------------
KEY_VALUES_STRING: 1
Key : Analysis.CPU.mSec
Value: 2484
Key : Analysis.DebugAnalysisProvider.CPP
Value: Create: 8007007e on LEE-RAZER
Key : Analysis.DebugData
Value: CreateObject
Key : Analysis.DebugModel
Value: CreateObject
Key : Analysis.Elapsed.mSec
Value: 63811
Key : Analysis.Memory.CommitPeak.Mb
Value: 78
Key : Analysis.System
Value: CreateObject
ADDITIONAL_XML: 1
OS_BUILD_LAYERS: 1
DUMP_FILE_ATTRIBUTES: 0x8
Kernel Generated Triage Dump
BUGCHECK_CODE: 109
BUGCHECK_P1: a3a01865857cf4e9
BUGCHECK_P2: b3b724ebd7fd3a7c
BUGCHECK_P3: fffff8003d758e60
BUGCHECK_P4: 1e
BLACKBOXBSD: 1 (!blackboxbsd)
BLACKBOXNTFS: 1 (!blackboxntfs)
BLACKBOXPNP: 1 (!blackboxpnp)
BLACKBOXWINLOGON: 1
CUSTOMER_CRASH_COUNT: 1
PROCESS_NAME: csrss.exe
STACK_TEXT:
fffff90b`8400cd28 00000000`00000000 : 00000000`00000109 a3a01865`857cf4e9 b3b724eb`d7fd3a7c fffff800`3d758e60 : nt!KeBugCheckEx
SYMBOL_NAME: nt!WriteRegisterWithIndex8+0
MODULE_NAME: nt
IMAGE_NAME: ntkrnlmp.exe
IMAGE_VERSION: 10.0.19041.208
STACK_COMMAND: .thread ; .cxr ; kb
BUCKET_ID_FUNC_OFFSET: 0
FAILURE_BUCKET_ID: 0x109_1e_nt!WriteRegisterWithIndex8
OSPLATFORM_TYPE: x64
OSNAME: Windows 10
FAILURE_ID_HASH: {3e8fc38d-21c8-e8b6-d6ca-09982167b347}
Followup: MachineOwner
---------
报告给出了详细解释,只需要关注IMAGE_NAME
即可,可以看到是ntkrnlmp.exe
导致了系统异常
进一步,使用!process
命令,查看是哪个进程调用了这个程序
4: kd> !process
PROCESS ffffd90ce3e43080
SessionId: none Cid: 034c Peb: 4e44cbf000 ParentCid: 0294
DirBase: 44d583000 ObjectTable: ffff89011114d080 HandleCount: <Data Not Accessible>
Image: csrss.exe
VadRoot ffffd90ce8b3dc20 Vads 215 Clone 0 Private 359. Modified 1638. Locked 0.
DeviceMap ffff89010c0356c0
Token ffff89011112c7f0
ReadMemory error: Cannot get nt!KeMaximumIncrement value.
fffff78000000000: Unable to get shared data
ElapsedTime 00:00:00.000
UserTime 00:00:00.000
KernelTime 00:00:00.000
QuotaPoolUsage[PagedPool] 312728
QuotaPoolUsage[NonPagedPool] 29840
Working Set Sizes (now,min,max) (1786, 50, 345) (7144KB, 200KB, 1380KB)
PeakWorkingSetSize 1762
VirtualSize 2101346 Mb
PeakVirtualSize 2101347 Mb
PageFaultCount 10458
MemoryPriority BACKGROUND
BasePriority 13
CommitCharge 601
*** Error in reading nt!_ETHREAD @ ffffd90ce3ee6080
跟踪进程上下文信息,可以看到,是csrss.exe
调用ntkrnlmp.exe
时,发生了error,具体是Cannot get nt!KeMaximumIncrement value
无法获取到nt中最大的自增值(某个已共享的变量,但是调用时没有获取到)
四、初步结论
从windbg报告观察,是windows中的exe导致,非第三方软件、程序、驱动等。
1日后更正该结论,推翻了之前的主观判断 ----- 是windows软件导致:
经过微软建议,及自行排查,“鲁大师”有项服务自动设为了自启服务,结合windbg报告中–“内核已检测到关键的内核代码或数据损坏” 这一系统错误,“鲁大师”的服务项在系统中设置自启动后,极有可能导致了蓝屏。
五、解决办法
卸载第三方“鲁大师”,持续观察。
六、问题回顾
鲁大师确为近几天安装的,且是系统中唯一的第三方的安全、驱动类软件。在未曾手动设置启动项的情况下,鲁大师自行设置了某项服务为开机自启动。
经过windbg报告分析,蓝屏为系统某项可执行文件在执行时,导致程序错误。结合鲁大师的篡改启动项的行为,不能排除,在这个过程中,内核信息被篡改后发生错误,因而导致蓝屏。
遂进一步联系微软社区,提供dump文件,及涉及的exe程序,求助微软专家进行分析。
微软提供的建议
专家建议先检查系统文件,是否有和官方镜像不一致的文件(被篡改的文件),然后将不一致的文件进行还原。
系统文件完整性检查命令
1、使用管理员运行 PowerShell
2、扫描全部系统文件并和官方系统文件对比,扫描计算机中的不一致情况
Dism /Online /Cleanup-Image /ScanHealth
回车
3、Dism /Online /Cleanup-Image /CheckHealth
回车
4、将和源镜像中不同的系统文件还原成官方系统源文件
DISM /Online /Cleanup-image /RestoreHealth
回车
5、sfc /SCANNOW
回车
6、完成后重启
7、重启后再次执行
sfc /SCANNOW
经过系统文件完整性检查,发现系统文件无不一致的文件。不能完全排除第三方软件服务导致了蓝屏问题。
经检查发现鲁大师有一项开机自启服务,应是2月13~2月14日两天自行开启的服务。
鲁大师安装后,仅是用于检查本机硬件配置信息,已手动关闭所有启动项,且未曾手动设置开机自启服务,不知为何会在近2天内,该服务项自动设为了开机自启
。
无法排除鲁大师导致蓝屏的原因,卸载鲁大师,持续观察系统是否有异常蓝屏情况。
2021年2月15日 15点08分
按照日常使用频率,正常使用电脑,观察1天,未发现异常。
2021年2月27日
发生数次109蓝屏,升级系统至win10 H20版本,暂未发现蓝屏问题。系统升级疑似解决了这个问题。
后记:蓝屏问题比较难以定位真正的蓝屏原因,往往以强制卸载新增的应用、服务收场,但确有效果。本文记录了排查、分析蓝屏问题的一个步骤,按照此方法可以缩小蓝屏原因的范围,可供给各位读者一个参考。
其他蓝屏问题处理过程:
传送门1:蓝屏代码0x1000007e 错误分析
传送门2:记一次Tencent组件Brvsd.sys导致的蓝屏故障
传送门3:记一次Tencent组件Brvsd.sys导致的蓝屏故障(二)