终端取证响应工具之 Windows Amcache 文件解析工具 AmcacheParser
搞过 Windows 终端取证的朋友都知道,拿到一台涉案机器或者做应急响应,第一件事就是找程序执行痕迹。系统里能留存程序执行记录的地方不少,比如 Prefetch、UserAssist、ShimCache(AppCompatCache),还有一个经常被忽略但信息量极大的家伙——Amcache.hve。今天要聊的 AmcacheParser,就是专门用来啃这块硬骨头的解析工具。
Amcache.hve 是 Windows 8 及以上系统新增的注册表 hive 文件,位于C:\Windows\AppCompat\Programs\Amcache.hve,它会记录系统上安装过的应用程序、曾经执行过的 PE 文件路径、文件大小、版本信息、甚至部分文件的首次安装时间和最后修改时间。在取证调查里,往往能靠它还原出“这台机器上到底跑过什么程序、什么时候跑的、文件从哪来”这类关键事实。对做应急响应、勒索软件追踪、内部违规调查的人来说,AmcacheParser 几乎是标配工具。
这篇文章不打算写说明书式的参数罗列,我想结合自己在实际案件和演练中的使用体会,把 Amcache 的原理、工具用法、字段解读、坑点排查一次讲透,让没接触过的朋友也能照着走一遍完整流程。
1. 为什么 Amcache.hve 值得盯死——案件中的“程序痕迹之王”
先说个实际场景。某天接到一起终端异常告警,业务系统反映内网有机器频繁外联,且运行了不明脚本。安全人员到场后,如果只翻 Prefetch,会发现只记录了最近 128 个已执行程序,而且默认只有 Windows 10 及少数系统开启了完整的 Prefetch 记录;查 ShimCache 呢,信息量虽大但缺少时间戳和文件路径的完整映射;用户目录下的 UserAssist 又只覆盖 Explorer 启动过的 GUI 程序。这时候 Amcache.hve 往往能补上重要的一环。
Amcache.hve 在 Windows 8/8.1/10/11 上常驻,它会记录:
- 通过 Windows 安装程序、MSI、补丁或部分软件分发机制安装的应用程序信息;
- 系统在开机或程序启动时扫描到的 PE 文件的路径、哈希、版本、描述、公司名、文件大小、修改时间;
- 部分与应用程序兼容性相关的驱动、系统组件信息;
- 在某些系统中,甚至能记录 PowerShell 脚本执行时调用的宿主进程信息(取决于具体进程是否落入扫描范围)。
简单说,它就是系统为了“AppCompat(应用程序兼容性)”这个目的而维护的一本流水账。由于它不像 Prefetch 那样仅保留少量最近记录,也不像 ShimCache 那样不保存文件大小和版本,Amcache 在时间跨度、字段覆盖和文件级信息完整性上都有独特价值。
我在一次模拟勒索软件应急处置演练中,通过 Amcache.hve 直接找到了攻击者投放的 dropper 落盘路径,时间戳与网络连接日志完全对得上,再结合 Prefetch 里的执行记录和 Sysmon 日志,整个攻击链路前后 20 分钟就还原清楚了。说它是“程序痕迹之王”有点夸张,但确实在很多标准取证流程里,它是第一个要解析的注册表 hive。
1.1 Amcache.hve 的存储机制与取证意义
Amcache.hve 本质上是一个注册表 hive 文件,挂在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\AppCompatCache之下的AppCompat子键之外的独立文件里。其内部结构主要有:
Root\InventoryApplication:记录通过安装程序安装的应用程序,包含 InstallDate、Publisher、Version、ProductName 等。Root\InventoryApplicationFile:记录安装或运行过程中被发现的应用程序文件,包含路径、文件版本、大小、修改时间等。Root\InventoryDriver:记录驱动相关文件。Root\InventoryDeviceContainer:记录设备容器信息(通常不太用)。- 另外还有
Root\InventoryApplicationShortcut、Root\InventoryApplicationProgram等子键(不同系统版本略有差异)。
取证上最关心的是前两个。InventoryApplication 能确认某软件的安装时间、版本和发布者,而 InventoryApplicationFile 能关联到具体文件路径和文件属性。在排查恶意软件时,一旦找到可疑文件路径,接着提取该文件,计算哈希与沙箱报告比对,基本就能定性质。
1.2 与 Prefetch / ShimCache 的分工差异
| 痕迹源 | 记录内容 | 局限 | Amcache 的互补点 |
|---|---|---|---|
| Prefetch | 最近执行的程序及运行次数 | 默认仅保留最近 128 条,且依赖任务计划程序服务 | 时间跨度更大,包含安装类信息 |
| ShimCache | 已执行 PE 的路径、最后修改时间 | 无文件大小、版本,且时间字段精度有限 | 字段更丰富,路径与版本信息完整 |
| UserAssist | 通过 Explorer 启动的 GUI 程序 | 不含非 GUI 程序,依赖用户配置 | 可覆盖后台服务、命令行工具等 |
| Amcache | 安装程序信息 + PE 文件扫描记录 | 并非所有程序都会记录,依赖触发机制 | 独有的版本、安装时间、文件属性信息 |
这里要提醒一句:Amcache 不是万能的。它的写入逻辑与“程序触发 Application Compatibility”机制有关,有些程序执行后并没有产生 Amcache 记录,尤其是绿色免安装工具、纯脚本、内存执行载荷。所以实战中一定不能孤立依赖 Amcache,要跟 Prefetch、ShimCache、日志、内存镜像交叉验证。
2. AmcacheParser 获取与环境准备——先搞清楚版本和依赖
AmcacheParser 是取证工具合集 KAPE 中独立提供的一个命令行工具,同时也会打包在官方发布的取证工具压缩包里。这一点对取证环境很重要:能用静态编译版本就不要用需要安装运行时环境的版本,避免在被调查机器上引入额外依赖。
2.1 下载与完整性校验
从官方渠道下载工具包,解压后建议先做几件事:
- 用官方公布的 SHA-256 哈希校验文件完整性,防止下载被篡改;
- 将工具放入工作目录,比如
D:\Forensics\Tools\AmcacheParser,不要在中文路径下运行,有些旧版本解析工具对中文路径支持不稳定; - 确认工具位数与待解析系统匹配。Windows 10 64 位系统的 Amcache.hve 通常是 64 位格式,工具本身一般以 64 位版本运行为主,但部分场景需要在 32 位镜像环境下处理,注意工具包内是否包含对应版本。
提示:校验哈希不是走过场。恶意样本分析中,工具本身被污染是致命问题。我习惯把官方哈希值和下载时间记录在案件笔记里,这也是取证链完整性的要求。
2.2 系统环境要求
AmcacheParser 是 .NET 编写的命令行工具,Windows 10/11、Windows Server 2016 及以上的标准取证工作站都能直接运行,通常不需要额外安装桌面版 .NET 运行时,但个别精简系统需要提前装好对应版本的 .NET Framework 或 .NET Core(在取证工作站上提前验证一次即可)。
另外,工具既可以解析离线镜像中提取出的 Amcache.hve,也可以直接解析在线系统的文件。但从取证规范角度,强烈建议优先做离线解析——先对磁盘做镜像,再从镜像中提取 hive,解析完后整个过程可复现、可审计。在线解析虽然省事,你无法保证系统在解析过程中不会对 hive 产生新的写入,证据状态就不可控了。
2.3 提取 Amcache.hve 的正确姿势
这一步很多人会踩坑。Amcache.hve 不像注册表主键那样在执行reg save时必然弹出“文件被占用”提示,但直接复制仍可能遇到占用或非一致状态。正确做法有以下几种:
- 从离线镜像中挂载卷后,用取证专用工具(比如挂载镜像的只读工具)直接导出
\Windows\AppCompat\Programs\Amcache.hve; - 如果只能在线操作,使用
reg.exe save HKLM\...不行(因为 Amcache 不是通过注册表路径直接暴露的),正规做法是用工具如“RawCopy”或“NTFS 解析库”按文件方式复制; - 某些商用取证平台可直接在镜像文件系统树中定位该文件,右键导出。
只要是离线获取的文件,后续解析结果不会受系统活动影响。
3. AmcacheParser 命令行参数逐个拆解与选择逻辑
工具本身的使用并不复杂,但参数选择会影响输出物和价值。先把常用参数列出来:
AmcacheParser.exe -f "E:\case001\Amcache.hve" -o "E:\case001\output" --csv "E:\case001\output"这是最基础的用法:-f指定文件路径,-o指定输出目录,--csv指定 CSV 输出位置。
3.1 核心参数表格
| 参数 | 作用 | 建议场景 |
|---|---|---|
-f | 指定 Amcache.hve 文件路径 | 必填 |
-o | 指定输出文件目录 | 必填 |
--csv | 输出 CSV 文件到指定目录 | 常规取证必用 |
--json | 输出 JSON 格式结果 | 需要二次脚本处理时 |
-b | 指定时间范围过滤条件 | 缩短调查时间窗口时 |
-n | 禁用进度显示,适合无人值守 | 批处理任务 |
--he | 仅导出存在问题的记录?实际上是--hex相关参数,建议查官方文档后使用 | 不常用 |
--vl | verbose log,生成详细日志 | 排查解析异常时 |
注意,不同版本的工具参数可能略有差异,建议先执行AmcacheParser.exe --help看一眼当前版本支持哪些参数。有些“经验帖”里写的参数在当前版本可能已经废弃或改名,照搬会直接报错。
3.2 为什么默认推荐 CSV 输出
CSV 是取证分析中最通用的交换格式,能直接导入 Excel、Timeline Explorer、SQLite、ElasticSearch 等工具。单一 JSON 文件在数据量大时反而不方便人工翻阅。我一般会同时输出 CSV 和 JSON:CSV 用来快速排序、筛选、人工审阅,JSON 用来写脚本自动关联其他证据源。
还有一个容易被忽略的隐藏惊喜:AmcacheParser 会自动生成一个名为$AmcacheParserOutput.txt.log的日志文件,里面会记录解析了多少条记录、是否存在损坏、跳过哪些条目。案件复盘时,这个日志能帮你证明“不是解析器漏数据,而是 hive 本身的结构如此”。
3.3 输出文件解析
运行成功后,输出目录会出现多个 csv 文件,命名类似:
InventoryApplication.csvInventoryApplicationFile.csvInventoryDriver.csvInventoryDeviceContainer.csvInventoryApplicationShortcut.csvInventoryApplicationProgram.csv- 其他辅助文件
需要重点打开的是前两个。其余文件在特定场景(比如查驱动类恶意软件、外设管控绕过)才会用到。
4. 一次完整的解析实操——从 hive 到报告
讲一堆理论不如带大家跑一遍完整流程。以下是一个模拟案件环境中,我是怎么从零开始完成 Amcache 解析并输出结论的。
4.1 场景设定
模拟项目 X:某公司一台财务终端疑似被植入远程控制木马,安全日志显示有异常外联,告警时间集中在某工作日上午 10:00 至 11:00。拿到该终端磁盘镜像后,我先挂载镜像,将Windows\AppCompat\Programs\Amcache.hve导出到案件目录。
先记录文件元数据:
C:\> file Amcache.hve Amcache.hve: MS Windows registry file, NT little-endian, version 1.5这意味着文件格式正常,可以开始解析。
4.2 执行解析命令
D:\Forensics\Tools\AmcacheParser\AmcacheParser.exe -f "E:\case001\Amcache.hve" -o "E:\case001\amcache_output" --csv "E:\case001\amcache_output"在真实环境中,输出目录名我会带上案件编号,比如case001_amcache_output,避免后面多个案件数据混淆。
运行完成后,打开InventoryApplicationFile.csv,用时间筛选器定位告警时间段前后两小时(09:30 至 11:30),并且按File Path排序浏览。
4.3 读取 CSV 的关键列
打开 CSV 后,我习惯先关注以下列:
KeyPath:记录所在注册表项,反映了文件归属的子键结构;File Path:文件完整路径;File Size:大小;File Version/Product Version:版本信息;Publisher/Product Name:发布者和产品名;Modified Time/File Creation Time:关键时间戳;SHA1/SHA256(部分版本输出中会包含):文件哈希;Program Name/Link Date:安装或关联信息。
在模拟案例中,我按时间范围筛完,发现一个路径十分可疑:C:\Users\Public\Temp\svch0st.exe。这个文件一看就是典型的伪装文件名——正常系统服务svchost.exe绝不会出现在Public\Temp目录下。
此时与镜像提取出来的实际文件哈希比对:
sha256sum D:\case001\mount\Users\Public\Temp\svch0st.exe如果哈希与威胁情报平台上的已知木马样本匹配,案件主线基本就定了。
4.4 时间线关联技巧
Amcache 记录的时间不一定就是执行时间。更要小心的是,InventoryApplicationFile 里的时间通常是“最后一次写入/修改时间”而不是“首次运行时间”。在还原时间线时,需要结合:
- Prefetch 中的最近运行时间;
- ShimCache 的 Last Modified 时间;
- 文件系统中的文件创建时间、最近访问时间;
- 网络连接日志、DNS 日志、进程创建日志(如果有 Sysmon)。
我见过不少新手把 Amcache 的 Modified Time 直接当成“病毒运行时间”写进报告,结果被复核人员挑出硬伤。这条务必记住。
5. 解析结果里该重点看什么——三张表、五个问题
分析 Amcache 数据不只是“找出可疑文件”,而是要回答调查中的几个核心问题。
5.1 这台机器装过什么软件?什么时候装的?
通过InventoryApplication.csv,可以列出系统安装的第三方应用程序。这里有InstallDate字段,记录的是安装日期。在员工违规安装软件、恶意软件通过捆绑安装、以及推断攻击者持久化技巧时非常有用。
举个例子:排查内部违规时,你发现InventoryApplication.csv里有一条ProductName为“TeamViewer”,InstallDate是上个月 15 号,但公司软件资产台账里没有这个记录——一个很好的调查切入点就出现了。纯靠查文件系统未必能把安装时间找得这么干净,Amcache 直接给了答案。
5.2 特定时间窗口内出现过哪些新文件?
InventoryApplicationFile.csv是所有文件中数量最多、价值最高的。取证时我会专门写一个筛选规则:
- 时间窗口:锁定告警时间的前后 2 小时;
- 路径特征:
Temp、Downloads、Public、Users\*\AppData\Local\Temp等目录; - 文件名特征:拼写仿冒系统进程的文件名,比如
svch0st、winlog0n、expl0rer; - 双扩展名:
report.pdf.exe这类在 Explorer 中默认隐藏真实扩展名的文件; - 未知发布者:Publisher 路径不在常规软件列表内的文件。
这些规则看似基础,但在海量数据中快速缩小范围非常有效。
5.3 哪些程序在“不该出现”的路径下运行过?
另一种典型手法是“无文件落地”以外的白利用和落盘型攻击。如果 Amcache 记录了一个以.dll结尾的InventoryApplicationFile条目,但对应路径在C:\Windows\System32\Tasks\下,优先级就应该提到最高。因为系统计划任务的命令通常不指向 DLL,这是可疑的横向渗透或持久化特征。
5.4 驱动层面有没有问题?
InventoryDriver.csv记录的是内核驱动相关信息。在内核级 Rootkit 调查、防御绕过工具的排查中,这部分数据可能有独特价值。比如某杀软绕过工具通过加载未签名驱动实现防护关闭,InventoryDriver里详尽的驱动文件名、版本、路径就能提供线索,配合事件日志里的驱动程序加载事件,形成证据链。
5.5 前三个问题的答案都藏在“全量数据”里
在实际工作中,我不会只回答“哪个文件可疑”,更常做的是把 Amcache 全量数据做成“已安装软件软件清单+文件执行痕迹时间线”,供调查人员做行为画像。这种全量整理的价值,在长期潜伏型攻击、多阶段攻击链还原中会逐渐体现出来。
6. 高频问题与排查记录——AmcacheParser 实战避坑
下面这些坑,都是我实际使用中和同行交流中被反复提到的,基本每条都有真实发生过的教训。
6.1 解析报错:“The system cannot find the file specified”
排查思路:优先检查-f的路径是否真实存在,是否包含特殊字符或长路径。Amcache.hve 本身没有后缀名,曾有人把它误命名为Amcache.hve.txt导致解析失败。另外,如果从镜像中提取时工具生成了空文件,解析器也会报这个错。
用十六进制编辑器打开查看文件头,确认是否为regf签名。如果不是,说明提取过程可能发生了文件损坏或提取错位。
6.2 输出 CSV 文件出现乱码或中文路径显示异常
这个现象通常不是工具的问题,而是 Excel 打开 UTF-8 编码 CSV 时默认使用 ANSI 编码所致。解决方法是:不要直接双击 CSV,而是用 Excel 的“数据 - 从文本/CSV”导入,选择 UTF-8 编码。或者用 Notepad++ 将 CSV 转换为带 BOM 的 UTF-8。
如果你在脚本里处理 CSV,统一用encoding='utf-8-sig'读取,避免出现\ufeff开头的问题。
6.3 为什么某些明显运行过的程序在 Amcache 里完全没记录?
这个问题在应急响应群里被反复提问。原因通常有几种:
- 系统版本较老(Windows 7 及以前没有 Amcache.hve);
- 程序在运行前被系统兼容性引擎判定为“不兼容”,没有写入 InventoryApplicationFile;
- 程序是纯脚本(PowerShell、VBScript、JavaScript),宿主进程(如 powershell.exe、wscript.exe)可能被记录,但脚本本身不生成PE文件条目;
- 攻击者使用了无文件技术,直接从内存加载;
- 程序通过短路径、子系统调用等方式执行,没有触发 AppCompat 扫描。
遇到这种情况,正确的排查姿势是:先把 Amcache 与 Prefecth、ShimCache、事件日志进行时间线关联,再决定是否需要做内存镜像分析,而不是断言“攻击者没执行任何恶意程序”。
6.4 时间字段到底应该信哪个?
Amcache.hve 的时间字段记录的是文件的 Modified Time 或 Install Date,不是执行时间。如果你在InventoryApplicationFile.csv里看到的Modified Time与告警时间完全吻合,也不能直接断定“这个恶意文件在该时间被运行”,只能说“该文件在那个时间被系统扫描过、并且文件属性记录被写入到 hive”。
更可靠的时间线确认方式是查看:
- Prefetch 的
.pf文件时间戳; - USN Journal(如果还在);
- 该文件所在目录的 NTFS 变更记录;
- 进程执行相关的事件日志(如 Sysmon EventID 1)。
多次演练中我已经验证过:Amcache 时间只能作为“弱证据”,真正定案还需要“强证据”支撑。
6.5 文件被删除后 Amcache 记录还在吗?
在大多数情况下,Amcache 里的记录不会因为文件被删除而自动消失。这一点对取证极其重要——攻击者删掉磁盘上的恶意文件,却很难清干净 Amcache 里的历史记录,除非他手动删除 hive 文件或使用专门的痕迹清理工具。
但要注意:有些安全工具或系统清理软件会定期清理AppCompat\Programs目录,导致记录缺失。见到 Amcache.hve 文件体积异常小或缺失,就要高度警惕“清理行为”的存在。
6.6 解析速度慢,等了十分钟没响应
大镜像上 Amcache.hve 可能几十 MB 甚至上百 MB,解析本身并不慢,但如果加了--json且输出目录在机械硬盘上,大量写盘会拖慢整体速度。我一般把输出目录放在 SSD 工作盘,并且先用--csv快速跑出结果,确认无误后再按需生成 JSON。
还有一点:部分版本解析 Amcache.hve 时会在同一个目录生成额外的$Boot文件,如果杀软实时扫描开着,可能反复扫描这个临时文件,导致速度骤降。在取证工作站上跑这类解析工具时,我习惯把案件目录加入杀软白名单。
7. 从 Amcache 到完整证据链——数据关联的扩展技巧
单一工具的解析结果,永远只是证据链上的一环。如何把 AmcacheParser 的输出与整个案件数据联动起来,才是真正体现取证分析师水平的地方。
7.1 制作“程序出现 - 文件落盘 - 网络外联”三合一时间表
我常用的做法是:
- 把
InventoryApplicationFile.csv中可疑记录的路径、时间提取出来; - 从镜像中提取对应文件,计算 SHA-256;
- 把哈希放到本地方便索引的地方,或者与威胁情报平台比对;
- 将文件路径和哈希放入日志搜索引擎,与终端日志、防火墙日志、DNS 日志关联查找同一时期的外联记录。
当三者时间线吻合时,报告的说服力远比单点证据强得多。
7.2 用脚本批量提取与人工复核结合
AmcacheParser 的输出很适合用 Python 做二次过滤。以下是我常用的一个小脚本,用来从 CSV 中筛选可疑路径:
import pandas as pd df = pd.read_csv("InventoryApplicationFile.csv", encoding="utf-8-sig") keywords = ["temp", "public", "download", "appdata", "recycle", "syswow64"] mask = df["File Path"].astype(str).str.lower().apply( lambda p: any(k in p for k in keywords) ) interesting = df[mask].copy() interesting.to_csv("suspicious_files.csv", index=False, encoding="utf-8-sig")脚本本身不复杂,重点是把筛选条件沉淀下来,下次新案件直接复用。
7.3 在时间线上补充 Amcache 数据
如果你用 Timeline Explorer 这类工具,可以直接把 AmcacheParser 输出的 CSV 拖进去生成时间线视图。操作要点:
- 导入时选择多列时间字段;
- 将
File Path、Product Name设为显示列; - 按可疑关键词高亮;
- 与 Prefetch、ShimCache、Sysmon 日志合并成单条时间线后,按时间顺序筛选。
这样,一个恶意程序的“出现-落盘-执行-外联”路径就会自然浮出水面。
7.4 关联内存镜像分析的必要性
Amcache 记录的是磁盘上的静态痕迹,面对无文件攻击、内存中存在但未落盘的 payload,Amcache 就无能为力了。此时内存镜像里的进程列表、网络连接、注入模块才是关键证据。Amcache 的价值在于“告诉我该提取哪个文件”,内存镜像的价值在于“告诉我攻击者此刻正在做什么”,两者可形成完整画面。
有一次真实案件里,Amcache 发现了一个未出现在任何日志中的可疑驱动文件,我接着在内存镜像里找到了该驱动的加载记录,两个证据互相印证,调查结论才站得住。
8. 实战中的几点个人体会(今天就聊到这儿)
工具永远只是辅助,分析思路和经验积累才是核心。AmcacheParser 本身操作简单,只要参数用对,几分钟就能出结果,难点在于从一堆看似普通的程序列表中,精准挑出那条被精心伪装的可疑记录。
我的几条心得分享给大家:
- 拿到镜像后,Amcache.hve 和 Prefetch 目录要放在最优先提取清单的前三行,成本极低、收益很高;
- 每次案件结束,把可疑程序路径、文件名伪装手法、筛选规则沉淀成知识库,时间越长,排查效率越高;
- Amcache 不是“执行记录”而是“兼容性扫描记录”,写分析报告时用词务必严谨,别被质疑报告专业性;
- 解析完 CSV 后,至少用两种不同工具交叉验证一次。因为不同版本、不同作者的解析器对 hive 内部结构的理解有差异,输出结果偶尔会不一致,交叉验证能帮你发现工具层面的 bug。
我现在的工作流里,AmcacheParser 已经集成到案件自动化处理脚本中:挂载镜像 → 提取关键文件 → Amcache 解析 → Prefetch 解析 → ShimCache 解析 → 输出统一时间线。整个过程在 SSD 上跑完一个典型案件镜像,大概几分钟到十几分钟。如果你刚接触终端取证,建议先拿一个自己机器的 Amcache.hve 练手,对照工具输出和实际安装过的软件,逐步建立“数据-现实”的对应感。
下次遇到 Windows 终端上的程序痕迹问题,别只盯着 Prefetch 了,把 Amcache.hve 加进你的取证清单,这步棋基本不会亏。