所产生的Windows历史记录
关键词:USB存储Windows历史记录设备ID即插即用管理物理设备对象
摘要
当一个USB存储设备(比如一个U盘)连接到Windows系统时,系统就会创建一些标识符。这些标识符,也称作历史记录,在系统关闭时仍然存在。在许多情况下,这些历史记录可能被用来识别曾经连接到Windows系统的特定设备,以对存在的问题进行取证。 2005年爱思唯尔股份有限公司出版
引言
通用串行总线(USB)是允许将多种设备连接到计算机系统上的一种机制。随着各种各样的设备通过USB连接到一台计算机上已经变得很普遍,本文仅限于那些可选择的、可移动的存储介质。这不仅包括标准的“U盘”,还包括数码相机、个人媒体播放器以及伪装了的存储设备,比如一把包括数字存储空间和其它特征的瑞士小刀。这种存储介质为用户快速交换文件提供了前所未有的便利。近几年这种设备的价格疯狂下跌,但是其存储密度却有很大的提高。
这种存储设备在给用户带来方便的同时,也带来了不可忽视的安全风险,特别是在企业环境中。这种容量大体积小的存储设备为下载和窃取大量隐私和敏感的信息提供了掩护。一张标准的3.5英寸软盘虽然很容易藏在衣服的口袋里,但它只能存储1.44MB的数据,而一个拥有1GB甚至更大存储空间的U盘可以很容易的藏起来,并且可以容得下整个数据库。许多数码相机在Windows系统中被用作标准的存储媒体,并且标有盘符,还可以像U盘一样使用。
为了提供从一个系统中转移数据的方法,USB存储设备可以将外部代码输入到另外的受保护的系统或者网络。在限制了像防火墙和入侵检测系统等边界防御程序效率的情况下,终端用户如果使用了未经检查或未被监控的USB存储设备时,恶意的代码可能会在无意中或以其它方式引入。
当一个USB存储设备连接到一个Windows系统时,这个系统上的驱动器会收集这个设备的信息,然后它会利用这些信息在这个系统上建立一个独立的历史记录。这个信息被固存在这个系统中,而且大多数情况下在其它的Windows系统下这个信息也是一样的。这些历史记录可以延续连接在这个系统上的USB存储设备的使用时间线,还可以证明这个设备曾连接到其它的Windows系统。这个信息可以用来进一步进行计算机取证调查并且记录下来。
这篇文章讨论的样例操作系统是Windows XP,并且大部分的信息也适用于Windows2000和2003。
论述
当一个存储设备通过USB接口连接到一个Windows系统时,操作系统就会发现这个新硬件的附加信息,并且相关的驱动器就会寻求这个设备的确切描述符[1],以确定设备的制造商、版本号、设备种类以及其它信息。如果USB集线器驱动发现一个新的USB设备连接到这个系统,系统就会试图恢复这个设备的确切描述符。
基于从这个设备上恢复的描述符,Windows就会按照如下格式创建设备实例标识符(设备ID)[2]:
USB\VID_v(4)&PID_d(4)&REV_r(4)
设备ID中所呈现出的数值直接取自设备描述符[3]。v(4)是设备描述符中idVendor域的一个四
基于USB 接口的HID 设备接口设计·论文翻译水性涂料分散剂
2
穿孔管位供应商代码,d(4)是idProduct 域中的一个四位产品代码。r(4)是一个四位的版本代码。
Windows 也会从设备描述中提取类别码(bDeviceClass 域)、子类别码(bDeviceSublass 域)和协议码(bDeviceProtocol 域),以便列出兼容的设备描述符(兼容ID )清单。
如果想看这种描述符的例子,可
热转印墨水以在USB 存储设备连接在系统上时打
开设备管理器。在通用串行总线控制
器下选择对应的设备(比如USB Mass
Storage Device ),然后右击并从下拉菜
单中选择属性。再选择详细信息标
签,然后从下拉单选择设备范例ID 、
硬件ID 或者兼容ID 。相应的值就会
显示在详细信息这一栏的文本框中,
如图1所示。
即插即用管理器就会访问注册表
以定位即插即用设备的inf 文件。这个
注册表键是:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion
答案就是“DevicePath ”的值。这个值的数据类型为REG_EXPAND_SZ ,意思就是这个数据可以有多个路径值。在默认情况下,这个路径指向Windows 系统目录的INF 文件夹(也就是%SYSTEMROOT%\Inf )。
即插即用管理器会根据设备范例ID 和兼容ID 寻设备路径注册表键中所列出的相应驱动的路径,然后在0到0xFFFF 之间对发现的驱动进行排序[4]。序号最低的驱动就会被安装,即装载。usbstor.inf 文件明确地列出了操作系统所支持的设备ID 。如果从设备描述符中所获取的描述符与usbstor.inf 文件中的任何一个相匹配,操作系统就会装载usbstor.sys 驱动[5]。
一旦驱动被装载,系统就会为每一个设备逻辑单元创建一个新的物理设备对象,即PDO 。PDO 的格式如下:
USBSTOR\v(8)p(16)r(4)
在PDO 中,v(8)是一个8位字符的供应商标识符,p(16)是一个16位字符的产品标识符,r(4)是一个4位字符的版本级别。
通过设备管理器查看设备ID ,就会发现有另外的12位附加在设备ID 后面(如上所述)。这是设备的序列号。设备的设备描述符包含一个叫做iSerialNumber 的值,这就是含有设备序列号的字符串的索
引。如果iSerialNumber 的值是0x00,那么这个设备就没有序列号;否则它的值就是可以被到的代表设备序列号的字符串的索引[6]。这个序列号对这个设备来说是独有的,并且是用于识别系统中设备的独特方法。这个序列号在其它的Windows
系统中也是识别设备的独特方法。注意
图1设备属性的详细信息标签中显示设备范例
ID
图2通过UVCView 查看到的序列号
跟踪USB存储:分析USB存储器所产生的Windows历史记录
到对于每一个USB的详细描述,序列号并不是必须要含有的这一点很重要。关于这方面的其它问题将在说明部分作深入探讨。
用USB连接的存储设备的序列号可以用UVCView[7]工具查看,这个工具可以从MS得到。图2显示了通过UVCView查到的一个用USB连接的存储设备的序列号。
没有序列号的设备,将会在第二个“&”字符后面赋上12位字符。详细说明如何创建这个标识符的文件是无法从供应商那里获得的,但是实验和经验表明倒数第二个字符也是“&”,并且最后的值与设备所连接的USB端口对应。
设备范例ID[8]是由即插即用管理器生成的,并且会随着同一个硬件所插入的同一个USB集线器端口的不同而变化。
一旦设备连接上并且用户已经访问了这个存储设备,连接的痕迹,即历史记录就会在注册表和文件系统中表现出来。
我们关注的第一个注册表键就是:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Enum\USB
在这个注册表键下面还有一系列的子键,每一个都和之前介绍过的设备ID有相似的格式(即USB\VID_v(4)&PID_d(4)&REV_r(4))。这些设备ID的每一个子键都有一个或者更多的子键,这些都是曾连接到过这个系统的设备的范例ID。
我们关注的第二个注册表键是:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Enum\USBStor
在HKLM\..\Enum\USBStor键之下的子键和USB键之下的设备ID子键有相似的格式,但是这种十六进制的值可以被人们可以读懂的数值替换。一般情况下,在USBStor键下将会有更少的子键,因为它具体到USB大容量存储设备,而USB键是为用USB连接的设备而设的。
就像USB子键一样,在USBStor键下的设备ID子键之下也有一个甚至更多的范例ID子键,它代表了每一个曾连接到这个系统的设备。图3给出了对应的注册表键的样例,显示了同一个设备的USB和USBStor键的入口。
注册表有一个被称作“最后写入”时间并与它们相关的值。这个值和最后修改时间相近,并和文件有关,因为它以某种方式表示了注册表键最后一次修改的时间。当为了各种各样的值而查询注册表键时,根据与USB存储设备有关的用户行为,这个键的最后修改时间可以用来记录部分时间线。
图3标准USB存储设备的注册表入口样例
3
基于USB 接口的HID 设备接口设计·论文翻译
4
别外,带有驱动盘符的USB 存储设备可以通过查看如下注册表键下的注册表值看到。
HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices\
为了确定这个USB 存储设备被分配了哪一个驱动盘符,我们必须从USBSTOR 下的设备注册表键的“ParentIDPrefix ”中取出值。我们将利用图3中设备的值“8&2713a8a1&0”作为一个例子。
注册表键HKLM\System\MountedDevices (见图4)维护着安装管理器永久的名称数据库[9]。这个键下的值由一系列不同的卷名称(以“\??\Volume{GUID}\”的格式存在)和驱动盘符(用“\DosDevices\C:”格式表示)组成。安装点也可能包含在内(用如下格式表示:“\DosDevices\drive letter:\mountpoint ”)。每一个这种符号链接都伴有特有的卷标识符(不要和特有的卷名称混淆)。这种特有的ID 允许系统识别一些表示同一个卷的符号链接名。这些特有的ID 包含了ParentIDPrefix 的值。
iomv所有这些子键的值都以二进制的形式存储。这个值(二进制数据,即REG_BINARY 数据类型)的小数点后35位是与具体子键有关的存储设备的ParentIDPrefix 值,如图5的屏幕截图所示。
这个信息可以用来将具体的USB 存储设备映射到分配给它的驱动盘符。
图6举例说明了贯穿USBStor 键并列举设备的Perl 脚本的输出。
Perl 脚本贯穿于USBStor 注册表键并且列举出每一个和设备ID 相一致的子键。这个脚本显示了带有最后写入时间的设备ID ,就是键名右边括号中所显示的内容。这个脚本对设备ID 键之下的每一个范例ID 键名做出相同的处理,另外,还显示出“DeviceDescr ”的值。在这些现象的背后,
图4
安装设备的注册表键
图5高亮显示ParentIDPrefix 的安装设备数据
跟踪USB 存储:分析USB 存储器所产生的Windows 历史记录
5这个脚本从每一个范例ID 子键中收集ParentIDPrefix 的数据。然后分析并且部分显示安装设备键的
内容,并利用预先收集到的ParentIDPrefix 值将用USB 连接的存储设备映射到分配给这个设备的驱动盘符。
然而,驱动盘符的分配并不是唯一的。前面图6所举的例子是2005年4月5日,星期二,收集到的。序列号是0738015025AC 的USB 存储设备是在那一天连接到测试系统的,并且分配的盘符是“D:”。然而,注册表键中的最后写入时间并没有如前所述的那样反应对驱动盘符的操作。将序列号为9487B4B0401DB6B5的USB 存储设备连接到系统上并重新运行usbkeys.pl 的Perl 脚本,产生了图7所示的输出。
注意安装设备键已经更新,就像已经改过了的伴随这个键的最后写入时间(“Mounted-Devices ”右边的括号中)所揭示的那样。新设备驱动盘符的重新分配引起了最后写入时间的更新。
利用这些信息,检查员就可以利用其它系统上的历史记录(例如最近访问的文档和LNK 文件)来更深入地了解特定的USB
新型碾米机环保型存储设备的用途。
图7usbkeys.pl 的Perl
csi lv脚本输出样例
图6usbkeys.pl 的Perl 脚本输出样例