“LogonUI.exe系统错误,系统在此应用程序中检测到基于堆栈的缓冲区溢出”的解决思路
今天某网友电脑上遇到了这样一个问题:
一开始是BAD_SYSTEM_CONFIG_INFO蓝屏,重启后开机自动修复。参考我的视频 “开机蓝屏代码BAD SYSTEM CONFIG INFO问题的解决思路” 置顶评论的代码,检测出是security文件损坏。

收到损坏的security文件,花了点时间修复好发回去,替换后开机又遇到了新问题:


LogonUI.exe系统错误
系统在此应用程序中检测到基于堆栈的缓冲区溢出。溢出可能允许恶意用户获得此应用程序的控制。
尝试进安全模式也是同样的错误。
怀疑security损坏严重没修复成功,于是导出虚拟机security文件里“系统相关”部分的reg注册表,导入替换修复过的security文件。再把替换后的security文件覆盖虚拟机的security文件,虚拟机能正常启动进桌面,说明修复的security文件应该不存在问题。
让网友传了C:\Windows\System32\winevt\Logs里的application.evtx和system.evtx。

可以看到在security损坏前就已经遇到LogonUI.exe系统错误问题。询问网友得知,出现BAD_SYSTEM_CONFIG_INFO前,上一个月系统更新后开始频繁蓝屏,有时候需要重复启动才能进系统。
于是用dism++查看补丁,没有发现疑似相关的补丁。3月9日凌晨才出现的问题,前一天3月8日只有一个.net的补丁,应该无关,卸载这补丁估计也解决不了问题。至于上个月的补丁固化了卸载不了。

于是建议执行这些命令:
假设恢复环境或PE里系统盘是C盘,则执行“chkdsk /r c:”,/f参数很多时候不管用。
命令执行完了,重启问题依旧。
执行mdsched检查内存。执行到一半没发现错误,得知故障电脑出问题后装上别人带系统的硬盘能正常进系统,于是中断检测,暂时排除内存问题。
排除了硬盘和内存问题,问过网友出问题前没有用msconfig,没有禁用过什么服务。于是建议命令提示符里用sfc检测并修复系统文件。
跟系统里执行sfc /scannow不一样,PE或恢复环境里修复要加参数:
sfc /SCANNOW /OFFBOOTDIR=C:\ /OFFWINDIR=C:\windows

提示找到了损坏文件,但是有一些文件无法修复。描述里提到的log文件并不存在,想生成log文件需要另加参数。
sfc /SCANNOW /OFFBOOTDIR=C:\ /OFFWINDIR=C:\windows /OFFLOGFILE=c:\cbs.log
执行完命令查看cbs.log日志:

可以看到损坏了一堆文件。询问了网友系统版本,以及通过cbs\cbs.log日志得知版本号,刚好跟我电脑一致,可以从我电脑提取损坏文件修复。
将上面findstr筛选的字符串输出到文本,用EmEditor替换文本,用正则表达式替换去掉无关内容只保留路径,再根据路径制作批处理从本机提取出正常的文件。
把提取的文件复制进虚拟机替换测试,在确定替换后不影响正常进系统时就把文件发给网友。
因为期间漏掉了一些文件,重复两次后损坏文件替换完毕,正常进入系统!

最后一次替换的文件如下:

至于具体是哪个文件损坏导致的就懒得深究了,感兴趣的可以自己研究。比如用sysmon监控logonui.exe开机加载和读取的文件。