关于windows注册表重定向和虚拟化分析
转载源地址 https://www.cnblogs.com/xenophon/p/4956218.html
在 64 位系统上,32 位程序读写部分注册表路径时会被系统重定向,这有些类似于读写 System32 文件夹的处理方式。比如,写入 HKLM\Software\KeyName,却发现实际写入到 HKLM\Software\Wow6432Node\KeyName,读取亦是如此。现实中发现,很多的程序员在检测一个程序在 HKLM 键下面的注册表信息,通常会针对 HKLM\Software 和 HKLM\Software\Wow6432Node 分别检查,实际上这样检查毫无效果。对于 32 位程序而言,访问 HKLM\Software 时,系统底层会重定向到 HKLM\Software\Wow6432Node,并不能得到真正的 HKLM\Software 下面的信息,即便再访问一次 HKLM\Software\Wow6432Node,经测试也是访问 Wow6432Node 下面的值,和直接访问 HKLM\Software 并没有任何区别。如果你仔细阅读 MSDN 上关于注册表重定向和访问权限等资料,会发现微软提供了两个特殊的注册表权限位:KEY_WOW64_32KEY、KEY_WOW64_64KEY,来控制访问权限。所以,当使用 RegOpenKeyEx 或 RegCreateKeyEx 访问注册表的 HKCR 或 HKLM\Software 下的路径,不需要显式指定 Wow6432Node,而是应当通过其权限位,如 KEY_READ,和上述二者之一进行组合来控制具体的访问位置。如果开发者显示指定 HKLM\Software\Wow6432Node,则程序在任何情况下都是访问这个路径。但是在 32 位系统中,这个路径默认并不存在,如果强行创建,依然没有任何意义。为了保持统一以及遵循 API 的规范,我们应该做到不显式指定 Wow6432Node 子键。如果不通过权限位进行访问视图控制,可能会造成代码逻辑混乱,如访问不同的注册表路径实际上底层逻辑相同,或者同样的代码编译为 32 位或 64 位后逻辑不一致等等。所以,如果要检测 32 位和 64 位注册表 HKLM\SOFTWARE\KeyName 下是否存在 ValueName,规范的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
在不同 CPU 位数的系统上,32 位和 64 位程序分别使用不同的权限位组合访问 HKLM\Software 时,系统底层实际访问的注册表位置如下表所示:
系统架构 | 程序架构 | 显式访问路径 | 实际访问路径 | 备注 | ||
权限位不含 KEY_WOW64_* | 权限位包含 KEY_WOW64_32KEY | 权限位包含 KEY_WOW64_64KEY | ||||
32 位系统 | 32 位程序 | HKLM\Software | HKLM\Software |
原因:在 32 位系统上不存在不同访问视图 影响:参数 KEY_WOW64_* 被系统忽略 |
||
64 位系统 | 32 位程序 | HKLM\Software | HKLM\Software\Wow6432Node | HKLM\Software\Wow6432Node | HKLM\Software | |
64 位程序 | HKLM\Software | HKLM\Software | ||||
32 位程序 | HKLM\Software\Wow6432Node | HKLM\Software\Wow6432Node |
原因:在路径中显式指定了 Wow6432Node 节点 影响:参数 KEY_WOW64_* 被系统忽略 |
|||
64 位程序 |
备注:注意RegOpenKeyEx第四个形参,KEY_QUERY_VALUE或者KEY_READ、
KEY_ALL_ACCESS等,权限是有区别的,不要越权操作,否侧会被返回为空。
KEY_QUERY_VALUE显然权限低于KEY_ALL_ACCESS。
可见,32 位程序访问注册表 HKLM\Software 路径时,默认会被重定向到 HKLM\Software\Wow6432Node,如果权限位指定 KEY_WOW64_64KEY 时则访问 HKLM\Software。64 位程序访问注册表 HKLM\Software 路径时,默认会访问 HKLM\Software,如果权限位指定 KEY_WOW64_32KEY 时则访问 HKLM\Software\Wow6432Node。当然,前提是程序并没有受到注册表虚拟化影响,否则会被写入到以下注册表位置:
1 2 |
|
实际观察发现 HKCU\SOFTWARE\Wow6432Node 下面只有极少量的数据,因此 HKCU\SOFTWARE\Wow6432Node 下面(包括其他从此处映射的键)的注册表键通常可以忽略。这可以说明,注册表针对 32 和 64 位的重定向仅针对 HKLM(包括其他从此处映射的键)有效,如果要访问 HKCU 下面的节点,通常无需考虑重定向的问题。而在 32 位系统上,不存在注册表重定向的问题。
关于注册表重定向的更多信息,请访问:
https://msdn.microsoft.com/en-us/library/aa384253.aspx
https://msdn.microsoft.com/en-us/library/aa384129.aspx
关于windows注册表重定向和虚拟化分析相关推荐
- Windows重定向技术【文件重定向与注册表重定向】
目录 重定向技术 重定向技术适用版本: 重定向技术产生原因:为了确保32位程序能够顺利运行 一:重定向-文件重定向 文件重定向原因:为了确保32位程序能够顺利运行 文件重定向产生场景: 文件重定向具体 ...
- Windows如何读取Linux,Linux下读取Windows注册表
原本以为Linux下读取Windows的注册表是个异想天开.无法实现的想法,忽然发现了老外写的一段小文章 http://www.linuxidc.com/Linux/2011-04/34100p2.h ...
- 修改.html 打开方式 注册表,windows 注册表修改资料打开方式
windows 注册表修改文件打开方式 描述遇到的问题 在打开jsp文件时,右击选择打开方式中选择dreamweaver,但是却是以firefox打开 初步分析应该是jsp也和firefox进行了关联 ...
- win7 java注册表_使用JAVA和JNA在64位Win 7上读/写Windows注册表
我正在尝试使用JAVA在64位Win7上读/写 Windows注册表. 首先,我尝试了JDK java.util.prefs.Preferences and its reflection usage. ...
- Windows注册表及常见子项
Windows注册表五大根键以及常用注册表项 注册表概述:注册表是Windows操作系统.硬件设备以及客户应用程序得以正常运行和保存设置的核心"数据库",也可以说是一个非常巨大的树 ...
- 10#Windows注册表的那些事儿
引言 用了多年的Windows系统,其实并没有对Windows系统进行过深入的了解,也正是由于Windows系统不用深入了解就可以简单上手所以才有这么多人去使用.笔者是做软件开发的,使用的基本都是Wi ...
- 对一个windows2000注册表项的粗略分析(转)
对一个windows2000注册表项的粗略分析(转)[@more@] [HKLMSOFTWAREMicrosoftWindows NTCurrentVersionImage File Executio ...
- Windows 注册表
<1>64位操作系统上的注册表 <2>文件系统重定向 <3>UAC <4>注册表重定向 <5>SysWoW64 <6>注册表存放 ...
- Windows注册表的那些事儿
引言 用了多年的Windows系统,其实并没有对Windows系统进行过深入的了解,也正是由于Windows系统不用深入了解就可以简单上手所以才有这么多人去使用.笔者是做软件开发的,使用的基本都是Wi ...
最新文章
- 受用一生的高效 PyCharm 使用技巧(六)
- 利用外部命令Oralce数据库导入导出
- C++知识点17——使用C++标准库(顺序容器vector常用操作)
- 一分钟教你学会python_十分钟教你学会python编写小游戏
- 差值平方和匹配_纯前端实现图片的模板匹配
- 记一次生成唯一ID的问题
- [USACO18OPEN]Talent Show
- 将深度缓冲z值变换到相机坐标系
- ANT发送邮件需要的3个JAR包
- 编译android4.4 报错error: call to '__property_get_too_small_error' declared with attribute 的处理 (转载)...
- keypress事件中键盘上每个键的KeyAscii值(易语言/VB)
- 计算机二级怎么样分屏方便,一招实现电脑分屏,比你想象中更简单
- openssl 签发证书相关命令
- 若依管理系统windows本地运行教程
- Android性能优化之解密ZAKER,网易云阅读等新闻应用的内容缓存加载方式
- 在微型计算机中 多媒体信息包括,公务员考试常识题:1、具有多媒体功能的微型计算机系统中,常用的CD-ROM是...
- 构建企业内部的管理系统
- cadence16.6完全卸载,不影响再次安装的方法
- 中国第一封email
- 开源活动_获得开源薪水,成为社会活动家
热门文章
- 波司登的高端之路,难走!
- vue导入excel进度条_Vue 前端开发——导入Excel/Csv
- nginx 允许跨域_细谈跨域请求的桥梁
- python 抓取目录树_python 获取文件下所有文件或目录os.walk()的实例
- mfc messagebox 非模态_進博尋寶記:當進博遇見非遺?愛上中國傳統文化--財經-
- duck typing java_编程语言中的鸭子类型 Duck Typing
- Javaweb-----HTTP协议
- BUUCTF-----actf_2019_babyheap (UAF)
- 学习Python一定要会的4个高阶函数
- LabelImg 批量生成标注图片文件夹序号(起始值+终值)