广告: 考虑到这篇质量很高但是那会粉丝少,阅读量低得惊人(100阅读),所以引个流:
几年前(3年前,才发现已经三年了),开发EDR的过程中用户反馈了一个有意思的问题,即开机黑屏.那会调了半天都找不到,后来设置了开机性能监视器,才发现了一点端倪:
在windows启动中,涉及到用户配置项的部分,是由一个ProfSvc的服务管理的:
这个会负责用户登录的profile的加载,以及切换用户。在logon的时候,会通过ThreadPool加一个workitem(这真不是小黑那个所谓的免杀的线程池排队) 然后执行一系列登录的加载操作,如创建用户token,用户鉴权,全局环境变量等等:
线程池item管理的.最终会队列执行 LogonThreadProcInternal
问题就出现在这里面的CUserProfile方法:
CUserProfile本来没什么问题,但是在windows某个特定版本后(我那会key08写的是1803,具体我也不知道)增加了一个CreateTempDirectoryForUser方法。这个方法是由用户属性判断了什么东西后会调用的:
CreateTempDirectoryForUser这个东西是干什么的?
这个东西是用于标记是否可以删除 hard是不能删除 soft是可以删除 然后他开机时候 给temp这个文件夹设置了soft代表当磁盘空间不足时候可以删除这些文件
但是设置的实现方法是递归遍历目录打标记.
这本来实现也跟事情毫不相干,而且工作挺不错的, 但是还有一个例外,就是安全软件
大部分的安全软件总是会在minifilter中的precreate或者postcreate地方匹配自己的规则
比如openedr:
而这会导致一个问题,临时文件过多,会导致系统logon慢很多,而本来就因为临时文件过多导致的卡的问题,结果再结合安全软件在匹配规则导致了更卡.
这就是为什么小*/卡*/火*/3*等安全软件 有在某些机器上开机黑屏卡慢的问题.
之前对象用的是火*,反应开机黑屏,就给他换***,结果也黑屏.到最后分析出来发现,就是这个原因.清理垃圾后就正常了.
解决方案: 做安全软件开发的都是聪明人.这块很多家现在已经解决了.如果没解决的可以评论区说一下.
原文始发于微信公众号(冲鸭安全):终端安全软件开发中关于性能方面的一个坑
评论