前几天网上闹了个大乌龙,在windows更新后很多win10电脑发现开机白屏,最后发现是火绒误删explorer.exe导致系统卡死,而后火绒也发布了官方声明。
有趣的是,bilibili作者epcdiy而后发布一一篇所谓的分析视频,视频中描述Win10 22H2在更新补丁KB5034203和KB5034763后windows的explorer.exe时间戳显示为2085年以及在逆向后出现针对360系列杀软的一系列操作,这些特征与AVkiller相似,所以引起了火绒的误杀。
首先,我们来分析explorer这段针对于360的代码,这段代码的功能是检查一系列特定的进程是否正在运行。这些进程的名称存储在一个名为v11的数组中,包括"360leakfixer.exe"、"360safe.exe"、"360PatchMgr64.exe"、"360Tray.exe"和"ZhuDongFangYu.exe"。也就是360系列产品。首先,代码创建了一个Toolhelp32Snapshot,这是一个系统快照,包含了系统中所有进程的信息。然后,它遍历v11数组中的每个进程名称,使用ShellFeedsCampaignHelper::IsProcessRunning函数检查每个进程是否正在运行。如果找到任何一个进程正在运行,它将*(_BYTE )this设置为1,并跳出循环。如果没有找到任何进程正在运行,它将(_BYTE *)this保持为0。最后,无论是否找到正在运行的进程,它都会关闭Toolhelp32Snapshot句柄。
简而言之,这份代码就是给系统打了个快照,然后检测是否存在360系列产品的进程,如果存在就返回ture。
以恶意代码分析的角度来看,这份代码的静态可疑点就是有360全家桶的字符串,而且函数名存在Hijacking,这个词本意为注入,劫持,这些都是编写木马时的高频词,加之其程序的时间戳不在正常范围内,会很容易被杀毒软件注意到。其次,从行为的角度来看,这份代码的运行流程有打进程快照、检测360全家桶是否存活。这些行为特征放在一个静态特征存疑的程序上很容易被误认为木马,火绒官方文件中提到的AVkiller(强杀杀软)系列木马是会有这个行为,此外其他木马在进行免杀化的过程中识别系统是否有杀软进程进而进行不同的后续感染上线操作也是必不可少的步骤。这一切为火绒杀掉explorer.exe提供了合理性。
然后我们继续进行分析,搞清楚这个explorer为什么要去识别360的进程。我找到了微软此次更新的描述:“解决了影响 explorer.exe的问题。 它可能会停止响应。”(https://prod.support.services.microsoft.com/zh-cn/topic/2024-%E5%B9%B4-2-%E6%9C%88-13-%E6%97%A5-kb5034763-os-%E5%86%85%E9%83%A8%E7%89%88%E6%9C%AC-19044-4046-%E5%92%8C-19045-4046-f1c993e4-32b3-4cc8-947a-69e70ae124d5)此处留意,后文要提。
而后回到IDA中,这个检测360进程的函数名为shellFeedsCampaignHelper::IsHijackingProcessRunning,我们全局搜索一下,看看是谁调用了这个函数
点进去来到了一个新的函数ShellFeedsCampaignHelper::CheckCampaignAvailability,我们从头开始分析它。
我们只分析主要功能:
这里调用ShellFeedsExperienceHelpers::GetShellFeedsRegKey函数来获取注册表ShellFeedsTaskbarViewMode键值。如果这个键值大于等于0且等于2,它将v12设置为1,否则,它将跳转到LABEL_34标签。
我们去百度搜索这个ShellFeedsTaskbarViewMode键值的功能,发现这个键值是代表着windows“资讯和功能”功能,且在键值为2时是关闭的。
那这个函数功能我们大致可以猜测出是检测“资讯和功能(feeds)”功能是否关闭了。如果“资讯和功能”功能关闭了,键值是2,v12变量为1,下边进入一个if判断,判断v12是否是0,如果是0(该功能开启)则进入LABEL_34函数。
我们接着往下看下面出现了几个函数,IsDeviceInDmaRegion、IsInCampaignEnabledRegion、IsHijackingProcessRunning、CheckAvailability_UserUnpinDate、CheckAvailability_LastCampaignRunDate,我们接下一个一个分析。
IsDeviceInDmaRegion函数:检测注册表键值IsDeviceInDmaRegion,这个百度搜不到,我问了ChatGPT,说是这个注册表键值用于确定设备是否位于DMA(直接内存访问)区域中。如果设备位于DMA区域,它可能能够利用DMA来进行更高效的数据传输。这个信息对于系统性能调优和设备管理来说可能是重要的。用人话说就是检测这个设备是否是传输数据的关键设备(我自己理解的)。如果是,它将跳转到LABEL_34标签。
CheckAvailability_UserUnpinDate和CheckAvailability_LastCampaignRunDate函数用于检测本地时间戳feeds功能运行上次时间,这里不做赘述。
IsInCampaignEnabledRegio函数:这里就是视频里提到的检测地区是否为中国,但是在这个函数的后边又判断了windows是否为企业版。如果是,它将跳转到LABEL_34标签。
IsHijackingProcessRunning函数:这个就是喜闻乐见的360进程检测代码了,如果存在360进程,它将跳转到LABEL_34标签。上边已经做过一遍分析这里不再赘述,值得思考的一点是为什么微软写这段代码为什么要用Hijacking命名?
至于为什么要用Hijacking命名360全家桶,我这里浅浅推测一下,有过木马免杀经历的师傅都知道,杀软通常会用一些ring3层hook插桩等操作来监控进程,在监控进程的过程中也避免不了Hijacking(注入、劫持),这里我引用了知乎大佬韩朴宇在相关回答下的截图,可以看到360环境下的explorer.exe的的确确被360注入了,并且也加载了360的dll文件。
所以有一种可能是360的系统监控与windows本身的“资讯和功能(feeds)”冲突,微软为了为维持系统稳定性在这里要检测系统是否有360全家桶而后来关闭“资讯和功能(feeds)”。
最后在经过很多次判断后,即满足feeds功能存在且开启、DMA区域机器、中国地区的企业版windows、安装360系列产品任一条件就来到的这个LABEL_34标签,LABEL_34是一个返回函数,返回0值给主函数,也就是 ShellFeedsCampaign 不可用,大概意思也就是关闭feeds功能。
所以微软的本意也许是为了保证系统流畅性才在explorer加入这段代码,即检测系统是否存在360全家桶进程,如果存在就关闭feeds功能,因为在360环境下windows的feeds功能和360安全监测的注入插桩行为相冲突进而导致系统崩溃,又因为在这段代码中用了Hijacking、360进程名等木马高相似性字符串,加上其拍摄快照、检测进程存活等敏感行为和异常的时间戳被火绒列为高危文件进而误杀。
参考文章:https://www.zhihu.com/question/642107690