引言
最近在网络安全的学习中,关于取证方面有很多之前不理解并且很复杂的问题,Windows取证最容易"工具一堆、思路发散"。今天与大家一起分享自己的一些经验。
1. 什么是注册表
如果把Windows主机比做成一个人,那么注册表就是他的记忆宫殿。
操作系统什么时候出生的?名字是什么?安装过什么软件?哪些用户登录过?这些都藏在这本"日记本里"。
注册表不是一大堆文件堆在一起,而是一个巨大树形结构的数据库,系统和用户做的每一件事都会留下痕迹。所以注册表在我们的取证过程中,就是一个"信息金矿":
- 系统环境:版本,安装时间,时区,主机名。
- 硬盘驱动:开机时加载了哪些部件
- 账户档案:这台机器上有谁的账号,什么时候创建的,登录过几次
- 安全策略:密码复杂度,本地安全设置
- 用户习惯:常用的程序,点开过哪些文件,插过什么U盘。
总之,注册表=Windows的黑匣子。飞机出事就得找黑匣子,电脑有问题也是一样。
2. Registry Hive
前面我们说过,注册表不是简单的单一文件,也不是很贱的堆砌,而是分成了很多hive文件,分别存储不同的信息。接下来给大家介绍一下常见的HIVE
|-------------------------------------------------------------------------------------------------|--------------------|---------------------------------|----------------------|
| Hive文件 | 注册表路径 | 包含的信息 | 取证的用途 |
| SYSTEM (C:\Windows\System32\config\SYSTEM) | HKLM\SYSTEM | 驱动、服务、ControlSets、时区、主机名等 | 确认OS环境、时区、硬件配置 |
| SOFTWARE (...\SOFTWARE) | HKLM\SOFTWARE | 已经安装的程序、系统设置 | 操作系统的版本、已装软件 |
| SAM (...\SAM) | HKLM\SAM | Secruity Accounts Manager | 用户、组、RID、hash |
| SECURITY (...\SECURITY) | HKLM\SECURITY | 本地安全策略 | 权限与安全配置 |
| NTUSER.DAT (C:\Users\<username>\NTUSER.DAT) (C:\Documents and settings\<username>\..) | HKCU\<SID>/HKCU | 用户个性配置、UserAssist、MountPoints2等 | 谁在用这台电脑,用过哪些程序,看过哪些盘 |
这里简单说一些注册表路径,正常你通过硬盘路径去找到对应的Hive文件,你是打不开的。因为这些文件,每次开机时,系统会把他写到内存中,并且平装成数的结构,这个树的根节点就是HKLM。你只能使用专门的工具去打开它,比如regedit.exe(大部分windows自带,可以直接搜索用它)
此外,HKLM=HKEY_LOCAL_MACHINE,是系统级别文件,SYSTEM,SOFTWARE,SAM,SECURITY是属于。
NTUSER.DAT是用户级别的HIVE文件,每个用户都有一份
3. 先把环境钉死(OS/时区/主机名)
当你开始去进行取证的时候,首先要去观察最基本的信息。先回答一句话
"这台机子是谁的、在哪个时区、什么时候装的系统?"
只有钉死环境,后面的时间线才不会断
3.1 操作系统版本和安装时间
前面表格中说了,要查看这些信息在哪里? 是在SOFTWARE这个hive文件下。
具体查看版本和安装时间呢是在键值:HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion查看。下图我已自己的电脑举例:

我用regedit去打开观察,可以看到对应的关键字段:
ProductName->安装版本(我这里的版本就是Windows 10)
InstallDate->安装时间(我这里展示的就是该电脑的时间戳)
3.2 时区和偏移
时区在我们的取证过程中是非常的重要的,任何的证据都有时间线,那么时区一定要找对!在哪呢? 他在HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation。下图我依旧以自己的电脑举例:

关键字段:
TimeZoneKeyName-> 就是你的时区
ActiveTimeBias -> 偏移量
Local = UTC - ActiveTimeBias
3.3 确认ControlSet
事实上,我们在取证的时候,通常都是离线分析的。离线的情况下呢,我们是看不到前面所提到的CurrentControlSet的,你能见到的是ControlSet001/002。重要的是,真正生效的是CurrentControlSet,所以我们是要去确认用哪一套001还是002。在哪看呢?通常我们在SYSTEM\Select下去读取Current的值,就能确定了!

3.4 主机名和网络参数
主机名:HKLM\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName

网络参数:HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

总结一下,我们取证的一开始,先干啥?
-
确认
ProductName
与InstallDate
-
确认
Select\Current
→ 正确 ControlSet -
取
TimeZoneKeyName
与ActiveTimeBias
,写清换算规则 -
记录
ComputerName
与网络配置
4. 账号画像:谁在用这台电脑(SAM)
如果注册表是 Windows 的"户口本",那 SAM (Security Accounts Manager) 就是"人口信息登记簿"。所有本地用户账号、RID(相当于身份证号)、登录计数和状态,都能在这里找到。
4.1 关键位置
路径:HKLM\SAM\Domains\Account\Users\

4.2 数据结构
在User\子键下,每个RID对应一个账号。重点要关注 F 和 V两个value。
F值(Fixed data)
-
账号创建时间
-
上次登录时间
-
登录失败次数
-
总登录次数
-
账号状态(启用/禁用)

V值(Variable data)
-
用户显示名
-
注释/描述
-
Home 目录
-
LM/NTLM Hash 的偏移和长度

简单说:F 值看"账号的活动记录",V 值看"账号的基本资料和凭据"。
5. 观察USB
在取证过程中,去观测USB的使用情况,也很重要。比如"电脑中某个 U 盘是谁的/什么时候插的/挂到哪个盘符/哪个用户看见过它" 我们可以按这个顺序走,一步不漏去观察USB
记忆口诀:插 → 装 → 映 → 人 → 链(USBSTOR → setupapi.dev.log → MountedDevices → MountPoints2 → .lnk)
5.1 插(USBSTOR):插了什么?有序列号没?
-
注册表位置(关键) :
HKLM\SYSTEM\<ControlSetXXX>\Enum\USBSTOR
-
能拿到的:厂商、型号、设备 ID/序列号(Serial)。
-
为什么重要:序列号是把物理设备和系统日志串起来的黄金索引(同型号设备靠序列号区分)。
大家重点关注展示出的USB信息:

大家就可以看到该USB的各种信息,比如厂商的名字等等...
5.2 装(setupapi.dev.log / setupapi.log):什么时候被系统"装入"?
-
日志位置:
-
Windows 7 及以后:
C:\Windows\inf\setupapi.dev.log
-
Windows XP:
C:\Windows\setupapi.log
-
-
做什么 :在日志里用设备序列号或设备 ID 搜索 "first install" / "install" 记录,找到首次安装/驱动安装时间,通常就是该设备第一次接入并被系统注册的时间点(时间戳为重要锚点)。

图中就可以看到对应启动的时间
5.3映(MountedDevices):分到了哪个盘符 / 卷 GUID?
-
注册表位置 :
HKLM\SYSTEM\<ControlSetXXX>\MountedDevices
-
能拿到的 :
\\DosDevices\\E:
↔\\??\\Volume{GUID}
的映射关系(即 Volume GUID ↔ 盘符)。 -
用途 :把"物理设备"映射到"文件系统上的盘符",方便定位盘中的具体文件路径(例如
E:\somefolder\file.doc
)。 -
Tip :MountedDevices 存的是 卷 GUID(而不是设备序列号),下一步需要把卷 GUID 和 USB 的序列号关联(通过 .lnk 或 NTFS 卷序列号)。
5.4 人(MountPoints2):哪个用户见过这卷?
-
注册表位置(按用户) :
每个用户的 hive:
NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2
-
能拿到的:在某个用户的 NTUSER.DAT 下,会保存该用户见过的卷 GUID / 挂载点信息。
-
用途:把"卷 GUID"反查到"哪个用户的会话里出现过",从而把设备使用痕迹绑定到具体用户(而不是仅仅绑定到设备)。
-
注意:这一步必须对每个用户的 NTUSER.DAT 都做一次(多用户机器常被忽视)。
5.5 链(.lnk):盘里到底访问了什么?
-
位置 :
%APPDATA%\Microsoft\Windows\Recent\
(也要全盘搜*.lnk
) -
为什么关键 :
.lnk
(快捷方式)通常包含 目标绝对路径、目标文件时间戳、卷序列号(Volume Serial Number)。- 卷序列号可以用来把
.lnk
的目标和 MountedDevices/USBSTOR 链接起来(序列号 ↔ 卷 GUID ↔ USB 序列号)。
- 卷序列号可以用来把
-
举例 :某个
.lnk
的目标是E:\Photos\secret.jpg
,并且记录了该目标的卷序列号为0x1A2B3C4D
,而E:
所对应的卷 GUID 又映射到你在 MountedDevices 里看到的 GUID,USBSTOR 给出的序列号通过 setupapi.log 的时间吻合 → 你就能说:"在 T 时间,用户 X 打开了位于该 U 盘(序列 ABC)的 secret.jpg"。
6. .lnk 快捷方式
在 Windows 里,每次用户双击打开一个文件,系统常常会贴心地生成一个 快捷方式(.lnk 文件),放在 Recent 目录里。对用户来说它只是"最近文件列表",但对取证人员来说,.lnk 就是显微镜------能放大看清"某个用户在某个时间打开了某个盘里的某个文件"。C:\Users\%UserName%\AppData\Roaming\Microsoft\Windows\Recent 可以看到你.lnk文件
6.1 .lnk 最有价值三个信息
一个.lnk文件包含的字段很多,但是对取证来说最核心的是这三个:
-
目标路径 (Target Path)
文件或目录的完整路径,例如:
E:\Secret\flag.docx
。 -
目标时间戳 (Target Timestamps)
至少有创建/修改/访问时间(MAC times),可以对比文件系统元数据来交叉验证。
-
卷序列号 (Volume Serial Number)
这是关键!它能把
.lnk
的目标卷和 MountedDevices / USBSTOR 里的记录关联起来。

7. 程序执行证据:Prefetch × UserAssist 双证
想要证明"某个程序真的跑过",Windows 提供了两个很好用的证据点:
一个是 系统级的 Prefetch ,一个是 用户级的 UserAssist 。
前者像是"监控室录像",后者像是"门禁打卡记录"。双管齐下,才能硬邦邦。
7.1 Prefetch:系统级的"开机录像"
-
位置 :
C:\Windows\Prefetch\*.pf
-
作用 :Windows 为了加速启动,会在程序第一次运行时创建一个
.pf
文件,里面记下了它加载了哪些 DLL,以及启动情况。 -
关键字段:
-
EXE 名字(哪个程序跑了)
-
Run Count(跑过几次)
-
Last Run Time(最后一次是什么时候)
-
DLL 列表(运行时加载了啥库)
-
解析工具 :SIFT 的 prefetch.py
、MiTeC Windows File Analyser、PrefetchForensics。
⚠️ 注意:Prefetch 可能被清理/禁用,所以"没有 ≠ 没执行过"。

7.2 UserAssist:用户维度的"打卡机"
-
位置 :
NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\{GUID}\Count
大家可以看到这上面的信息是很奇怪的,是看不懂的,怎么还有P盘这种东西,事实上这些都是编码过后的。
项目名是 ROT13 编码(解码后能看懂路径/程序名)

以上通过放在Cyberchef解码后就能看懂,原来这个P就是C!!
User Assist也有局限性:只统计 从 Explorer 启动的程序,命令行或脚本运行的可能不会出现。
常用工具 :RegRipper 的 userassist
插件、NirSoft UserAssistView。
7.3 Prefetch × UserAssist = 双保险
-
Prefetch 证明:"程序在系统上确实执行过"。
-
UserAssist 证明:"哪个用户触发了这个执行"。
举个例子,取证报告中,我们就可以说在本案磁盘镜像的 Prefetch 目录中发现 WEIXIN.EXE-XXXXXXXX.pf
,该 prefetch 文件记录显示 weixin.exe
在 2025-10-04T10:12:34Z(UTC) 被执行,累计运行次数为 N 次(见证据项 1)。
同时,在 C:\Users\A\NTUSER.DAT
的 UserAssist 区 (HKCU\...\Explorer\UserAssist\{GUID}\Count
) 中存在解码后的 weixin.exe
条目,记录的最后运行时间与 Prefetch 时间一致(或在可接受时间误差范围内),运行计数 > 0(见证据项 2)。
综合以上两项证据(机器级执行记录 + 用户级触发记录),可合理得出结论:账户 A 的交互会话中确实由用户 A 发起并运行过 weixin.exe
。