《Windows Internals》10.1.23 Registry filtering:为什么杀软、加密软件、WoW64 重定向、容器虚拟化都能在不改应用代码的前提下“插手”注册表操作?
2026/4/6 0:04:56 网站建设 项目流程
个人主页杨利杰YJlio❄️个人专栏《Sysinternals实战教程》 《Windows PowerShell 实战》 《WINDOWS教程》 《IOS教程》《微信助手》 《锤子助手》 《Python》 《Kali Linux》《那些年未解决的Windows疑难杂症》让复杂的事情更简单让重复的工作自动化《Windows Internals》10.1.23 Registry filtering为什么杀软、加密软件、WoW64 重定向、容器虚拟化都能在不改应用代码的前提下“插手”注册表操作《Windows Internals》10.1.23 Registry filtering为什么杀软、加密软件、WoW64 重定向、容器虚拟化都能在不改应用代码的前提下“插手”注册表操作》1. 先说结论Registry filtering 本质上就是“注册表操作拦截链”2. 为什么说杀软、加密软件、WoW64、容器虚拟化都能“插手”因为它们不需要改应用只要挂在回调链上3. Registry callback model 到底是什么可以把它理解成“注册表的可编程检查站”4. Altitude 为什么这么重要因为过滤器不是只有一个而是要排队执行4.1 这意味着什么4.2 为什么这件事特别重要5. 过滤器到底能做什么书里其实给了 4 种非常硬核的能力5.1 第一类完全接管5.2 第二类重定向5.3 第三类改输出5.4 第四类打上下文标签6. 为什么 WoW64 重定向是最典型的例子因为它说明“同一段应用代码能被系统偷偷导向另一棵注册表”6.1 为什么这很有启发7. 容器虚拟化为什么也能做到“看起来在写本机注册表实际上写到别处”答案就是 VReg Configuration Manager7.1 Namespace redirection7.2 Registry merging8. \Registry\WC 是什么为什么它会成为容器注册表虚拟化的关键根9. differencing hive 为什么这么关键因为它让“虚拟层覆盖基础层”变成了现实10. 从桌面支持和系统学习视角这一节到底有什么现实价值10.1 它帮我真正理解“为什么有些产品能不改程序就改变结果”10.2 它帮我理解多种安全/管理产品为什么必须讲“执行顺序”10.3 它帮我理解 WoW64、容器虚拟化、本地命名空间为什么都不是“应用自动适配”10.4 它帮我理解“看到的路径”和“真正被处理的路径”可能完全不是一回事11. 最容易误解的 6 个点我帮你一次理顺11.1 误区一过滤器只能“观察”不能改写11.2 误区二多个过滤器装一起顺序无所谓11.3 误区三WoW64 重定向只是文件系统的事11.4 误区四容器虚拟化只是“给注册表换个根”11.5 误区五过滤器只对单次操作生效后续没记忆11.6 误区六这是容器或安全产品的专属冷门机制12. 我的学习理解这一节真正打碎的是“注册表调用 Configuration Manager 原样执行”的错觉13. 总结提升下一篇预告《Windows Internals》10.1.23 Registry filtering为什么杀软、加密软件、WoW64 重定向、容器虚拟化都能在不改应用代码的前提下“插手”注册表操作》学到《Windows Internals》10.1.23 Registry filtering这一节时我最大的感受是Windows 注册表并不是“应用一调用 API配置管理器就机械执行”的单线条系统。真正的现实是注册表操作在到达最终目标之前还可能被别的内核组件“观察、改写、重定向、接管、打标签”。这也正是为什么很多我们平时觉得“像魔法”的行为其实都能解释通为什么杀软不改应用代码也能拦住可疑注册表写入为什么加密软件能先把键解密再让别的组件继续看为什么 32 位程序访问某些路径时会自动被 WoW64 改道为什么容器里的应用觉得自己写的是本机注册表系统却把它导向了另一棵虚拟命名空间为什么现代 Windows 可以把 differencing hive 合并到基础层上却让应用几乎察觉不到差异书里讲得很直接Windows 的 registry callback model 会给不同类型的注册表过滤器分配 altitude过滤器既可以完全接管某次注册表操作绕过 Configuration Manager也可以把操作重定向成另一种操作还可以修改输出参数和返回值。书里甚至点了一个非常典型的场景为了避免“杀软先扫到加密后的键而加密产品还没来得及解密”的错序问题Windows 要靠 altitude 保证不同类型过滤器的执行先后。所以这篇文章我就专门把10.1.23 Registry filtering讲透。这一节最核心的一句话就是注册表过滤的本质是给 Configuration Manager 前面再加上一层“可编排、可排序、可改写”的拦截链因此系统和驱动就能在不改应用代码的前提下实质性改变注册表操作的结果。1. 先说结论Registry filtering 本质上就是“注册表操作拦截链”如果只用一句话总结这一节我会这样说应用发起一次注册表操作并不代表这次操作一定原封不动地交给 Configuration Manager在它真正落地前过滤器链可能先看、先改、先转发甚至直接接管。这和很多人对注册表的第一印象完全不一样。很多人会天然觉得应用调用RegOpenKeyConfiguration Manager 解析路径找到 key返回结果但Registry filtering告诉我们现实更接近这样原样放行重定向接管应用调用注册表 API进入注册表操作路径注册表过滤器链是否放行/改写/重定向/接管Configuration Manager 正常处理改成另一条注册表路径或另一种操作绕过 Configuration Manager返回结果这张图背后的核心意思就是Registry filtering 让注册表操作从“单点处理”变成了“链式处理”。2. 为什么说杀软、加密软件、WoW64、容器虚拟化都能“插手”因为它们不需要改应用只要挂在回调链上这一节最值得先想明白的一点是这些能力之所以强不是因为它们替应用重写了代码而是因为它们站在注册表操作必经路径上。书里明确说filtering model 可以完全接管注册表操作绕过 Configuration Manager也可以把某次操作重定向成另一种操作典型例子就是WoW64 的 registry redirection还可以修改输出参数以及返回值驱动还能给 key 或某次操作打上自己的上下文信息Configuration Manager 会在后续操作中继续带着这些上下文。这段话基本已经把“为什么能插手”说透了因为应用只看见 API真正的执行路径在内核谁能站上这条内核路径谁就能对注册表行为施加影响。3. Registry callback model 到底是什么可以把它理解成“注册表的可编程检查站”书里没有用特别花哨的话去包装它但核心意思非常明确VReg driver 本身就是一个 registry filter driver它依靠 registry callbacks mechanism 来实现 namespace redirection。在第一次初始化命名空间重定向时VReg driver 会注册自己的主回调例程类似CmRegisterCallbackEx。这说明什么说明 Windows 早就给注册表操作准备了一套正式的“插入点”机制。也就是说驱动可以在这些节点上做自己的逻辑。我更愿意把它理解成注册表操作不是一条死板管道而是有多个可插入检查站。这些检查站上过滤器可以决定我只是观察一下我先记个日志我给这个 key 打个上下文标签我改一下目标路径我不让 Configuration Manager 继续处理我直接返回我自己的结果所以Registry callback model 的本质不是“通知一下你发生了什么”而是“让你有机会参与这次操作的命运”。4. Altitude 为什么这么重要因为过滤器不是只有一个而是要排队执行这一节最有工程味的点之一就是altitude。书里举了一个特别经典的例子为了避免出现下面这种错序场景——杀软先扫到了“加密状态”的键但加密产品自己的回调还没来得及先把它解密Windows 在 registry callback model 下会给不同类型的过滤器分配一个基础altitude。例如书里就点出了一类是encryption一类是scanning同时这些做同类过滤器产品的公司还需要向微软注册避免和同类或竞争产品发生高度冲突。4.1 这意味着什么意味着过滤器不是“谁先装谁先赢”的野蛮状态而是有一套排序规则。也就是说某些过滤器应该先执行某些过滤器应该后执行执行顺序本身可能直接影响结果正确性和安全性4.2 为什么这件事特别重要因为这说明Registry filtering已经不是“简单打补丁”而是一个有秩序的体系。没有 altitude多个过滤器就会互相踩踏有了 altitudeWindows 才能把“多家产品同时插手注册表”这件事做成可控工程。5. 过滤器到底能做什么书里其实给了 4 种非常硬核的能力这一节里书把过滤器能干的事讲得很明白我建议直接记成 4 类。5.1 第一类完全接管书里原话的核心意思是过滤器可以completely take over the processing of the registry operation也就是绕过 Configuration Manager不让它继续处理这次请求。这意味着某些驱动完全可以说这次请求别往下走了我自己来决定结果。5.2 第二类重定向书里紧接着说过滤器可以把这次操作redirect the operation to a different operation典型例子就是WoW64 的 registry redirection。这就不只是“拦截”而是直接改写操作流向。5.3 第三类改输出书里明确说可以修改 output parameters也可以修改return value。这意味着即便底层原本返回某个结果过滤器也可以把它“包装成另一个样子”给上层调用者。5.4 第四类打上下文标签书里还提到驱动可以给某个 key 或某次操作打上driver-defined information这种 context 可以在 create/open 阶段建立Configuration Manager 会记住它并在后续该 key 的操作中返回给驱动。这就很强了因为它意味着过滤器不是“一次性路过”而是能在后续持续记住这个 key 的额外状态。所以 Registry filtering 不是单纯“看一下”而是“能接管、能改路、能改返回、还能持续带状态”。6. 为什么 WoW64 重定向是最典型的例子因为它说明“同一段应用代码能被系统偷偷导向另一棵注册表”很多人对 WoW64 最熟的是文件系统重定向但这节提醒我们注册表也有 WoW64 redirection。这件事非常有代表性因为它恰好证明了 registry filtering 的核心价值应用代码没变它还是访问“自己以为的那个路径”但系统底层把它重定向到了另一套视图这就是“不改应用代码也能插手”的最好例子。6.1 为什么这很有启发因为它让我们意识到应用眼里的注册表路径不一定等于 Configuration Manager 最终处理的那条路径。而这一点其实和前面 symbolic links、namespace redirection、HKCR 合并视图都是同一条主线表面路径逻辑视图最终真实来源本来就可能不是一回事。7. 容器虚拟化为什么也能做到“看起来在写本机注册表实际上写到别处”答案就是 VReg Configuration Manager这一节最“现代 Windows” 的部分就是registry virtualization。书里明确说Windows 10 Anniversary UpdateRS1引入了 registry virtualization面向Argon和Helium容器同时也支持加载differencing hives这套能力由Configuration Manager和VReg driver一起提供。书里还把它们提供的服务拆成了两类7.1 Namespace redirection应用可以把一个虚拟 key 的内容重定向到宿主机上的真实 key。还可以把虚拟 key 重定向到一个属于 differencing hive 的 key而这个 differencing hive 又会被 merge 到宿主机某个根 key 上。7.2 Registry mergingdifferencing hives 会被解释成“相对于 base hive 的差异集合”可以是新增也可以是删除删除场景下会用到thumbstone keys。也就是说容器里的“虚拟注册表”不是凭空模拟而是依赖 namespace redirection hive merging 这两套正式机制。8.\Registry\WC是什么为什么它会成为容器注册表虚拟化的关键根书里在 namespace redirection 这一段给了一个特别关键的细节当应用初始化容器里的命名空间重定向时VReg driver 会先创建一个 configuration context 并挂到 silo 上然后创建一个单独的 namespace node把容器里的\Registry\WC根映射到宿主机上的 key因为所有容器都会共享这套视图\Registry\WC就是为挂载虚拟化 hive 而准备的根。这段话特别重要因为它说明容器注册表虚拟化不是“在 HKCU/HKLM 上偷偷改点路径”那么简单而是有自己明确的命名空间根。也就是说在容器世界里注册表已经不是我们平时最熟悉的\Registry\Machine\Registry\User而是又多出一套和容器虚拟化强相关的\Registry\WC。这再次证明注册表命名空间不是死的它会随着系统模型演进而扩展。9. differencing hive 为什么这么关键因为它让“虚拟层覆盖基础层”变成了现实这一节里书对 differencing hive 的描述也特别值得记。它明确说differencing hive 使用1.6版 hive 格式它和 1.5 很像但支持 differencing metadata这样也避免被不支持 registry virtualization 的系统误挂载应用可以通过 IOCTL 请求把 differencing hive 挂到某个 base key 上形成的 mount point是differencing hive 数据 base layer 数据的合并结果。更关键的是解析逻辑当请求命中 mount point 或其子项时Configuration Manager 会先从 differencing hive 开始找如果找到对应 subkey就直接返回 differencing hive 里的数据如果没找到再回退到 base hive如果碰到 thumbstone key就把 base 中原本存在的 key 隐藏掉返回无数据或错误。这套逻辑我觉得特别漂亮因为它本质上就是先看覆盖层再看基础层如果覆盖层明确说“这个东西被删了”那基础层的原始内容也别露出来。这跟很多现代分层文件系统、镜像层、容器层的思路非常像。10. 从桌面支持和系统学习视角这一节到底有什么现实价值很多人会觉得 Registry filtering 过于底层但我觉得它特别实用尤其在下面这些理解上。10.1 它帮我真正理解“为什么有些产品能不改程序就改变结果”这不是什么玄学而是因为它们站在了注册表 callback/filter 链上。10.2 它帮我理解多种安全/管理产品为什么必须讲“执行顺序”杀软、加密、审计、加固如果都在注册表层插手那没有 altitude 就会互相踩。10.3 它帮我理解 WoW64、容器虚拟化、本地命名空间为什么都不是“应用自动适配”应用本身可能根本不知道发生了重定向真正完成这件事的是底层过滤与命名空间机制。10.4 它帮我理解“看到的路径”和“真正被处理的路径”可能完全不是一回事这一点和前面的 symbolic links、registry namespace、HKCR 合并视图、container redirection 其实是一整条主线。所以学 Registry filtering不只是多学一个机制而是进一步打碎“注册表路径天然直通底层”的错觉。11. 最容易误解的 6 个点我帮你一次理顺11.1 误区一过滤器只能“观察”不能改写不对。书里明确说过滤器可以绕过 Configuration Manager、重定向操作、改返回值和输出参数。11.2 误区二多个过滤器装一起顺序无所谓不对。altitude 的存在恰恰说明顺序很关键。11.3 误区三WoW64 重定向只是文件系统的事不对。书里明确拿WoW64 的 registry redirection当成示例。11.4 误区四容器虚拟化只是“给注册表换个根”不准确。它实际上涉及VReg drivernamespace redirectiondifferencing hiveregistry merging\Registry\WC根Silo context。11.5 误区五过滤器只对单次操作生效后续没记忆不对。书里明确提到驱动可以给 key 或操作关联 contextConfiguration Manager 会在后续继续带着它。11.6 误区六这是容器或安全产品的专属冷门机制也不对。只要系统希望在不改应用代码的前提下重写注册表行为registry filtering 就是天然入口。12. 我的学习理解这一节真正打碎的是“注册表调用 Configuration Manager 原样执行”的错觉我觉得10.1.23 Registry filtering最有价值的地方不是让我多记了几个名词而是让我真正意识到注册表操作在 Windows 里并不是“应用发起 → 配置管理器执行”这么简单的一条直线。中间实际上还可能有一条可排序、可拦截、可重定向、可改写、可挂上下文的过滤链。这带来的认知升级特别大以前我会觉得“程序写哪儿就是写哪儿”现在我会先问一句它写进去之前有没有被 redirect以前我会觉得“返回 ACCESS DENIED 就一定是 Configuration Manager 的决定”现在我会多想一步有没有某个过滤器改了返回值以前我会觉得容器/虚拟化环境里应用“看见”的注册表就是实际注册表现在我会更自然地想到它可能只是虚拟层、差异层和基础层合成出来的视图。所以我觉得这一节最值得沉淀成自己的理解是Registry filtering 让注册表从“配置数据库”进一步变成了“可编排的操作平台”。13. 总结提升如果让我用一句话总结《Windows Internals》10.1.23 Registry filtering我会这样说Registry filtering 的本质是让驱动和系统组件能够在不修改应用代码的前提下插入到注册表操作路径中对请求进行观察、排序、重定向、改写甚至接管也正因为如此杀软、加密软件、WoW64、容器虚拟化和 differencing hive 才能共同建立在同一条注册表回调/过滤基础设施之上。这篇最值得记住的 9 个结论是Windows 的 registry callback model 允许过滤器参与注册表操作处理。为了避免不同过滤器乱序执行系统会给它们分配 altitude。过滤器可以完全接管操作绕过 Configuration Manager。过滤器也可以把操作重定向成另一种操作WoW64 的 registry redirection 就是典型例子。过滤器还能修改输出参数和返回值。驱动可以给 key 或某次操作绑定自己的上下文数据Configuration Manager 会在后续继续携带这些上下文。Windows 10 RS1 引入了 registry virtualization由 Configuration Manager 和 VReg driver 共同提供 namespace redirection 与 registry merging。容器虚拟化使用\Registry\WC根并通过 VReg 的 namespace node 和 callback 机制完成重定向。differencing hives 会先覆盖 base layer再按需回退thumbstone keys 还能隐藏基础层原有 key。我觉得这一节最值得记成自己的那句话就是应用调用注册表 API 时它面前并不只有 Configuration Manager很多时候真正先发言的是过滤器链。下一篇预告《Windows Internals》10.1.24 Registry virtualization为什么容器里的应用明明以为自己在写 HKCU / HKLMConfiguration Manager 实际看到的却是\Registry\WC\GUID...》这一篇可以继续把\Registry\WCnamespace redirectiondifferencing hivesbase layer / immutable viewthumbstone keysVReg driver 与 Configuration Manager 的分工全部串起来。返回顶部

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询