AmCache取证分析:挖掘Windows系统中的恶意活动痕迹

本文深入分析Windows系统中的AmCache取证工件,探讨其在识别恶意软件执行痕迹方面的重要价值。文章详细解析Amcache.hve文件结构、关键注册表键值,并介绍新型分析工具AmCache-EvilHunter,帮助安全专业人员快速提取威胁指标并进行威胁情报查询。

AmCache取证分析:挖掘Windows系统中的恶意活动痕迹

引言

在数字取证领域,AmCache在识别Windows系统中的恶意活动方面发挥着至关重要的作用。该工件允许识别机器上执行的良性和恶意软件。它由操作系统管理,在撰写本文时,尚无已知方法可以修改或删除AmCache数据。因此,在事件响应场景中,它可能是识别丢失工件(例如自动删除的勒索软件)的关键,允许分析人员搜索攻击者留下的模式,例如文件名和路径。此外,AmCache存储了已执行文件的SHA-1哈希值,这使得DFIR专业人员能够搜索公共威胁情报源(如OpenTIP和VirusTotal)并生成规则以在网络中的其他系统上阻止相同文件。

本文对AmCache工件进行了全面分析,让读者更好地理解其内部工作原理。此外,我们介绍了一个名为"AmCache-EvilHunter"的新工具,任何专业人员都可以使用它轻松解析Amcache.hve文件并提取IOC。该工具还能够查询上述情报源以检查恶意文件检测,这种内置自动化水平减少了手动工作并加快了威胁检测速度,这对分析人员和响应人员具有重要价值。

执行证据的重要性

执行证据在数字取证和事件响应中至关重要,因为它帮助调查人员重建入侵期间系统的使用方式。Prefetch、ShimCache和UserAssist等工件提供了有关执行内容的线索。AmCache也是证明执行的强大工件,即使文件已被删除或修改,它仍保留指示文件存在和执行的元数据。AmCache相对于其他Windows工件的一个优势是,与它们不同,它存储文件哈希值,这对分析人员非常有用,因为它可用于在整个网络中搜寻恶意文件,增加了完全识别、遏制和消除威胁的可能性。

AmCache简介

应用程序活动缓存(AmCache)最初在Windows 7中引入,并在Windows 8及更高版本中得到充分利用。其目的是在新系统中替换较旧的RecentFileCache.bcf。与其前身不同,AmCache包含有关程序执行、执行的二进制文件和加载的驱动程序的有价值的取证信息。

该工件以名为Amcache.hve的注册表配置单元文件形式存储在目录C:\Windows\AppCompat\Programs中。此文件中存储的元数据包括文件路径、发布者数据、编译时间戳、文件大小和SHA-1哈希值。

需要重点强调的是,AmCache格式不依赖于操作系统版本,而是依赖于负责填充缓存的库(DLL)版本。因此,即使具有不同补丁级别的Windows系统在AmCache文件结构上也可能存在微小差异。用于填充此缓存的已知库存储在%WinDir%\System32下,具有以下名称:

  • aecache.dll
  • aeevts.dll
  • aeinv.dll
  • aelupsvc.dll
  • aepdu.dll
  • aepic.dll

值得注意的是,该工件有其特性和局限性。AmCache仅对每个可执行文件的前31,457,280字节(≈31 MB)计算SHA-1哈希值,因此对于超过此大小的文件,在线比较其存储的哈希值可能会失败。此外,Amcache.hve不是真正的执行日志:它记录由Microsoft兼容性评估器扫描的目录中的文件、程序执行期间复制的可执行文件和驱动程序,以及需要兼容性填充的GUI应用程序。只有最后一类可靠地指示实际执行。前两组中的项目仅确认系统上存在文件,没有关于它们是否运行或何时运行的数据。

在同一目录中,我们可以找到用于确保Amcache.hve一致性和恢复操作的其他LOG文件:

  • C:\Windows\AppCompat\Programs\Amcache.hve.*LOG1
  • C:\Windows\AppCompat\Programs\Amcache.hve.*LOG2

可以使用Aralez、Velociraptor或Kape等工具从系统中收集Amcache.hve文件进行取证分析。

Amcache.hve结构

Amcache.hve文件是REGF格式的Windows注册表配置单元;它包含多个存储不同数据类别的子键。可以实现一个简单的Python解析器来遍历Amcache.hve并呈现其键:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#!/usr/bin/env python3

import sys
from Registry.Registry import Registry

hive = Registry(str(sys.argv[1]))
root = hive.open("Root")

for rec in root.subkeys():
    print(rec.name())

此解析器执行时的结果是: AmCache键

从DFIR的角度来看,我们最感兴趣的键是InventoryApplicationFile、InventoryApplication、InventoryDriverBinary和InventoryApplicationShortcut,这些将在以下小节中详细描述。

InventoryApplicationFile

InventoryApplicationFile键对于跟踪系统上发现的每个可执行文件至关重要。在此键下,每个可执行文件由其自己唯一命名的子键表示,该子键存储以下主要元数据:

  • ProgramId:根据二进制名称、版本、发布者和语言生成的唯一哈希,哈希开头附加了一些零
  • FileID:文件的SHA-1哈希,哈希开头附加了四个零
  • LowerCaseLongPath:可执行文件的完整小写路径
  • Name:不带路径信息的文件基本名称
  • OriginalFileName:PE头版本资源中指定的原始文件名,指示开发人员在构建时分配的名称
  • Publisher:通常用于验证二进制文件的来源是否合法。对于恶意软件,此子键通常为空
  • Version:可执行文件的特定构建或发布版本
  • BinaryType:指示可执行文件是32位还是64位二进制文件
  • ProductName:版本资源中的ProductName字段,描述可执行文件所属的更广泛的软件产品或套件
  • LinkDate:从PE头提取的编译时间戳
  • Size:文件大小(字节)
  • IsOsComponent:布尔标志,指定可执行文件是内置OS组件还是第三方应用程序/库

通过对原始Python解析器进行一些调整,我们可以读取此键中存储的信息:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#!/usr/bin/env python3

import sys
from Registry.Registry import Registry

hive = Registry(sys.argv[1])
root = hive.open("Root")

subs = {k.name(): k for k in root.subkeys()}
parent = subs.get("InventoryApplicationFile")

for rec in parent.subkeys():
   vals = {v.name(): v.value() for v in rec.values()}
   print("{}\n{}\n\n-----------\n".format(rec, vals))

InventoryApplicationFile子键

我们还可以使用Registry Explorer等工具以图形方式查看相同的数据: 通过Registry Explorer检查InventoryApplicationFile

如前所述,AmCache仅对每个可执行文件的前31,457,280字节(≈31 MB)计算SHA-1哈希值。为了证明这一点,我们做了一个小实验,期间我们获取了一个小于31 MB的二进制文件(Aralez)和一个大于此值的二进制文件(自定义版本的Velociraptor)。对于第一种情况,整个二进制文件的SHA-1哈希存储在AmCache中。 第一个AmCache SHA-1存储场景

对于第二种场景,我们使用dd实用程序提取Velociraptor二进制文件的前31 MB: 剥离的二进制文件

在检查AmCache上的Velociraptor条目时,我们发现它确实存储了仅为二进制文件的前31,457,280字节计算的SHA-1哈希值。有趣的是,Size值代表了原始文件的实际大小。因此,在处理大文件时,仅依赖AmCache上存储的文件哈希查询威胁情报门户可能不够。因此,在搜索威胁情报门户之前,我们需要检查记录中的文件大小是否大于31,457,280字节。 第二个AmCache SHA-1存储场景

此外,攻击者可能利用此特性故意生成大的恶意二进制文件。这样,即使调查人员发现恶意软件在Windows系统上执行/存在,二进制文件的实际SHA-1哈希仍然未知,使得难以在整个网络中跟踪它并从VirusTotal等公共数据库收集它。

InventoryApplicationFile – 使用案例示例:查找已使用的已删除工具

假设您正在搜索可能的内部威胁。用户否认运行过任何可疑程序,并且任何可疑软件都已从磁盘安全擦除。但在InventoryApplicationFile中,您发现winscp.exe存在于用户的Downloads文件夹中的记录。即使文件已消失,这也告诉您该工具曾在机器上,并且可能在删除之前用于传输文件。在我们的事件响应实践中,我们遇到过类似情况,此键被证明是有用的。

InventoryApplication

InventoryApplication键记录有关先前安装在系统上的应用程序的详细信息。与记录遇到的每个可执行文件的InventoryApplicationFile不同,InventoryApplication专注于那些有安装记录的文件。每个条目由其唯一的ProgramId命名,允许直接链接回相应的InventoryApplicationFile键。此外,InventoryApplication具有以下感兴趣的子键:

  • InstallDate:指示操作系统首次记录或识别应用程序的日期时间字符串
  • MsiInstallDate:仅当通过Windows Installer(MSI)安装时存在;显示应用MSI包的确切时间,直接来自MSI元数据
  • UninstallString:用于删除应用程序的确切命令行
  • Language:开发人员设置的数字区域设置标识符(LCID)
  • Publisher:软件发布者或供应商的名称
  • ManifestPath:UWP或AppX/MSIX应用程序使用的安装清单的文件路径

通过简单更改我们的解析器,我们可以检查此键中包含的数据:

1
2
3
<...>
parent = subs.get("InventoryApplication")
<...>

InventoryApplication子键

当ProgramId同时出现在此处和InventoryApplicationFile下时,它确认可执行文件不仅存在或执行,而且是正式安装的。这种区别有助于我们将临时副本或临时执行与已安装软件分开。下图显示了InventoryApplicationFile下WinRAR软件的ProgramId。

当搜索ProgramId时,我们在InventoryApplication下找到了完全匹配项。这确认了WinRAR确实安装在系统上。

InventoryApplication的另一个有趣细节是它包含一个名为LastScanTime的子键,该子键与ProgramIds分开存储,并保存一个表示Microsoft兼容性评估器上次运行时间的值。这是一个启动compattelrunner.exe二进制文件的计划任务,并且此键中的信息应仅在该任务执行时更新。因此,自上次评估器运行以来安装的软件可能不会出现在这里。LastScanTime值以Windows FileTime格式存储。 InventoryApplication LastScanTime信息

InventoryApplication – 使用案例示例:发现远程访问软件

假设在事件响应期间,您在InventoryApplication键中找到AnyDesk的条目(尽管该应用程序不再安装)。这意味着攻击者可能使用它进行远程访问,然后将其移除以掩盖踪迹。即使从磁盘擦除,此键也证明它曾经存在。我们在真实案例中多次看到这种情况。

InventoryDriverBinary

InventoryDriverBinary键记录系统加载的每个内核模式驱动程序,提供发现可疑或恶意驱动程序所需的基本元数据。在此键下,每个驱动程序都在其自己唯一命名的子键中捕获,包括:

  • FileID:驱动程序二进制文件的SHA-1哈希,开头附加了四个零
  • LowerCaseLongPath:驱动程序在磁盘上的完整小写文件路径
  • DigitalSignature:代码签名证书详细信息。有效、受信任的签名有助于确认驱动程序的真实性
  • LastModified:来自文件系统元数据的文件最后修改时间戳,揭示驱动程序二进制文件最近在磁盘上更改的时间

由于Windows驱动程序以最高权限级别运行,它们经常被恶意软件利用。例如,卡巴斯基之前进行的一项研究表明,攻击者正在利用易受攻击的驱动程序来终止EDR进程。在处理网络安全事件时,调查人员关联每个驱动程序的加密哈希、文件路径、签名状态和修改时间戳。这有助于验证二进制文件是否匹配已知的签名版本,通过发现意外的修改日期检测任何篡改,并标记未签名或异常命名的驱动程序以进行更深入的分析。LOLDrivers等项目有助于识别攻击者在野外使用的易受攻击的驱动程序。 InventoryDriverBinary检查

除了InventoryDriverBinary,AmCache还提供InventoryApplicationDriver键,该键跟踪由特定应用程序安装的所有驱动程序。它包括两个条目:

  • DriverServiceName,标识与已安装驱动程序链接的服务的名称;和
  • ProgramIds,列出负责安装驱动器的程序的程序标识符(对应于InventoryApplication下的键名)。

如下图所示,ProgramIds键可用于跟踪使用此驱动器的关联程序: 通过ProgramIds检查程序信息

InventoryDriverBinary – 使用案例示例:捕获恶意驱动程序

如果系统通过滥用已知易受攻击或恶意驱动程序而受到威胁,您可以使用InventoryDriverBinary注册表键确认其存在。即使驱动程序已被移除或隐藏,此键中的残余可以揭示它曾经被加载,这有助于识别内核级妥协并在调查期间支持时间线重建。这正是发现AV Killer恶意软件的方式。

InventoryApplicationShortcut

此键包含存在于每个用户的"开始"菜单或桌面等文件夹中的.lnk(快捷方式)文件的条目。在每个快捷方式键中,ShortcutPath提供发现时LNK文件的绝对路径。ShortcutTargetPath显示快捷方式指向的位置。我们还可以使用ShortcutProgramId在InventoryApplication键中搜索ProgramId条目(类似于我们对驱动程序所做的操作)。 InventoryApplicationShortcut键

InventoryApplicationShortcut – 使用案例示例:确认已移除应用程序的使用

您发现一个可疑程序已从计算机中删除,但用户声称他们从未运行过它。InventoryApplicationShortcut键显示指向该程序的快捷方式曾出现在他们的桌面上,并且最近被访问过。借助补充证据,例如来自Prefetch分析的证据,您可以确认软件的执行。

AmCache键比较

下表总结了前几小节中呈现的信息,突出了每个AmCache键的主要信息。

包含 指示执行?
InventoryApplicationFile 系统上看到的所有可执行文件的元数据 可能(存在=可能执行)
InventoryApplication 关于正式安装软件的元数据 否(指示安装,不一定执行)
InventoryDriverBinary 关于加载的内核模式驱动程序的元数据 是(驱动程序已加载到内存中)
InventoryApplicationShortcut 关于.lnk文件的信息 可能(结合其他数据确认)

AmCache-EvilHunter

毫无疑问,Amcache.hve是一个非常重要的取证工件。然而,我们找不到任何能有效解析其内容同时为分析人员提供威胁情报的工具。考虑到这一点,我们开发了AmCache-EvilHunter,一个命令行工具,用于解析和分析Windows Amcache.hve注册表配置单元,识别执行证据、可疑可执行文件,并集成卡巴斯基OpenTIP和VirusTotal查找以增强威胁情报。

AmCache-EvilHunter能够处理Amcache.hve文件并按日期范围(使用选项--start--end)过滤记录。还可以使用关键字(--search)搜索记录,这对于搜索攻击者采用的已知命名约定很有用。结果可以保存为CSV(--csv)或JSON(--json)格式。

下图显示了使用以下命令执行AmCache-EvilHunter的基本选项的示例:

1
amcache-evilhunter -i Amcache.hve --start 2025-06-19 --end 2025-06-19 --csv output.csv

输出包含2025年6月19日机器上存在的所有应用程序。最后一列包含文件是否是操作系统组件的信息。 AmCache-EvilHunter的基本用法 CSV结果

分析人员经常面临大量的可执行文件和工件。为了缩小范围并减少噪音,该工具能够使用--find-suspicious选项搜索已知的可疑二进制文件。该工具使用的模式包括常见的恶意软件名称、包含小拼写错误的Windows进程(例如scvhost.exe)、事件期间通常使用的合法可执行文件、单字母/单数字文件名(如1.exe、a.exe)或随机十六进制字符串。下图显示了使用此选项获得的结果;如突出显示,一个svchost.exe文件是操作系统的一部分,另一个不是,如果未删除,则它是收集和分析的良好候选者。 可疑文件识别

恶意文件通常不包含任何发布者信息,并且绝对不是默认操作系统的一部分。因此,AmCache-EvilHunter还附带--missing-publisher--exclude-os选项。这些参数允许轻松过滤可疑二进制文件,并允许快速威胁情报收集,这在事件期间至关重要。

我们的工具与其他提议方法的另一个重要区别是,AmCache-EvilHunter可以查询其识别的哈希的卡巴斯基OpenTIP(--opentip)和VirusTotal(--vt)。这样,分析人员可以快速获得关于样本的洞察,以决定是否继续对工件进行完整分析。 威胁情报查找

该工具的二进制文件可在我们的GitHub页面上用于Linux和Windows系统。

结论

Amcache.hve是Windows取证的基石,捕获丰富的元数据,例如完整路径、SHA-1哈希、编译时间戳、发布者和版本详细信息,用于出现在系统上的每个可执行文件。虽然它不作为确定的执行日志,但其优势在于记录文件存在和路径,使其在发现异常二进制文件、通过针对威胁情报源的哈希查找验证可信度以及将LinkDate值与已知攻击活动关联方面具有无可估量的价值。

为了提取其全部调查潜力,分析人员应将AmCache数据与其他工件(例如Prefetch、ShimCache和Windows事件日志)合并以确认实际执行并构建准确的时间线。将InventoryApplicationFile条目与InventoryApplication进行比较可以揭示文件是仅被丢弃还是正式安装,而识别意外的驱动程序记录可以暴露隐秘的rootkit和持久化机制。利用AmCache-EvilHunter等解析器并交叉参考VirusTotal或专有威胁数据库允许生成IOC和强大的事件响应,使AmCache分析成为基本的DFIR技能。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计