Anoop-Kumar-Sharma/ShimCache-Parser
GitHub: Anoop-Kumar-Sharma/ShimCache-Parser
一款用于解析Windows ShimCache注册表项的取证工具,输出增强CSV以支持恶意软件分析与事件响应。
Stars: 0 | Forks: 0
# ShimCache 解析器
一个用于解析 Windows 10/11 ShimCache(AppCompatCache)注册表项的取证工具,能够生成包含文件元数据、Authenticode 签名、PE 编译时间戳、SHA-256 哈希值以及原始文件名的增强型 CSV 输出,适用于恶意软件分类与事件响应。
## 目录
- 什么是 ShimCache?
- 为什么它在取证中很重要
- 功能特性
- 构建
- 使用方法
- 选项
- 输出列
- 示例
- 取证注意事项
- 限制
## 什么是 ShimCache?
ShimCache,正式名称为 **应用程序兼容性缓存**,是 Windows 子系统的一个组件,用于跟踪操作系统遇到的可执行文件。它存储在注册表中,路径如下:
```
HKLM\SYSTEM\ControlSet001\Control\Session Manager\AppCompatCache\AppCompatCache
```
每当操作系统在进程创建、目录枚举或某些 API 调用期间观察到一个可执行文件时,都会向缓存写入一项条目。该缓存会在重启后仍然保留,是证明某个特定二进制文件曾在系统上存在过的最可靠证据之一,即使该文件已被删除。
## 为什么它在取证中很重要
- **证明文件存在** — 条目确认某个二进制文件曾在磁盘上存在,即使已被删除。
- **近似时间线** — `LastModified` 时间戳反映了文件被 Windows 缓存时的最后写入时间,有助于构建执行时间线。
- **执行指示器** — 某些 Windows 版本会存储执行标志,表明该二进制文件是否已被实际启动。
- **恶意软件检测** — 将缓存路径与增强元数据(签名状态、原始文件名、PE 编译时间)结合,可以发现那些被重命名、未签名或行为异常的二进制文件,这些文件在常规分析中容易被忽略。
## 功能特性
| 功能 | 说明 |
|---|---|
| 实时注册表解析 | 直接从当前机器的 `HKLM\SYSTEM` 读取 |
| 离线 hive 解析 | 通过 `RegLoadKey` 加载外部 SYSTEM hive 文件 |
| 多 ControlSet 支持 | 可解析所有 ControlSet,或通过 `-c` 指定特定项 |
| Authenticode 验证 | 为每个二进制文件报告 `Signed`、`Unsigned` 或 `FileNotFound` |
| 文件元数据 | 文件大小、创建时间、最后访问时间 |
| PE 编译时间 | PE COFF 头中的 `TimeDateStamp`(编译器/链接时间,而非文件系统时间) |
| SHA-256 哈希 | 全文件哈希,用于 VirusTotal 联动和威胁情报查询 |
| OriginalFilename | 从 PE 版本信息资源提取 — 文件重命名时不会改变 |
| CSV 输出 | 带 UTF-8 BOM 编码,兼容 Excel |
| 按时间戳排序 | 通过 `-t` 选项按 `LastModified` 降序排列 |
## 系统要求
- **操作系统:** Windows 10 或 Windows 11
- **权限:** 管理员权限(实时注册表访问和离线 hive 加载需要)
- **编译器:** MSVC(Visual Studio 2019+)或 MinGW-w64(支持 C++17)
- **依赖项:** 仅使用系统库,无第三方依赖
## 构建
### MSVC(Visual Studio 开发者命令提示符)
```
cl /EHsc /std:c++17 /O2 AppCompatCacheParser.cpp ^
/link advapi32.lib wintrust.lib crypt32.lib shlwapi.lib version.lib
```
### MinGW-w64
```
g++ -std=c++17 -O2 AppCompatCacheParser.cpp -o AppCompatCacheParser.exe ^
-ladvapi32 -lwintrust -lcrypt32 -lshlwapi -lversion
```
## 使用方法
```
AppCompatCacheParser.exe --csv [options]
```
`--csv` 是唯一必需参数,其他所有选项均为可选。
## 选项
| 标志 | 描述 |
|---|---|
| `-f <路径>` | 离线 SYSTEM hive 文件路径。若省略则使用实时注册表 |
| `-c <数字>` | 仅解析指定的 ControlSet 编号(例如 `1`、`2`)。默认:全部 |
| `-t` | 按 `LastModified` 降序排序 CSV 输出(最新优先) |
| `--csv <目录>` | CSV 输出目录。若不存在会自动创建(**必需**) |
| `--csvf <文件>` | 覆盖自动生成的文件名。默认:`YYYYMMDD_HHMMSS_AppCompatCache.csv` |
| `--nosig` | 跳过所有磁盘增强(签名、文件元数据、PE 时间、SHA-256、OriginalFilename)。当目标文件不在分析机上时使用 |
| `--debug` | 将详细诊断信息打印到标准错误,包括原始偏移量和解析决策 |
| `-h` / `--help` | 显示帮助信息并退出 |
## 输出列
| 列名 | 说明 |
|---|---|
| `ControlSet` | 读取该条目的注册表 ControlSet(例如 `1`、`2`) |
| `CacheEntryPosition` | 零基插入顺序。数值越小表示插入越晚 — ShimCache 采用后进先出(LIFO)结构 |
| `Path` | 缓存中存储的可执行文件完整 NT 路径 |
| `LastModified` | Windows 在缓存插入时记录的文件最后写入时间(UTC) |
| `Executed` | 执行标志:`Yes`(标志置位)、`No`(标志清除)或 `N/A`(该条目中不存在)注意:标志缺失并不一定意味着该文件从未执行过 |
| `Signature` | Authenticode 结果:`Signed`、`Unsigned` 或 `FileNotFound` |
| `FileSize` | 增强时文件的大小(字节) |
| `CreationTime` | 文件系统记录的创建时间(UTC) |
| `LastAccessTime` | 文件系统记录的最后访问时间(UTC) |
| `PECompileTime` | PE COFF 头中的 `TimeDateStamp` 字段(UTC)。这是由编译器或链接器设置的,而非文件系统。`PECompileTime` 与 `LastModified` 之间的差异可能表明存在时间戳篡改或重打包行为 |
| `SHA256` | 文件的十六进制编码 SHA-256 哈希值,用于 VirusTotal 查询或内部威胁情报关联 |
| `OriginalFilename` | PE 版本信息资源中的 `OriginalFilename` 值。该值在编译时嵌入,**文件重命名时不会改变**。与 `Path` 中的文件名不匹配是重命名或伪装可执行文件的强指示器 |
## 示例
**解析当前机器上的实时注册表:**
```
AppCompatCacheParser.exe --csv C:\Output
```
**解析实时注册表并按最新结果排序:**
```
AppCompatCacheParser.exe --csv C:\Output -t
```
**仅解析 ControlSet001:**
```
AppCompatCacheParser.exe --csv C:\Output -c 1
```
**从取证镜像解析离线 SYSTEM hive:**
```
AppCompatCacheParser.exe -f D:\Evidence\SYSTEM --csv C:\Output
```
**离线解析且不进行文件增强(速度更快,不读取目标文件):**
```
AppCompatCacheParser.exe -f D:\Evidence\SYSTEM --csv C:\Output --nosig
```
**使用自定义输出文件名:**
```
AppCompatCacheParser.exe --csv C:\Output --csvf suspect_shimcache.csv
```
**带调试信息的完整运行并使用自定义文件名:**
```
AppCompatCacheParser.exe --csv C:\Output --csvf suspect.csv --debug
```
## 取证注意事项
**OriginalFilename 作为重命名检测器**
`OriginalFilename` 字段嵌入在 PE 版本信息资源中,编译时即固定。当攻击者重命名恶意二进制文件以伪装成合法进程(例如将载荷重命名为 `svchost.exe`)时,`OriginalFilename` 仍保留原始编译名称。将 `OriginalFilename` 与 `Path` 中的文件名进行比较,是快速筛查伪装恶意软件的最有效方法之一。
**PECompileTime 与 LastModified**
`PECompileTime` 是 PE COFF 头中的 `TimeDateStamp`,反映二进制文件的编译或链接时间。主流厂商的合法软件通常具有早于文件 `LastModified` 时间的编译时间。若 `PECompileTime` 显著晚于预期发布日期,或与 `LastModified` 完全一致,可能表明该二进制文件被重打包、修补或篡改了时间戳(timestomping)。
**缓存插入顺序**
ShimCache 是一种后进先出(LIFO)结构。位置 `0` 的条目是最近插入的。按 `CacheEntryPosition` 升序排序可得到最新观察到的可执行文件列表,有助于缩小与已知事件时间窗口相关的分析范围。
**系统目录外的未签名二进制文件**
合法的 Windows 和应用程序二进制文件几乎总是经过签名。对于位于 `%SystemRoot%` 或 `%ProgramFiles%` 之外(尤其是用户可写位置,如 `%APPDATA%`、`%TEMP%` 或用户配置文件目录)的未签名结果,应立即展开调查。
**`--nosig` 用于离线分析**
在分析从其他机器获取的 hive 时,缓存中记录的文件路径在分析工作站上可能不存在。此时应使用 `--nosig` 跳过增强阶段,避免在 `Signature` 列中产生虚假的 `FileNotFound` 结果。
## 限制
- 仅支持 Windows 10 / 11 ShimCache 格式(`10ts` 条目签名)。
- SHA-256 计算按顺序读取整个文件,较大的二进制文件会增加总运行时间。
- `Executed` 标志在所有 Windows 10/11 版本中并非始终一致填充;其缺失并不构成未执行的定论。
- Authenticode 验证使用本地证书存储,不执行在线吊销检查(`WTD_REVOKE_NONE`)。自签名后已被吊销的证书仍可能报告为 `Signed`。
- 必须以管理员身份运行。标准用户账户不具备 `RegLoadKey`(`SE_RESTORE_NAME` / `SE_BACKUP_NAME`)所需权限。
标签:AppCompatCache, Authenticode签名, CSV输出, HTTPS请求, HTTP工具, PE编译时间, SHA-256哈希, ShimCache, SYSTEM注册表, Windows取证, 三级缓存, 事件追踪, 原始文件名, 可执行文件追踪, 多ControlSet支持, 实时解析, 恶意软件取证, 数据包嗅探, 文件元数据, 文件存在性验证, 文件时间戳, 注册表解析, 离线解析, 网络安全审计