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支持, 实时解析, 恶意软件取证, 数据包嗅探, 文件元数据, 文件存在性验证, 文件时间戳, 注册表解析, 离线解析, 网络安全审计