搜索全站

输入至少 2 个字符,查找相关内容。

↑↓ 选择 Enter 打开Esc 关闭

注册表取证

注册表是 Windows 的集中式配置数据库。它对取证的意义在于:Windows 把大量「只有内存才知道」的东西顺手写进了注册表——最后关机时间、插过的 USB 序列号、用户运行过哪些程序、装过什么软件、哪些账户被创建过。这些信息在文件系统层面找不到替代来源。

最后更新 2026-10-09版本 v2.0维护 DigiForensics查看历史 1

一、概述

注册表保存 Windows 的系统与用户配置,也包含设备连接、程序使用、软件安装和账户信息等取证工件。分析时应确认 hive 来源、用户归属和事务日志状态,再将相关键值与文件、事件日志等证据交叉核对。

三个特点让取证师既依赖它又提防它:

  1. 服务、驱动、启动项和账户配置可从相关 hive 中提取;必要时应结合事件日志与磁盘文件验证。
  2. 时间信息包括键的 LastWrite 时间、特定值中的时间字段,以及 hive 文件的文件系统时间。它们的含义不同,应分别判读;键的 LastWrite 表示该键或其值条目最后被修改的时刻。参见 Microsoft:RegQueryInfoKeyW。
  3. 它极易被反取证工具清理。 多数反取证软件的第一件事就是删 Run 键、删 USBSTOR 历史、清 UserAssist。

必须先建立的认知是:注册表在运行时是「活」的(内存中有句柄、事务日志在回放),在离线镜像里则是一堆看起来完好但可能不一致的 hive 文件。怎么处理这样一批离线 hive——尤其是让无数新人卡住的 ControlSet001 问题——是这一层最实际的难点。

读取 hive 之前的位置在「逐工件判读」的最前面。上游依赖 hive 的正确提取,必须连同事务日志一起提取(.LOG1 / .LOG2),原因见下;提取方式见只读挂载与安全接入。开工前先做三件事:确认当前控制集编号(Select\Current);确认用户 hive 的归属(每个用户一份 NTUSER.DAT);判断是否需要回放事务日志。下游支撑四处,几乎所有 Windows 篇目都依赖它:ShimCache 读的是 SYSTEM hive、DPAPI 主密钥的 SID 关联需要 SAM、UserAssist 读的是 NTUSER.DAT、SRUM 的 UserId 要关联用户名。

五个逻辑根键不是五个独立文件,而是不同 hive 内的子树视图。这是最容易误解的地方:

逻辑根键 实际物理位置 说明
HKLM 跨 SYSTEM / SOFTWARE / SAM / SECURITY / DEFAULT 多个 hive 机器级配置,无单一对应文件
HKCU C:\Users\<用户名>\NTUSER.DAT 当前登录用户配置(离线时需逐用户选)
HKU 各用户的 NTUSER.DAT + .DEFAULT 所有加载过的用户配置
HKCR HKLM\SOFTWARE\Classes + HKCU\Software\Classes 的合并视图 无独立文件,是逻辑合并
HKCC HKLM\SYSTEM...\ControlSet 的当前控制集别名 无独立文件,指向 ControlSet00X

关键理解:HKCR 与 HKCC 是运行时动态组装的。 在离线 hive 里找不到这两棵子树——它们是 Windows 启动时在内存里拼出来的。分析文件关联(HKCR)时,离线要去看 HKLM\SOFTWARE\Classes。

时间戳的三个来源必须分清:

来源 含义 可靠性
键内的值自带时间 InstallDate 存 Unix 时间、ShutdownTime 存 FILETIME 精确,是时间线的硬证据
hive 文件的 MFT 时间戳 该文件被写入的时刻 只说明「这台机器的注册表在这个时刻有写入」
事务日志 .LOG1 / .LOG2 尚未合并进主 hive 的近期修改 异常断电时部分修改仍在这里

据此能回答的是:机器上装了什么服务与驱动、启动项配置、账户与 SID 清单、插过的 USB 设备及其序列号、用户运行过哪些程序、软件安装日期、以及系统最后一次正常关机与异常关机的时间(ShutdownTime 与其类型值是关键判据)。

回答不了的部分有五条,后两条是必须先纠正的误解:

  • CurrentControlSet 在离线 hive 里是一个内容为空的符号链接。 在运行中的 Windows 上它是真实存在的键,但在磁盘上的 hive 里它只是指向 ControlSet001 / ControlSet002 的符号链接。用离线工具查 CurrentControlSet\Services\... 却一无所获,通常是你查了一个空符号链接,与服务是否真的存在无关。正确做法是两步:先查 Select\Current 确认编号,再显式用 ControlSet00X。不同工具对符号链接的处理不一致,不要依赖工具行为**。
  • 「hive 文件修改时间」不等于「这个键被改的时间」。 注册表键有自己的 LastWrite 时间;hive 文件的 MFT 时间戳属于文件系统时间,不能替代键的 LastWrite 时间。不要把前者当作后者。
  • 异常断电后主 hive 的最新变更。 Windows 写注册表时先写事务日志,再周期性合并;若系统异常断电,部分近期修改仍在 .LOG1 / .LOG2 里没合并,直接读主 hive 可能丢失最新变更——比如刚删的 Run 键其实还在日志里。
  • 历史残留的删除。 键被删后值可能仍留在 hive 的空闲空间中,但要用专用的残留数据提取手段,常规读取方式给不出。
  • 用户当时是否在场。 hive 记录的是配置状态,不记录交互行为,那属于用户行为痕迹。

往下读之前先确认你已经掌握 NTFS 的 MFT 与文件时间戳概念(hive 是普通文件,它的四时间戳来自 NTFS,见NTFS 结构与 MFT 解析)、注册表的事务日志机制(否则会在主 hive 与日志之间选错读取对象)、SID 与用户名的对应关系(这是账户类证据落到具体人的前提),并且会用专用的 hive 解析工具(如 RegRipper),而不是把 hive 当文本搜索。还有一条取舍必须先明确:合并事务日志会修改 hive 副本,务必在副本上操作、保留原始 hive 作为证据原件,并记录合并动作。

二、核心原理

2.1 五大根键与它们的物理归属

注册表逻辑上有五个根键,但它们不是独立的文件,而是不同 hive 内的子树视图。这是最容易误解的地方。

逻辑根键 实际物理位置 说明
HKLM(HKEY_LOCAL_MACHINE) 跨 SYSTEM / SOFTWARE / SAM / SECURITY / DEFAULT 多个 hive 机器级配置,无单一对应文件
HKCU(HKEY_CURRENT_USER) C:\Users\<用户名>\NTUSER.DAT 当前登录用户的配置(离线时需逐用户选)
HKU(HKEY_USERS) 各用户的 NTUSER.DAT + .DEFAULT 所有加载过的用户配置
HKCR(HKEY_CLASSES_ROOT) 是 HKLM\SOFTWARE\Classes + HKCU\Software\Classes 的合并视图 无独立文件,是逻辑合并
HKCC(HKEY_CURRENT_CONFIG) 是 HKLM\SYSTEM...\ControlSet 的当前控制集别名 无独立文件,指向 ControlSet00X

关键理解:HKCR 和 HKCC 是运行时动态组装的。在离线 hive 里你找不到 HKEY_CLASSES_ROOT 和 HKEY_CURRENT_CONFIG 这两个真实子树——它们是 Windows 启动时在内存中拼出来的。所以分析 .lnk 文件关联(HKCR)时,离线要去看 HKLM\SOFTWARE\Classes。

2.2 hive 文件在磁盘上的位置

系统 hive(路径以实际系统为准,Win10/11 常见位置):

hive 路径 主要内容
SYSTEM %SystemRoot%\System32\config\SYSTEM 硬件枚举、服务/驱动、控制集、ShimCache、USB/Bus、启动配置
SOFTWARE %SystemRoot%\System32\config\SOFTWARE 已安装软件、SRUM 配置、卸载残留、Run 键(机器级)、网络配置
SAM %SystemRoot%\System32\config\SAM 本地账户、密码哈希、登录次数、组成员
SECURITY %SystemRoot%\System32\config\SECURITY LSA 秘密(缓存的域凭据)、策略
DEFAULT %SystemRoot%\System32\config\DEFAULT 新用户模板(对应 HKU.DEFAULT)

用户 hive:

hive 路径 主要内容
NTUSER.DAT C:\Users\<用户名>\NTUSER.DAT UserAssist、RecentDocs、RunMRU、TypedPaths、MountPoints2、用户环境变量
UsrClass.dat C:\Users\<用户名>\UsrClass.dat 用户注册表类(文件关联、缩略图缓存等)

每个 hive 通常还有配套的事务日志 SYSTEM.LOG1、SYSTEM.LOG2——它们是待回放的日志,不是备份,见 2.6。

2.3 ★ 离线注册表必须用 ControlSet001(最高频坑)

在运行中的 Windows 上,HKLM\SYSTEM\CurrentControlSet 是一个真实存在的键。但在磁盘上的 hive 里,它只是一个符号链接——内容为空,指向一个具体编号的控制集:

SYSTEM\CurrentControlSet← 符号链接(离线读取时内容为空)
SYSTEM\ControlSet001        ← 真实数据(当前启动所用)
SYSTEM\ControlSet002        ← 真实数据(上次已知良好配置)

后果:用离线工具查 CurrentControlSet\Services\... 却一无所获,通常是你查了一个空符号链接,与服务是否真的存在无关。

正确做法两步走:

第 1 步:查 SYSTEM\Select,确认当前是哪个控制集

rip.exe -p /evidence/hives/SYSTEM -a /tmp/select.txt select

\Select\Current : 1 ← 即 ControlSet001

\Select\LastKnownGood : 1

第 2 步:改用 ControlSet001 查询

rip.exe -p /evidence/hives/SYSTEM -a /tmp/svc.txt svcscan

为什么这条这么重要:不同工具加载离线 hive 时对符号链接的处理不一致(有的跟随、有的不跟随)。不要依赖工具行为——养成习惯:离线分析一律显式用 ControlSet00X,编号以 Select\Current 为准。

2.4 常用键值清单(按取证目的分组)

实战中最常查的位置。每条都在后续文章展开,此处作索引。

离线一律用 ControlSet00X 代替 CurrentControlSet。

A. 系统身份与时间线(hive: SOFTWARE,键根 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion)

键/值 取证意义
ProductName / CurrentBuild / UBR 系统版本(先查这个)
InstallDate(REG_DWORD Unix 时间) 系统安装/升级时间
RegisteredOwner / RegisteredOrganization 注册信息(案件归属线索)
NetworkList\Profiles\* 的 ProfileName / DateLastConnected WiFi SSID → 地理位置
SRUM\Extensions(GUID → DLL) SRUM 数据源说明(见 09)

B. 关机与启动(hive: SYSTEM,键根 ControlSet001\Control)

键/值 取证意义
Windows\ShutdownTime(FILETIME) 最后正常关机时间——判断是否断电的关键
Windows\SystemStartOptions 是否进入安全模式
Session Manager\BootExecute 被篡改的启动项(反取证标志)
Session Manager\AppCompatCache\AppCompatCache(REG_BINARY) ShimCache(见 06)

C. USB / 外接设备(hive: SYSTEM)

键/值 取证意义
ControlSet001\Enum\USBSTOR\Disk&Ven_*:设备名、序列号、厂商 U 盘身份(序列号唯一)
属性 0064(首次安装) / 0066(最后连接) / 0067(最后移除) 设备时间线
ControlSet001\Enum\USB(HID)、Enum\SCSI/NVMe(硬盘序列号) 外设与磁盘身份
HKLM\SYSTEM\MountedDevices 驱动器 → 卷序列号映射(曾挂载的卷)

Enum 键的设备属性值以 0064/0066 这类数字命名,需在注册表查看器里**把「名称」列设为「属性名」**才能读懂。

D. 持久化 / 启动项(hive: SOFTWARE 或 NTUSER)

键 取证意义
...\CurrentVersion\Run / RunOnce(HKLM 与 HKCU 各一份) 机器级 / 用户级自启动
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon Shell / Userinit——被篡改的 shell 加载
ControlSet001\Services\* ImagePath / Start——服务持久化(对应 7045 事件)
...\CurrentVersion\Image File Execution Options\* Debugger——无文件落地执行(IFEO 劫持)

E. 已安装软件与卸载残留(hive: SOFTWARE)

键 取证意义
...\CurrentVersion\Uninstall\* 已装软件(DisplayName/InstallDate/Publisher)
HKLM\SOFTWARE\Wow6432Node\...\Uninstall\* 32 位软件清单(见陷阱节)
...\CurrentVersion\Installer\UserData\* 已卸载软件仍留痕(常被忽视)

实战价值:「卸载残留」是反取证软件的死角——卸载不会清 UserData 子键。嫌疑人装过什么、用过什么破解工具,即使已卸载,痕迹常在此。

F. 用户行为(hive: NTUSER.DAT,详见 10)

均在 ...\Software\Microsoft\Windows\CurrentVersion\Explorer\ 下:RecentDocs(最近打开文档)、RunMRU(Win+R 历史)、TypedPaths(地址栏手输路径)、UserAssist\{CEBFF5CD-...}\Count(GUI 执行,ROT13 编码)、MountPoints2(曾挂载的卷/共享)、WordWheelQuery(搜索框关键词)。

G. 账户(hive: SAM)

键 取证意义
SAM\Domains\Account\Users\Names 账户名清单(\<RID> 内有登录次数、最后登录)
SAM\Domains\Builtin\Administrators 管理员组成员 RID
SAM\Domains\Account\Users 二进制值 V NTLM 哈希(结构化二进制),也是 EFS 解密的起点(见 EFS 文件系统加密取证)

2.5 注册表的时间戳从哪来

注册表键本身没有内嵌的修改时间字段——它来自 NTFS。hive 是普通文件,其 MFT 记录带标准四时间戳。

但键内的值可以自己带时间(InstallDate 存 Unix 时间、ShutdownTime 存 FILETIME)——这些才是精确的。

推论:不要把「hive 文件修改时间」当作「这个键被改的时间」。它只说明「这台机器的注册表在这个时刻有写入」。

2.6 事务日志(.LOG1/.LOG2)与「脏」hive

Windows 写注册表时先写事务日志,再周期性合并进主 hive。若系统异常断电,主 hive 可能落后于日志——此时部分近期修改仍在 .LOG1/.LOG2 里没合并,直接读主 hive 可能丢失最新变更(比如刚删的 Run 键还在日志里)。用支持日志回放的工具(如 Registry Explorer)可自动合并。

取证取舍:合并日志会修改 hive 副本。务必在副本上操作,保留原始 hive 作为证据原件,并记录合并动作。


三、操作步骤

3.1 第 1 步:从镜像提取 hive(含事务日志)

路径以实际系统为准;分区起始扇区 2048 需按实际 mmls 结果替换

mkdir -p /evidence/hives

3.1.1 系统 hive + 事务日志(保留原始证据,供需要时回放)

for h in SYSTEM SOFTWARE SAM SECURITY DEFAULT; do base=$(fls -o 2048 -r -p /work/DigiForensics.dd | grep -E "config/$h$" | head -1 | cut -d' ' -f2) icat -o 2048 /work/DigiForensics.dd "$base" > "/evidence/hives/$h" for lg in LOG1 LOG2; do li=$(fls -o 2048 -r -p /work/DigiForensics.dd | grep -E "config/$h.$lg$" | head -1 | cut -d' ' -f2) [ -n "$li" ] && icat -o 2048 /work/DigiForensics.dd "$li" > "/evidence/hives/$h.$lg" done done

3.1.2 用户 hive:先定位,再逐个用户导出

fls -o 2048 -r -p /work/DigiForensics.dd | grep -E 'NTUSER.DAT$|UsrClass.dat$'

3.1.3 验证:文件头必须是 regf(72656766)

for h in /evidence/hives/SYSTEM /evidence/hives/SOFTWARE; do printf '%s: ' "$h"; xxd -l 4 -p "$h"; done

3.2 第 2 步:确认当前控制集(★ 必做,ControlSet 坑)

rip.exe -p /evidence/hives/SYSTEM -a /tmp/select.txt select

\Select\Current : 1

判读:Current = 1 → 后续所有手工路径写 ControlSet001。若 Current = 2,则当前生效的是 ControlSet002(此时 ControlSet001 是「上次已知良好」)。

3.3 第 3 步:用 RegRipper 做批量提取

rip.exe 是插件化提取器——对每个 hive 跑一批相关插件,输出文本报告。-a 跑全部插件,-p hive -p 插件名 跑单插件,-aT 跑全部时间线插件(输出 CSV,可直接进时间线工具)。

SYSTEM hive

rip.exe -p /evidence/hives/SYSTEM -a /tmp/svc.txt svcscan # 全部服务与驱动 rip.exe -p /evidence/hives/SYSTEM -a /tmp/usb.txt usbstor # USBSTOR 设备 rip.exe -p /evidence/hives/SYSTEM -a /tmp/mem.txt prefetch # Prefetch 开关状态 rip.exe -p /evidence/hives/SYSTEM -a /tmp/net.txt netstat # 网络配置

SOFTWARE hive

rip.exe -p /evidence/hives/SOFTWARE -a /tmp/sw.txt uninstall # 已装/残留软件 rip.exe -p /evidence/hives/SOFTWARE -a /tmp/srum.txt srum # SRUM 配置(见第 09 篇)

NTUSER.DAT(逐用户)

rip.exe -p /evidence/hives/Administrator.NTUSER.DAT -a /tmp/ua.txt userassist rip.exe -p /evidence/hives/Administrator.NTUSER.D