无需修改32位应用可执行文件能否将其注册表访问重定向至64位注册表?
无源码32位应用强制访问64位原生注册表的可行方案
Windows 系统没有提供全局开关、兼容性标志位这类开箱即用的配置,可以直接让32位进程默认绕过Wow64注册表重定向,所有可行方案都需要在进程执行注册表写入逻辑前干预API调用行为,具体落地思路如下:
- 方案1:DLL注入Hook注册表API(稳定性最高,优先推荐)
这是适配性最强的方案,不需要修改原可执行文件。你只需要编写一个极简32位DLL,在DLL加载入口处HookRegOpenKeyExA、RegOpenKeyExW、RegCreateKeyExA、RegCreateKeyExW这四个核心注册表操作API,在调用原生API前,给传入的访问权限参数追加KEY_WOW64_64KEY标志即可——该标志是微软官方提供的、专门用于指定32位进程访问64位原生注册表视图的参数,加上后系统就不会把请求重定向到Wow6432Node下的32位路径。
DLL的加载可以选两种方式:- 编写简易启动器,通过
CreateRemoteThread方式在目标进程启动后、执行注册表写入逻辑前注入DLL - 配置系统IFEO(映像文件执行选项)的验证器加载项,让进程启动时自动加载你的DLL,不需要额外启动注入工具
注意:Wow64DisableWow64FsRedirection仅对文件系统重定向生效,对注册表重定向完全无效,不要混淆两个重定向机制。
- 编写简易启动器,通过
- 方案2:API Hook启动器(零侵入,无需额外配置)
如果不想手动写注入逻辑,可以基于微软Detours这类成熟的Hook库编写一个几十KB的启动器,启动目标进程时直接在进程初始化阶段Hook上述四个注册表API,自动给所有注册表打开/创建请求追加KEY_WOW64_64KEY标志。使用时只需要把启动器和原程序放在同目录,运行启动器即可加载原程序,不需要修改原EXE、也不需要写注册表配置。 - 方案3:注册表变更同步(无进程侵入,仅适配特定场景)
如果你不想对目标进程做任何注入或Hook,可以写一个轻量常驻监控程序,实时监听HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Winlogon路径下的值变更,一旦检测到目标程序写入值,立刻把对应值同步写入64位原生路径HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon下即可。
该方案的缺陷是存在极短的同步时间差,如果目标程序写入注册表后立刻读取对应路径做合法性校验,会因为重定向路径和64位路径值不一致触发校验失败,仅适合写入后不做即时校验的场景。
注意:不要尝试直接编辑32位EXE的二进制内容、硬改注册表路径字符串,这种操作很容易破坏PE文件结构、破坏程序数字签名,轻则程序无法启动,重则触发安全软件告警。
另外系统自带的兼容性管理工具、兼容性选项卡中没有提供全局关闭Wow64注册表重定向的现成垫片,不需要在这类配置中浪费时间排查。
内容的提问来源于stack exchange,提问作者Erik
相关产品推荐
相关产品推荐

