好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

编写 usb 存储设备使用痕迹检测和删除工具.doc

16页
  • 卖家[上传人]:第***
  • 文档编号:33599839
  • 上传时间:2018-02-16
  • 文档格式:DOC
  • 文档大小:702.50KB
  • / 16 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 编写 USB 存储设备使用痕迹检测和删除工具(C# Windows Form 编程练习)第一节 准备知识之前一直都是用 Visual Basic .Net 来写 Windows Form 程序这几天,熟悉了一下 C# 语言的语法,想练习一下以前使用过一些 USB 存储设备使用痕迹检测和删除工具,于是想写了一个小工具来模拟这些功能USB 存储设备在使用后会在注册表留下一些记录,一般是通过检索相应的注册表键值来检查使用痕迹这些键值包括:[csharp] view plain copy print?1. HKEY_LOCAL_MACHINE\SYSTEM\ControlSetXXX(CurrentControSetXXX)\Enum\USB 2. HKEY_LOCAL_MACHINE\SYSTEM\ControlSetXXX(CurrentControSetXXX)\Enum\USBSTOR3. HKEY_LOCAL_MACHINE\SYSTEM\ControlSetXXX(CurrentControSetXXX)\Control\DeviceClasses\{53f56307-b6bf-11d0-94f2-00a0c91efb8b} 4. HKEY_LOCAL_MACHINE\SYSTEM\ControlSetXXX(CurrentControSetXXX)\Control\DeviceClasses\{a5dcbf10-6530-11d2-901f-00c04fb951ed} 其中 ControlSetXXX 和 CurrentControlSetXXX 表示的是注册表中的类似于 ControlSet001、ControlSet002、CurrentControlSet 这样的子键(CurrentControlSet 子键一般只有一个,特殊情况下可能有 CurrentControlSet001 等多个,同样的 ControlSet 一般只有 ControlSet001 和 ControlSet002 这两个,特殊情况下可能会有多个),CurrentControlSet 保存的是系统的当前的一些配置信息,而 ControlSet001 等则是对当前配置信息的备份,一般注册表都会有两个以上的备份,有的时候可能会有更多。

      在 ControlSetXXX 中的信息和 CurrentControlSet 中的信息一般都是一样的,所以在检测和删除 USB 存储设备信息时,不仅要检测 CurrentControlSet 子键,也要检测 ControlSetXXX 子键对于 Enum\USB 子键,其中存储的是曾经连接到系统的 USB 设备的一些信息,包括 USB 鼠标、键盘、光驱、、移动硬盘、摄像头、U 盘等,所以并不是所有的信息都是 USB 存储设备信息,虽然把这些信息删除并无大碍(因为删除的只是这些设备的一些连接信息和相应的驱动信息,并不是删除系统的实际驱动文件,所以系统会自动重新识别这些设备),但为了提高识别精确性,还是增加一些判断来得好些而对于 Enum\USBSTOR 子键来说,则相当于把 USB 存储设备的信息单独分离出来了,该子键下存储的信息都是曾经连接到计算机的 USB 存储设备的相关信息这些信息详细列出了该 USB 存储设备的类型、硬件 ID、设备描述、友好名称等信息对于 Control\DeviceClasses 来说,该子键下存储的是以 GUID 分类的设备信息,其中有几个是和 USB 设备有关的(它们在微软的 USB 和存储设备输入输出控制头文件 USBIODEF.H 和 NTDDSTOR.H 中定义):[csharp] view plain copy print?1. {A5DCBF10-6530-11D2-901F-00C04FB951ED} GUID_DEVINTERFACE_USB_DEVICE 2. {3ABF6F2D-71C4-462A-8A92-1E6861E6AF27} GUID_DEVINTERFACE_USB_HOST_CONTROLLER 3. {F18A0E88-C30C-11D0-8815-00A0C906BED8} GUID_DEVINTERFACE_USB_HUB 4. {53F56307-B6BF-11D0-94F2-00A0C91EFB8B} GUID_DEVINTERFACE_DISK 一般检查 {53F56307-B6BF-11D0-94F2-00A0C91EFB8B} 和 {A5DCBF10-6530-11D2-901F-00C04FB951ED} 这两个键值,其他两个由于是和 USB 控制器有关,一般可不检查。

      有的资料介绍说还要检查 MountedDevices 子键,但是由于该子键和系统的分区信息有关,一般无绝对的把握,不必进行检查和删除,到时可能会造成不必要的麻烦第二节 检测 USB 存储设备使用痕迹1、打开 Visual Studio 2010,新建一个空白方案,命名为 USBView2、在解决方案下新建一个类型为“Windows 窗体应用程序 ”的项目,命名为 USBViewer将主窗体命名为 MainForm并添加一些图标和 PNG 图像资源,美化一下程序界面资源文件包含了一个文本文件,名称为 VendorIDs.txt,保存的是 USB 设备厂家的 ID 号及厂家名称值对,用于显示在注册表中搜索到的 USB 设备的厂家名称(该文件内容来源于微软的 USBView 示例程序中的头文件 vndrlist.h,该示例程序使用 C++ 编码,需要使用 Visual Studio 2013 打开,并要求安装 Windows Driver Kit (WDK)8.1,下载链接地址 .Net 框架提供的 RegistryKey 类这需要引用 Microsoft.Win32 命名空间,注册表类都在该命名空间中。

      [csharp] view plain copy print?1. using Microsoft.Win32; 之后便是获取我们感兴趣的注册表的基项 HKEY_LOCAL_MACHINE,接着使用RegistryKey 类的 OpenSubKey 方法以只读方式打开 SYSTEM 子键[csharp] view plain copy print?1. RegistryKey hklm = Registry.LocalMachine; 2. RegistryKey systemKey = hklm.OpenSubKey("SYSTEM"); 这里顺带说一下,.Net 框架已经将注册表中的数据封装成了 Registry 类(注意 Registry 类和 RegistryKey 类是不一样的),并公布了几个只读属性,它们是:RegistryKey 类是用于在注册表中检索数据用的类以下是本文中用到的 RegistryKey 类的几个属性和方法:[csharp] view plain copy print?1. SubKeyCount // 检索当前项的子项数目。

      2. OpenSubKey(string) // 以只读方式检索 string 标识的子项 3. OpenSubKey(string, bool) // 以 bool 指定的方式检索 string 标识的子项,若 bool 值为 true,表示以可读写方式打开,否则为只读方式 4. DeleteSubKeyTree(string) // 递归删除 string 标识的子项和任何子级子项5. GetValue(string) // 检索 string 标识的名称所关联的值,若该标识的名称不存在,则返回 null 6. GetSubKeyNames() // 返回一个包含所有子项名称的字符串数组 7. Close() // 关闭该键,如果有更改,则将更改刷新到磁盘上需要注意的是若想用可写方式打开某个子项进行删除或写入操作,一定要具有相应的权限,否则会抛出 SecurityException 异常在检测阶段,由于只需要只读权限,可以使用方法 OpenSubKey(string)。

      在打开了 Local_Machine\SYSTEM 子键后,开始检索该键下类似于 ControlSetXXX 和 CurrentControlSetXXX 的键[csharp] view plain copy print?1. if (!sysKey.ToUpper().StartsWith("CONTROLSET") && 2. !sysKey.ToUpper().StartsWith("CURRENTCONTROLSET")) 3. continue; 找到这样的子键后,就在其中检索 Enum\USB、Enum\USBSTOR、Control\DeviceClasses 等子键由于 Enum\USB 子键中的信息并不都是 USB 存储设备的信息,所以要加以判断观察一下 Enum\USB 子键下的项:除了 ROOT_HUB20 外,其他键值都是以 VID_ 开始,后面跟着一个 4 位的 16 进制数,这就是厂商的 ID 号,其后的 PID_XXXX 则是厂家的产品号进一步打开这些 VID_ 打头的子键键值,可以看到更多的信息:例如 Service 表示的是该 USB 设备是由系统服务 HidUSB 进行处理的,而系统服务 HidUSB 表示的是使用 USB 协议的人体工程学输入设备,只要有 USB 类的鼠标、键盘、摄像头等设备连接到计算机,就会触发一个特定于 HID 设备的事件,HidUSB 服务会处理该事件,可以看到有 ClassGUID 这个键值,它的值 {745a17a0-74d3-11d0-b6fe-00a0c90f57da} 就是表示 Class 是 HIDClass 这样的设备。

      同样的,对于 USB 存储设备,在接入时同样会由一个服务予以处理,这个服务就是 USBSTOR 系统服务以下列出了在 Enum\USB 下和 USB 设备有关的服务名称(还有其他的相关服务,这里列出的是我的系统上有的):[csharp] view plain copy print?1. Usbccgp: USB 设备控制器服务 2. HidUsb: USB 人体学工程输入设备服务 3. USBSTOR: USB 存储设备服务 4. Usbhub: USB 设备接口服务 5. WUDFRd: 用户模式驱动框架反射器相关的服务,当连接只能等设备时,该服务会进行处理 6. VboxUsb: 安装 Oracle 的 VM VirtualBox 虚拟机软件后会出现该服务,用于处理连接到虚拟机的 USB 设备 在本文中,只检测了 USBSTOR、WUDFRd、VboxUsb 服务所处理的 USB 设备对于 Enum\USBSTOR 子键的键值,其结构和 Enum\USB 下的键值结构类似在 USB、USBSTOR 的子键键值中有 FriendlyName 这个键值,它表示的是设备的友好名称,可以作为 USB 的设备名称来显示。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.