Amcache.hve 是 Windows 10 1703+ 起使用的非标准注册表 hive 文件,头部为“AMCH”,需专用解析器(如 velociraptor 或 RegistryExplorer)处理其自定义二进制结构,不可用 RegLoadKey 或 hivex 直接读取。

Amcache.hve 是什么,为什么不能直接用 C++ 读取
Amcache.hve 是 Windows 系统中由 AmCache 服务生成的注册表 hive 文件(位于 C:\Windows\AppCompat\Programs\Amcache.hve),但它**不是标准注册表 hive 格式**。微软在 Windows 10 1703+ 中改用了自定义二进制结构(类似 registry hive 的变种,但头部、键值布局、字符串编码、哈希索引逻辑均不同),原生 RegLoadKey 或 hivex 库会失败并报错 ERROR_BAD_FORMAT 或直接崩溃。
常见错误现象包括:
- 调用
RegLoadKey返回ERROR_ACCESS_DENIED或ERROR_INVALID_PARAMETER(即使以管理员权限运行) - 用
hivex_open打开后hivex_root返回NULL - 文件头前 4 字节是
AMCH而非标准 registry 的regf,直接按 registry 解析会越界读取
用 C++ 解析 Amcache.hve 的实际路径
目前没有官方 C++ API,可靠做法是复用已验证的开源解析逻辑,而非从零逆向。推荐直接集成 velociraptor 或 RegistryExplorer 的解析器(二者均开源且持续维护),它们已处理了以下关键点:
-
AMCH头校验 + 版本字段提取(v1/v2 结构差异大) - 使用
SHA256或FNV-1a哈希定位键节点(非传统 hbin/hcell 链表) - Unicode 字符串存储为 UTF-16LE 但含嵌入式 null 截断,需按长度字段而非
\0解析 - 时间戳为 Windows FILETIME,但部分字段是“相对启动秒数”,需结合系统启动时间修正
最小可行示例(基于 velociraptor 的 amcache_parser.cc 简化):
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
立即学习“C++免费学习笔记(深入)”;
// 仅读取文件头确认格式
std::ifstream file("Amcache.hve", std::ios::binary);
char header[4];
file.read(header, 4);
if (memcmp(header, "AMCH", 4) != 0) {
// 不是 Amcache.hve
}
uint32_t version;
file.read(reinterpret_cast<char*>(&version), sizeof(version)); // 小端
// version == 1 → 使用旧版偏移计算;== 2 → 启用新 hash table 解析
绕过 C++ 自研:用 Python 绑定或子进程更稳妥
硬写完整解析器在 C++ 中成本高、易出错(尤其处理内存映射碎片、压缩块、未文档化的字段对齐)。生产环境建议:
- 用
pywin32+python-amcache(如 mandiant/AmcacheParser)解析,通过pybind11暴露结果给 C++,避免重复造轮子 - 将解析封装为独立 CLI 工具(如用 Python 写
amcache_dump.py --json),C++ 进程调用std::system()或_popen获取 JSON 输出 - 注意:Python 方案需确保目标机器装有对应 Python 运行时;子进程方式要处理
PATH和权限(如UAC提权后子进程继承令牌)
必须检查的兼容性陷阱
同一份 Amcache.hve 在不同 Windows 版本下结构可能不兼容:
- Win10 1507–1607:使用
v1格式,键名存储在固定偏移的字符串池中 - Win10 1703+:切换为
v2,引入哈希表 + 动态块分配,FileInformation键下的ProgramId字段变为 GUID 字节数组(非字符串) - Win11 22H2:新增
PackageFamilyName字段,长度字段为 8 字节而非 4,C++struct按 4 字节读会错位 - 所有版本中,
TimeStamp字段位置不固定——它可能在键头后第 3 个或第 5 个DWORD,取决于该记录是否包含完整性哈希
最常被忽略的一点:Amcache.hve 文件可能被系统锁定(SHARING_VIOLATION),即使以管理员身份运行,也必须用 CREATE_ALWAYS 复制一份再解析,不能直接 open 原文件。

















