Windows注册表的学习
- 什么是注册表
注册表是Windows在Win95/98系统开始引入的一种核心数据库,里面存放着各类的配置信息、参数等、直接控制着系统的启动、硬件的装载以及Winodws程序的运行
- 手册表的功能
记录用户安装在计算机上的软件和每个程序的相关信息,通过他可以控制硬件、软件、用户环境和操作系统界面的数据信息文件.
注册表的结构
快捷键regedit
可以打开注册表,查看详细的结构
- 不同机器注册表结构
win7 
win10

win08

可以看到大部分机器的注册表的根键
是差不多的.
- 简单结构
根键:被称为HKEYxxxxxx,某一项的句柄项:附加文件夹和一个或多个值
子项:在某一个项(父项)下面出现的项(子项)
项值:带有一个名称和一个值的有序值,每个项都可包括任何数量的值项,值项由三个部分组成:名称、数据类型和数据
1.名称:不包括反斜线的字符、数字、代表符和空格的任意组合。同一键中不可有相同的名称
2.数据类型:包括字符串、二进制和双字节等
3.数据:值项的具体值,它的大小可以占用64KB
总体结构分析
注册表包括以下5个根键
- HKEY_CLASSES_ROOT
该根键包括启动应用程序所需的全部信息,包括扩展名,应用程序与文档之间的关系 驱动程序名,DDE和OLE信息,类ID,编号和应用程序与文档的图标等.
- HKEY_CURRENT_USER
该根键包括当前登录用户的配置信息,包括环境变量,个人程序以及桌面设置等
- HKEY_LOCAL_MACHINE
该根键包括本地计算机的系统信息,包括硬件和操作系统信息。 安全数据和计算机专用的各类软件设置信息
- HKEY_USERS
该根键包括计算机的所有用户使用的配置数据(是所有用户哦) 这些数据只有在用户登录系统时才能访问.
这些信息告诉系统当前用户使用的图标,激活的程序组,开始菜单的内容以及颜色,字体- HKEY_CURRENT_CONFIG
该根键包括当前硬件的配置信息,其中的信息是从HKEY_LOCAL_MACHINE中映射出来的
注册表中的结构详解
- HKEY_CLASSES_ROOT
以AVIFILE这个项来举例

CLSID:分类标识,系统可以用这个类标识来识别相同类型的文件
Compressors:它下面有两个子项:auds:用于设置音频数据压缩程序的类标识;vids:用于设置视频数据压缩程序的类标识
RIFFHandlers:在它的下面有两个类标识:AVI:用于设置AVI文件的类标识;WAVE:用于设置WAVE文件的类标识
Shellex:包括了视频文件的外壳扩展
- HKEY_CURRENT_USER
此根键中保存当前用户的子项信息
- HKEY_LOCAL_MACHINE
此根键中存放的是用来控制系统和软件的设置,由于这些设置是针对那些使用Windows系统的用户而设置的,是一个公共配置信息,所以它与具体的用户没多大关系。
HARDWARE:有四个子项
1. ACPI:存放高级电源管理接口数据
2. DEVICEMAP: 用于存放设备映射
3. DEscriptION: 存放有关系统信息
4. RESOURCEMAP: 用于存放资源列表
SAM子项:跟系统的存储密码有关
SECURITY子项:该子项只是为将来的高级功能而预留的
SOFTWARE子项:该子项中保留的是所有已安装的32位应用程序的信息,各个程序的控制信息分别安装在相应的子项中,由于不同的计算机安装的应用程序互不相同,因此这个子项下面的子项信息也不完全一样。
SYSTEM子项:该子项是启动时所需的信息和修复系统时所需要的信息
另外说明一点:我们转储hash时候导出的注册表就是在这个根键里面的(请参考亮神的文章)
- HKEY_USERS
此根键中保存的是默认用户(default),当前登录用户和软件(software) 的信息.
其中DEFAULT子项是其中最重要的,它的配置是针对未来将会被创建的新用户的。
新用户根据默认用户的配置信息来生成自己的配置文件,该配置文件包括环境、屏幕和声音等多种信息
没有什么好讲的
- HKEY_CURRENT_CONFIG
此根键存放的是当前配置的文件信息.
- 总结
注册表看似是五个分支(五个根键),其实不然,其实就是HKEY_LOCAL_MACHINE、HKEY_USERS这两个才是真正的注册表键,其它都是从某个分支映射出来的,相当于快捷方式或是别名.
注册表的基本操作
- 常用操作
创建项和项值
更新项值的数据
删除项、子项或值项
查找项、值项或数据
- 基本数据类型
二进制值(reg_binary):多数硬件信息以二进制数据存储,而以十六进制格式显示在注册表编辑器中
字符串值(reg_sz):包括字符串的注册表键,使用字符串数据类型
双字节值(reg_dword):是32位信息常显示成4个字节。它在出错控制功能上用处极大,其数据一般以十六进制格式显示在注册表编辑器中。
多字符串值(reg_multi_sz):允许将一系列项目作为单独的一个值使用。对于多种网络协议、多个项目、设备列表以及其他类似的列表项目来说,可以使用多字符串值可扩充字符串值(reg_expand_sz):代表一个可扩展的字符串
- 操作实战
向"HKEY_CURRENT_USER"下创建一个子键"Mikasa",向该子键中添加名为"Mikasa",类型为"REG_ZS",数据为"QAQ"
reg add HKCU\Mikasa /v Mikasa /t REG_SZ /d "QAQ"

参数解释:/v 值 /t 类型 /d 数据
修改注册表中的值
reg add "HKCU\Mikasa" /f /v Saber /t REG_SZ /d "test"

同理的我们可以修改支持远程桌面连接
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /f /v fDenyTSConnections /t REG_DWORD /d 0
修改支持远程桌面
reg query "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections
查询一下
reg query "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections
查询注册表的值
reg query HKLM\xxx /v xxx
/v指定值查询,例如查询我们插入的值
reg query HKCU\Mikasa /v Mikasa

导入/导出注册表
reg import c:\test.reg //导入
reg export HKCU\Mikasa c:\test1.reg //导出注册表
上述都是需要管理员权限的,不然会发生错误
删除注册表中的某一项
reg delete HKCU\Mikasa /v Mikasa /f

删除成功
渗透中常用的注册表操作
reg add "hklm\system\currentcontrolset\control\terminal server" /f /v fDenyTSConnections /t REG_DWORD /d 0
启动远程桌面
netsh firewall set service remoteadmin enable
netsh firewall set service remotedesktop enable
配置防火墙
REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v PortNumber
查看RDP远程连接的端口
reg add "HKLM\System\CurrentControlSet\Services\LanManServer\Parameters" /f /v RequireSecuritySignature /t REG_DWORD /d 0
开启hash传递
亮神的注册表导出数据库,本地破解hash
reg save HKLM\SYSTEM sys.hiv
reg save HKLM\SAM sam.hiv
reg save HKLM\security security.hiv

有师傅总结的关于可能保存密码的注册表键
HKCU\Software\ORL\WinVNC3\Password
HKCU\Software\SimonTatham\PuTTY\Sessions
HKLM\SYSTEM\Current\ControlSet\Services\SNMP
HKEY_CURRENT_USER\Software\Martin Prikryl\WinSCP 2\Sessions
HKLM\SOFTWARE\Microsoft\Windows NT\Currentversion\Winlogon
也可以用注册表语句检索
reg query HKLM /f password /t REG_SZ /s
reg query HKCU /f password /t REG_SZ /s
参考资料
http://ittxx.cn/view/139
http://t3ngyu.leanote.com/post/Windows-Reg