注册表

来自Wikioe
Eijux讨论 | 贡献2020年9月10日 (四) 06:20的版本 →‎右键菜单
跳到导航 跳到搜索


概述

注册表(Registry)是Microsoft Windows中的一个重要的数据库,用于存储系统和应用程序的设置信息,在操作系统的启动、运行过程中起着重要的作用。

注册表是windows操作系统中的一个核心数据库,其中存放着各种参数,直接控制着windows的启动、硬件驱动程序的装载以及一些windows应用程序的运行,从而在整个系统中起着核心作用。这些作用包括了软、硬件的相关配置和状态信息,比如注册表中保存有应用程序和资源管理器外壳的初始条件、首选项和卸载数据等,联网计算机的整个系统的设置和各种许可,文件扩展名与应用程序的关联,硬件部件的描述、状态和属性,性能记录和其他底层的系统状态信息,以及其他数据等。
具体来说,在启动Windows时,Registry会对照已有硬件配置数据,检测新的硬件信息;系统内核从Registry中选取信息,包括要装入什么设备驱动程序,以及依什么次序装入,内核传送回它自身的信息,例如版权号等;同时设备驱动程序也向Registry传送数据,并从Registry接收装入和配置参数,一个好的设备驱动程序会告诉Registry它在使用什么系统资源,例如硬件中断或DMA通道等,另外,设备驱动程序还要报告所发现的配置数据;为应用程序或硬件的运行提供增加新的配置数据的服务。配合ini文件兼容16位Windows应用程序,当安装—个基于Windows 3.x的应用程序时,应用程序的安装程序Setup像在windows中—样创建它自己的INI文件或在win.ini和system.ini文件中创建入口;同时windows还提供了大量其他接口,允许用户修改系统配置数据,例如控制面板、设置程序等。
如果注册表受到了破坏,轻则使windows的启动过程出现异常,重则可能会导致整个windows系统的完全瘫痪。因此正确地认识、使用,特别是及时备份以及有问题恢复注册表对windows用户来说就显得非常重要。 [1]

运行注册表

  1. windows+R 运行“regedit”(或“regedt32”)
  2. “C:\Windows\SysWOW64\regedit.exe”(regedit.exe或regedt32.exe)(32bit位于:“C:\Windows\System32\regedt32.exe”)

数据结构

Regedit.png

注册表由键(也叫主键或称“项”)、子键(子项)和值项构成:

  • 一个键就是分支中的一个文件夹,而子键就是这个文件夹当中的子文件夹,子键同样它也是一个键。
  • 一个值项则是一个键的当前定义,由名称、数据类型以及分配的值组成。
  • 一个键可以有一个或多个值,每个值的名称各不相同,如果一个值的名称为空,则该值为该键的默认值。



  • 数据类型主要有以下四种:
名称 说明
REG_SZ 字符串:文本字符串
REG_MULTI_SZ 多字符串值:含有多个文本值的字符串
REG_BINARY 二进制数:二进制值,以十六进制显示,
REG_DWORD 双字值:一个32位的二进制值,显示为8位的十六进制值。

目录结构[2]

注册表有五个一级分支,其作用如下:

数据类型 说明
HKEY_CLASSES_ROOT 存储Windows可识别的文件类型的详细列表,以及相关联的程序。
HKEY_CURRENT_USER 存储当前用户设置的信息。(登录Windows时从HKEY_USERS拷贝相应项)
HKEY_LOCAL_MACHINE 包括安装在计算机上的硬件和软件的信息。(公共配置信息与具体用户无关)
HKEY_USERS 包含使用计算机的用户的信息。
HKEY_CURRENT_CONFIG 这个分支包含计算机当前的硬件配置信息。

存储方式[2]

Windows NT系列(Windows New Technology,新技术视窗操作系统,见Windows NT)操作系统和Windows 9x系列(以Windows 95内核作为蓝本的微软操作系统,见Windows 9x)的存储方式有很大区别。
注册表被分成多个文件存储,称为Registry Hives,每一个文件被称为一个配置单元。
Windows NT系列的配置单元文件:

名称 注册表分支 作用
SYSTEM HKEY_LOCAL_MACHINE\SYSTEM 存储Windows可识别的文件类型的详细列表,以及相关联的程序。
NTUSER.DAT HKEY_CURRENT_USER 存储用户参数选择的信息(此文件放置于用户个人目录,和其他注册表文件是分开的)
SAM HKEY_LOCAL_MACHINE\SAM 用户及密码的数据库
SECURITY HKEY_LOCAL_MACHINE\SECURITY 安全性设置信息
SOFTWARE HKEY_LOCAL_MACHINE\SOFTWARE 安装的软件信息
DEFAULT HKEY_USERS\DEFAULT 缺省启动用户的信息
USERDIFF HKEY_USERS 管理员对用户强行进行的设置

Windows 9x系列的配置单元文件:

名称 注册表分支 作用
CLASSES HKEY_CLASSES_ROOT 存储软件组件库有关信息
USER.DAT HKEY_USERS 存储用户参数选择的信息
SYSTEM.DAT HKEY_LOCAL_MACHINE 系统信息

分散与集中之争[2]

关于分散的文本文件和集中的注册表两种软件配置方式的优劣,目前仍有争论。主流操作系统中,Linux操作系统一直使用单独的文本文件来存放配置信息。而Windows平台下基于.NET框架的软件对注册表的依赖性也大大减弱。事实上,.NET软件通常使用纯文本的XML(称为app.config)文件而不是注册表进行配置,这在某种意义上是向当初的ini文本配置方式的一种回归。部分绿色软件支持者认为,集中式的注册表要求软件需要进行专门的安装步骤才可以正常运行,而单独的文本配置文件则可以不需要安装,只要将软件的文件目录拷贝过来就可以使用;当不再需要软件的时候,除删除相关文件外对于注册表也需要进行卸载步骤,才有可能不在系统中留下痕迹(很多软件即使提供了卸载步骤,仍然会留下痕迹),如果使用文本配置文件,则能做得更干净。但是,文本配置方式导致某些系统软件的配置较为困难且缺乏统一的界面(如Linux中的情况),也是不争的事实,尽管现在已经有很多软件可以方便进行系统配置,但仍存在标准不够统一的问题。

著名开源软件Fetchmail的作者Eric S. Raymond在《UNIX编程艺术》一书中有如下叙述:

对比terminfo数据库和Windows注册表,我们发现注册表出名地容易受到错误代码的破坏。这可能会使整个系统都无法使用。即使系统没有瘫痪,但如果破坏本身干扰了专用的注册表编辑工具,恢复工作就会很困难。


从2000年以来部分恶性病毒如熊猫烧香等的破坏情形看,的确存在“破坏本身干扰注册表编辑器”的问题。在某些情况下,病毒程序会监视系统进程列表,并强行关闭名为regedit的任何程序。这使得受损用户难以直接通过编辑注册表进行恢复。

注册表是Windows操作系统的核心,越来越多的黑客程序将攻击对象转向了注册表。一些程序(尤其是恶意程序),为了达到随系统自动启动的目的,会在注册表创建启动项,因此监控注册表能够有效地预防该类恶意程序的攻击。

常用

系统启动项

Windows操作系统的系统启动项是在注册表中设置的,在注册表中常见的自启动位置如下:

  1. HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/2017/05/24/Windows/CurrentVersion/中的RunRunOnceRunOnceExRunServicesRunServicesOnce
  2. HKEY_CURRENT_USER/SOFTWARE/Microsoft/2017/05/24/Windows/CurrentVersion中的RunRunonce
  3. HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/2017/05/24/WindowsNT/CurrentVersion/Winlogon/Notify

在这些注册表位置下,如果添加一新键值,并指定运行的程序,那么只要操作系统启动时,该程序自动启动。

右键菜单

右键菜单都在注册表中HKEY_CLASSES_ROOT分支下:

  1. 所有文件都有的右键在:HKEY_CLASSES_ROOT\AllFilesystemObjects下,
  2. 磁盘驱动器的右键在:HKEY_CLASSES_ROOT\Drive下,
  3. 文件夹的右键在:HKEY_CLASSES_ROOT\Folder下,
  4. 还有一个和右键有关的是:HKEY_CLASSES_ROOT\Directory
  5. 一般对文件的操作放在:HKEY_CLASSES_ROOT\*\shellex\Context Menu Handlers
  6. 一般对文件夹的操作放在:
    1. HKEY_CLASSES_ROOT\Directy\shell
    2. HKEY_CLASSES_ROOT\Directy\shellex\Context Menu Handlers
    3. HKEY_CLASSES_ROOT\Folder\shell
    4. HKEY_CLASSES_ROOT\Folder\shellex\Context Menu Handlers
  • 两个Windows基本概念:Folder/Directory, 资料夹/文件夹:Folder是包含驱动器根目录的,而Directory则不包括



  • Windows10能够添加右键菜单,但是不能添加子菜单(多番尝试失败),在注册表中查看到的子菜单都不是直接通过注册表实现

注册表中的Shell和ShellEx

该Shell键用于和文件类型上下文菜单一起使用的静态动词ShellExecute。它们很容易实现,因为它们只是指定命令的字符串。如果需要,可以使用可选的COM对象(DropTarget等)进行扩展。 该ShellEx键是用于外壳扩展,这些是COM对象和在壳中有各种扩展点和每一种类型是ShellEx的的一个子项。ShellEx\ContextMenuHandlers是纯Shell密钥的Shell扩展版本。此处列出了不同类型的Shell扩展。

shell文件夹中定义的菜单,在右键上直接显示 shellex文件夹中定义的菜单,在右键上显示为多级菜单

参考