【取证】浅谈注册表与磁盘盘符的关系

【取证】浅谈注册表与磁盘盘符的关系
FatPig磁盘挂载信息在注册表中的位置
已挂载设备的配置信息存储在以下注册表键中:
HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices
此键值集合也称为装载管理器的持久名称数据库,用于记录卷的唯一标识符、驱动器号及装入点信息。
\MountedDevice键值类型与数据结构
名称 | 数据类型 | 描述 |
---|---|---|
%IDENTIFIER% |
REG_BINARY |
支持以下标识符格式: |
\DosDevices\C:
— 分配给文件系统根目录的驱动器盘符(如C盘)。\DosDevices\F:\path\name
— 分配给文件系统内目录的驱动器盘符(罕见)。??\Volume{GUID}
— Windows内核对象管理器使用的唯一卷标识符(GUID格式)。#{GUID}
— 用途未知的保留标识符。
键值数据包含以下三类之一:
- 设备字符串值数据(UTF-16字符串)
- GPT分区值数据(24字节结构)
- MBR分区值数据(12字节结构)
对于固定磁盘(本地磁盘) 的键值数据形式是GPT分区值数据或MBR分区值数据,对于可移动磁盘(U盘、CD-ROM等)的键值数据形式是设备字符串值数据。USB移动硬盘或量产为USB HDD的闪存盘属于固定磁盘(本地磁盘)
设备字符串值数据
结构:
偏移量 | 大小 | 值 | 描述 |
---|---|---|---|
0 | … | 类似以下示例 | UTF-16小端编码字符串,无终止符 |
示例:
1 | \??\SCSICdRom&Ven_NECVMWar&Prod_VMware_SATA_CD015&260e6d66&0&010000{53f5630d-b6bf-11d0-94f2-00a0c91efb8b} |
GPT分区值数据
结构(24字节):
偏移量 | 大小 | 值 | 描述 |
---|---|---|---|
0 | 8 | DMIO:ID: |
磁盘管理器I/O驱动签名 |
8 | 16 | GUID | GPT分区标识符(小端) |
MBR分区值数据
结构(12字节):
偏移量 | 大小 | 描述 |
---|---|---|
0 | 4 | MBR磁盘标识符(签名) |
4 | 8 | 分区字节偏移量 |
如何确定磁盘所对应盘符
目前我们知道通过在注册表HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices 中,如果是GPT分区的固定磁盘,在该注册表中记录的是GPT的分区表 GUID(Partition GUID),如果是MBR分区的固定磁盘,在该注册表中记录的是MBR的硬盘签名(disk signature),如果是可移动磁盘(USB、CDROM)等设备记录的是设备信息的字符串数据,因此针对不同格式的磁盘,我们在磁盘中找到对应的硬盘签名(disk signature)、GUID(Partition GUID)或序列号(Serial number),与注册表中键值数据进行比对,我们就能确定当前所分析的磁盘对应的盘符。
查看 GPT 分区表 GUID
注意:这里查看的是已挂载磁盘分区表的GUID(Partition GUID)不是硬盘GUID(Disk Guid)
打开磁盘或磁盘镜像
启动 WinHex,以管理员身份运行(需权限访问物理磁盘)。
打开磁盘:点击菜单栏
工具
→打开磁盘
(快捷键:F9),选择目标物理驱动器(如Physical Media\Disk 1
)或者打开磁盘镜像:点击菜单栏
文件
→打开
(快捷键:Ctrl+O),选择要打开的磁盘镜像文件,点击菜单栏专业工具
→将镜像文件转化为磁盘
。
查看GPT 分区表信息
方式一:点击文本信息栏顶部一个形如
v
的按钮→分区表(模板)
。同时v
下也显示当前硬盘下的分区信息,一般来说容量最大的分区就是我要要找的已挂载并被分配盘符的分区。方式二:点击菜单栏
查看
→模板管理器
(快捷键:Alt+F12),选择GUID Partition Table模板并应用
读取 GUID
找到那个容量最大的主要分区的分区表信息, Unique Partition GUID 为此分区的 唯一GUID(小端格式)。
第一个 Unique Partition GUID 是十六进制格式的分区GUID,可以看到他与注册表中**\DosDevices\C:**的键值数据中第9到24字节的数据是一致的,说明该分区对应挂载的盘符就是C盘
1
D4 94 BE 74 80 FD 29 43 92 A5 B0 7C 14 C5 5A 9F
第二个 Unique Partition GUID是转化为字符串的分区GUID,首先这边的GUID数据是小端序(Little-Endian)存储,但是这里的GUID转化不是简单的逆序一下,有特定的规则
1. 分解原始数据
原始数据为32个十六进制字符(128位),需按GUID的格式(8-4-4-4-12)分解为以下5组:
1
D494BE74 80FD 2943 92A5 B07C14C55A9F
2. 调整小端字节序
由于GUID的 前3部分 采用小端存储,需对每部分内的字节顺序进行反转:(十六进制中每两个字符为一个字节,调整顺序时是每两个字符看做一组进行调整的)
- 第一部分
D494BE74
→ 反转后为74BE94D4
- 第二部分
80FD
→ 反转后为FD80
- 第三部分
2943
→ 反转后为4329
- 第四部分
92A5
→ 反转后为92A5
- 第五部分
B07C14C55A9F
→ 无需反转(保持原顺序)
3. 生成标准GUID字符串
将调整后的各组以连字符连接,得到最终结果:
1
74BE94D4-FD80-4329-92A5-B07C14C55A9F
对应GUID:
{74BE94D4-FD80-4329-92A5-B07C14C55A9F}
这里是题外话,如果只是想看磁盘分区对应的盘符,用十六进制数据去比对反而更快
- 第一部分
查看 MBR 磁盘签名
打开磁盘
- 同上步骤,打开目标 MBR 格式的磁盘或磁盘镜像
查看MBR分区表信息
方式一:点击文本信息栏顶部一个形如
v
的按钮→分区表(模板)
。方式二:点击菜单栏
查看
→模板管理器
(快捷键:Alt+F12),选择Matser Boot Record模板并应用
读取签名值
方式一:MBR分区表信息信息中Windows disk signature的值就是MBR分区磁盘的磁盘签名(disk signature),下面的那个Same reversed就是磁盘签名的原始十六进制数据(小端序),可以看到这里的磁盘签名(disk signature)与注册表中**\DosDevices\F:**的键值数据中第1到4字节的数据是一致的,说明该分区对应挂载的盘符就是F盘
方式二:MBR 磁盘签名位于首扇区(LBA 0)偏移
0x1B8
(十进制440)处,占 4字节。点击菜单栏
导航
→转移到偏移量
(快捷键:Alt+G), 输入1B8
→确定
直接跳转。该处往后的四个字节
FB 98 60 E1
就是磁盘签名的十六进制数据:(小端转换为实际值FB 98 60 E1
就是磁盘签名)。
查看 USB 设备序列号
在\MountedDevice中对于可移动设备的键值数据是一段描述设备信息的字符串(格式如_??_USBSTOR#Disk&Ven_TOSHIBA&Prod_TransMemory&Rev_PMAP#序列号&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}),其中包含了USB设备的序列号,因此我们只要找到USB设备的序列号就能找到对应的盘符,但是USB设备的序列号通常存储在设备的固件描述符中,由操作系统通过USB协议读取。多数USB设备的序列号存储在控制器固件中,无法通过WinHex直接读取,因此这里要查看可移动磁盘的序列号就要挂载,既然挂载了,我就已经知道盘符了,再去比对注册表就多次一举了,所以以下仅谈论如何查看 USB 设备序列号。
1. 通过系统工具查看
Windows 设备管理器:
右击“此电脑” → 管理 → 设备管理器。
找到目标USB设备(如U盘、鼠标等),右击 → 属性 → 详细信息。
在属性下拉菜单中选择 “设备实例路径” 或 **”父系”**,其中可能包含序列号(格式如
VEN_XXXX&PROD_XXXX&REV_XXXX&序列号&0
或VID_XXXX&PID_XXXX&序列号
)。
命令行/PowerShell:
1
Get-PnpDevice -PresentOnly | Where-Object { $_.InstanceId -match 'USB\\VID' } | Select-Object FriendlyName, InstanceId
2. 通过注册表查找
打开
注册表编辑器
(regedit)。导航至路径:
1
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB
在子键中查找设备对应的VID/PID,其下的子键一般就是序列号。