Windows 2000/XP 系统对U盘的处理过程入手,逆向彻底消除U盘使用痕迹

如何彻底消除U盘使用痕迹?网上有许多资料,但是都是难以理解,假设作为操作系统,它不会保存无意义的U盘使用痕迹(如果故意设置后门当然不同),这些相关痕迹实际应该是操作系统快速识别移动存储设备必须的信息。Windows一般使用注册表来存储这样的信息,但是对于系统的重要更改,一般也会保留*.log的日志以方便排错。

对于计算机系统来说,U盘这样一个东西,实际是多个设备协同工作的系统。这样一个系统包括:通用串行总线-USB设备(含USB接口大容量存储设备-USB Mass Storage Device)、磁盘驱动器、存储卷。

从用户角度看,应该顺序是反过来的。首先关心的是实际存储数据的卷。那么,操作系统必须为用户关心的卷保留指向具体设备的信息。

对于每款U盘,厂方会写入制造商和产品信息,文本形式表示为:Ven_XXXX&Prod_XXXX……;数字形式表示为:Vid_nnnn&Pid_nnnn;制造商和产品的ID均为4位16进制数字,加上四位版本号,对于一款产品可以用12位16进制硬件编号来表示,也就是24bit长度ID,跟网卡的MAC有点类似:) (为什么硬件设备中24位长经常出现呢?),不过与MAC地址不同,U盘是以32bit厂的2进制数作为唯一标识的。

对应的注册键值(ClassGUID)为HKLM\CurrentControlSet\System\CurrentControlSet\Control\Class下的:
通用串行总线{36FC9E60-C465-11CF-8056-444553540000}
磁盘驱动器{4D36E967-E325-11CE-BFC1-08002BE10318}
存储卷{71A27CDD-812A-11D0-BEC7-08002BE2092F}

每次插入,对HKLM\CurrentControlSet\System\CurrentControlSet\Services\USBSTOR\Enum 下的
Count 和 NextInstance 进行改写,并依据NextInstance 建立一个临时索引,拔除时则反向操作。

但是容易让人迷惑的是,Windows 如何区分插入的U盘时曾经挂在过,驱动已经定位的设备呢?

我们注意到四个存储卷相关的项目:
{53f56307-b6bf-11d0-94f2-00a0c91efb8b} 磁盘驱动器注册位置,DeviceInstance值描述卷在 HKLM\SYSTEM\CurrentControlSet\Enum 下的路径,如果路径以USBSTOR开头,则表示是移动存储介质。
{53f56308-b6bf-11d0-94f2-00a0c91efb8b} 光驱注册位置,DeviceInstance值描述卷在 HKLM\SYSTEM\CurrentControlSet\Enum 下的路径,如果路径以USBSTOR开头,则表示是移动存储介质。
{53f5630a-b6bf-11d0-94f2-00a0c91efb8b} 可移动卷注册位置,所有项目也会出现在{53f5630d-b6bf-11d0-94f2-00a0c91efb8b} 中;
{53f5630d-b6bf-11d0-94f2-00a0c91efb8b} 及其所有曾经挂载的卷的注册位置,DeviceInstance值描述卷在 HKLM\SYSTEM\CurrentControlSet\Enum\STORAGE下的路径,如果路径以RemovableMedia开头,则表示是移动存储介质。
以及存储设备相关项目:
{a5dcbf10-6530-11d2-901f-00c04fb951ed}用于注册USB存储设备,其子项代表某个USB存储设备,DeviceInstance值描述设备在 HKLM\SYSTEM\CurrentControlSet\Enum\USB 中的路径

插入一个从来没有使用过的U盘,系统在HKLM\CurrentControlSet\System\CurrentControlSet\Services\USBSTOR\Enum 下创建代表某款产品12位16进制串为名称的键;
在 HKLM\SYSTEM\CurrentControlSet\Enum\USB 下建立 Vid 打头包含Vid_nnnn&Pid_nnnn形式制造商产品信息的键,在每个键下再以32bit设备ID的16进制串为名保存每个U盘的信息,其下Driver值为设备在{36FC9E60-C465-11CF-8056-444553540000}下的路径;
M\SYSTEM\CurrentControlSet\Enum\USBSTOR 下则以Disk&Ven开头加上形如Ven_XXXX&Prod_XXXX 制造商产品信息来创建键值,同样的,其下也有32bit16进制串为名的U盘信息,其下Driver值则是设备在{4D36E967-E325-11CE-BFC1-08002BE10318}下的路径;
HKLM\SYSTEM\CurrentControlSet\Enum\STORAGE\RemovableMedia 项目下也会为相应的卷建立项目和键值,同样的,Driver值也是U盘所映射的卷在{71A27CDD-812A-11D0-BEC7-08002BE2092F}下的路径,对windows普通用户来说,分区大多数情况下都等同于卷的。

同时, %windir%\setupapi.log 多出了类似这样的记录:

========================================================
[2008/06/20 22:26:19 920.3 Driver Install]
#-019 正在查找硬件 ID(s): usb\vid_17ef&pid_3833&rev_0100,usb\vid_17ef&pid_3833
#-018 正在查找兼容 ID(s): usb\class_08&subclass_06&prot_50,usb\class_08&subclass_06,usb\class_08
#-198 处理的命令行: C:\WINDOWS\system32\services.exe
#I022 在 “C:\WINDOWS\inf\usbstor.inf” 中发现了 “USB\Class_08&SubClass_06&Prot_50″;设备: “USB Mass Storage Device”;驱动程序: “USB Mass Storage Device”;提供程序: “Microsoft”;制造商: “兼容 USB 存储设备”;段: “USBSTOR_BULK”
#I023 实际安装部分: [USBSTOR_BULK.NT]。等级: 0x00002000。驱动程序有效日期: 07/01/2001。
#-166 设备安装函数: DIF_SELECTBESTCOMPATDRV。
#I063 从 [USBSTOR_BULK] 中的 “c:\windows\inf\usbstor.inf” 选择驱动器安装服务。
#I320 设备的类别 GUID 依旧为: {36FC9E60-C465-11CF-8056-444553540000}。
#I060 设置所选的驱动器。
#I058 选择最兼容的驱动器。
#-166 设备安装函数: DIF_INSTALLDEVICEFILES。
#I124 正在做“仅复制”安装 “USB\VID_17EF&PID_3833\000076356644″。
#-166 设备安装函数: DIF_REGISTER_COINSTALLERS。
#I056 注册了共同安装程序。
#-166 设备安装函数: DIF_INSTALLINTERFACES。
#-011 正在从 “c:\windows\inf\usbstor.inf” 安装段 [USBSTOR_BULK.NT.Interfaces]。
#I054 安装接口。
#-166 设备安装函数: DIF_INSTALLDEVICE。
#I123 进行 “USB\VID_17EF&PID_3833\000076356644” 的完整安装。
#I121 “USB\VID_17EF&PID_3833\000076356644” 的设备安装成功完成。
[2008/06/20 22:26:23 920.7 Driver Install]
#-019 正在查找硬件 ID(s): usbstor\disklenovo__usb_flash_drive_5.00,usbstor\disklenovo__usb_flash_drive_,usbstor\disklenovo__,usbstor\lenovo__usb_flash_drive_5,lenovo__usb_flash_drive_5,usbstor\gendisk,gendisk
#-018 正在查找兼容 ID(s): usbstor\disk,usbstor\raw
#-198 处理的命令行: C:\WINDOWS\system32\services.exe
#I022 在 “C:\WINDOWS\inf\disk.inf” 中发现了 “GenDisk”;设备: “磁盘驱动器”;驱动程序: “磁盘驱动器”;提供程序: “Microsoft”;制造商: “(标准磁盘驱动器)”;段: “disk_install”
#I023 实际安装部分: [disk_install.NT]。等级: 0x00000006。驱动程序有效日期: 07/01/2001。
#-166 设备安装函数: DIF_SELECTBESTCOMPATDRV。
#I063 从 [disk_install] 中的 “c:\windows\inf\disk.inf” 选择驱动器安装服务。
#I320 设备的类别 GUID 依旧为: {4D36E967-E325-11CE-BFC1-08002BE10318}。
#I060 设置所选的驱动器。
#I058 选择最兼容的驱动器。
#-166 设备安装函数: DIF_INSTALLDEVICEFILES。
#I124 正在做“仅复制”安装 “USBSTOR\DISK&VEN_LENOVO&PROD_USB_FLASH_DRIVE&REV_5.00\000076356644&0″。
#-166 设备安装函数: DIF_REGISTER_COINSTALLERS。
#I056 注册了共同安装程序。
#-166 设备安装函数: DIF_INSTALLINTERFACES。
#-011 正在从 “c:\windows\inf\disk.inf” 安装段 [disk_install.NT.Interfaces]。
#I054 安装接口。
#-166 设备安装函数: DIF_INSTALLDEVICE。
#I123 进行 “USBSTOR\DISK&VEN_LENOVO&PROD_USB_FLASH_DRIVE&REV_5.00\000076356644&0” 的完整安装。
#I121 “USBSTOR\DISK&VEN_LENOVO&PROD_USB_FLASH_DRIVE&REV_5.00\000076356644&0” 的设备安装成功完成。
[2008/06/20 22:26:27 920.11 Driver Install]
#-019 正在查找硬件 ID(s): storage\volume
#-018 正在查找兼容 ID(s): storage\volume
#-198 处理的命令行: C:\WINDOWS\system32\services.exe
#I022 在 “C:\WINDOWS\inf\volume.inf” 中发现了 “STORAGE\Volume”;设备: “通用卷”;驱动程序: “通用卷”;提供程序: “Microsoft”;制造商: “Microsoft”;段: “volume_install”
#I023 实际安装部分: [volume_install]。等级: 0x00000000。驱动程序有效日期: 07/01/2001。
#-166 设备安装函数: DIF_SELECTBESTCOMPATDRV。
#I063 从 [volume_install] 中的 “c:\windows\inf\volume.inf” 选择驱动器安装服务。
#I320 设备的类别 GUID 依旧为: {71A27CDD-812A-11D0-BEC7-08002BE2092F}。
#I060 设置所选的驱动器。
#I058 选择最兼容的驱动器。
#-166 设备安装函数: DIF_INSTALLDEVICEFILES。
#I124 正在做“仅复制”安装 “STORAGE\REMOVABLEMEDIA\7&3AEEDC50&0&RM”。
#-166 设备安装函数: DIF_REGISTER_COINSTALLERS。
#I056 注册了共同安装程序。
#-166 设备安装函数: DIF_INSTALLINTERFACES。
#-011 正在从 “c:\windows\inf\volume.inf” 安装段 [volume_install.Interfaces]。
#I054 安装接口。
#-166 设备安装函数: DIF_INSTALLDEVICE。
#I123 进行 “STORAGE\REMOVABLEMEDIA\7&3AEEDC50&0&RM” 的完整安装。
#I121 “STORAGE\REMOVABLEMEDIA\7&3AEEDC50&0&RM” 的设备安装成功完成。
========================================================

写得有点乱,不过总算把问题搞懂了。但不排除仍然有未注意到的细节。对于注册表改写权限,编程中如何取得需要再搜集资料。

对于Vista系统似乎不太一样,需要再分析。例如:对于Enum项下,缺省不能更改,使用setacl 主动改访问权限也没有用,可能系统策略中被禁止了,但是不知道如何避免。

转自:http://hi.baidu.com/dxng/blog/item/26b7e595ddda104ed0135e47.html